diff options
990 files changed, 8411 insertions, 6581 deletions
diff --git a/Android.mk b/Android.mk index eaafa875b83a..30b17f5ac2c8 100644 --- a/Android.mk +++ b/Android.mk @@ -535,16 +535,23 @@ framework_docs_LOCAL_ADDITIONAL_DEPENDENCIES := \ frameworks/base/docs/knowntags.txt sample_dir := development/samples +new_sample_dir := developers/samples/android # the list here should match the list of samples included in the sdk samples package # (see development/build/sdk.atree) # remove htmlified samples for now -- samples are still available through the SDK web_docs_sample_code_flags := \ -hdf android.hasSamples 1 \ + -samplecode $(new_sample_dir)/input/gestures/BasicGestureDetect/BasicGestureDetect \ + samples/BasicGestureDetect/ "Basic Gestures" \ -samplecode $(sample_dir)/AccelerometerPlay \ samples/AccelerometerPlay "Accelerometer Play" \ -samplecode $(sample_dir)/ActionBarCompat \ - samples/ActionBarCompat "Action Bar Compatibility" + samples/ActionBarCompat "Action Bar Compatibility" \ + -samplecode $(sample_dir)/BluetoothHDP \ + samples/BluetoothHDP "Bluetooth HDP Demo" \ + -samplecode $(sample_dir)/BluetoothLeGatt \ + samples/BluetoothLeGatt "Bluetooth HDP Demo" # -samplecode $(sample_dir)/AndroidBeamDemo \ # samples/AndroidBeamDemo "Android Beam Demo" \ # -samplecode $(sample_dir)/ApiDemos \ @@ -557,8 +564,6 @@ web_docs_sample_code_flags := \ # samples/BackupRestore "Backup and Restore" \ # -samplecode $(sample_dir)/BluetoothChat \ # samples/BluetoothChat "Bluetooth Chat" \ -# -samplecode $(sample_dir)/BluetoothHDP \ -# samples/BluetoothHDP "Bluetooth HDP Demo" \ # -samplecode $(sample_dir)/BusinessCard \ # samples/BusinessCard "Business Card" \ # -samplecode $(sample_dir)/ContactManager \ diff --git a/CleanSpec.mk b/CleanSpec.mk index 215d1081e19a..8809bc7e2911 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -175,6 +175,10 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framew $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/print/IPrinterDiscoverySessionClient.*) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates/src/core/java/android/os/IBattery*) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework-base_intermediates) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/usr/idc/frameworks) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/usr/keylayout/frameworks) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/usr/keychars/frameworks) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/api/current.txt b/api/current.txt index eb3596ac21b3..5ec177104fcd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -261,7 +261,7 @@ package android { field public static final int activityCloseExitAnimation = 16842939; // 0x10100bb field public static final int activityOpenEnterAnimation = 16842936; // 0x10100b8 field public static final int activityOpenExitAnimation = 16842937; // 0x10100b9 - field public static final int addPrintersActivity = 16843747; // 0x10103e3 + field public static final int addPrintersActivity = 16843750; // 0x10103e6 field public static final int addStatesFromChildren = 16842992; // 0x10100f0 field public static final int adjustViewBounds = 16843038; // 0x101011e field public static final int alertDialogIcon = 16843605; // 0x1010355 @@ -289,14 +289,14 @@ package android { field public static final deprecated int animationResolution = 16843546; // 0x101031a field public static final int antialias = 16843034; // 0x101011a field public static final int anyDensity = 16843372; // 0x101026c - field public static final int apduServiceBanner = 16843755; // 0x10103eb + field public static final int apduServiceBanner = 16843758; // 0x10103ee field public static final int apiKey = 16843281; // 0x1010211 field public static final int author = 16843444; // 0x10102b4 field public static final int authorities = 16842776; // 0x1010018 field public static final int autoAdvanceViewId = 16843535; // 0x101030f field public static final int autoCompleteTextViewStyle = 16842859; // 0x101006b field public static final int autoLink = 16842928; // 0x10100b0 - field public static final int autoMirrored = 16843752; // 0x10103e8 + field public static final int autoMirrored = 16843755; // 0x10103eb field public static final int autoStart = 16843445; // 0x10102b5 field public static final deprecated int autoText = 16843114; // 0x101016a field public static final int autoUrlDetect = 16843404; // 0x101028c @@ -337,7 +337,7 @@ package android { field public static final int canRetrieveWindowContent = 16843653; // 0x1010385 field public static final int candidatesTextStyleSpans = 16843312; // 0x1010230 field public static final deprecated int capitalize = 16843113; // 0x1010169 - field public static final int category = 16843749; // 0x10103e5 + field public static final int category = 16843752; // 0x10103e8 field public static final int centerBright = 16842956; // 0x10100cc field public static final int centerColor = 16843275; // 0x101020b field public static final int centerDark = 16842952; // 0x10100c8 @@ -393,7 +393,7 @@ package android { field public static final int cropToPadding = 16843043; // 0x1010123 field public static final int cursorVisible = 16843090; // 0x1010152 field public static final int customNavigationLayout = 16843474; // 0x10102d2 - field public static final int customRoots = 16843751; // 0x10103e7 + field public static final int customRoots = 16843754; // 0x10103ea field public static final int customTokens = 16843579; // 0x101033b field public static final int cycles = 16843220; // 0x10101d4 field public static final int dashGap = 16843175; // 0x10101a7 @@ -487,6 +487,7 @@ package android { field public static final int fadeScrollbars = 16843434; // 0x10102aa field public static final int fadingEdge = 16842975; // 0x10100df field public static final int fadingEdgeLength = 16842976; // 0x10100e0 + field public static final int fadingMode = 16843745; // 0x10103e1 field public static final int fastScrollAlwaysVisible = 16843573; // 0x1010335 field public static final int fastScrollEnabled = 16843302; // 0x1010226 field public static final int fastScrollOverlayPosition = 16843578; // 0x101033a @@ -612,7 +613,7 @@ package android { field public static final int installLocation = 16843447; // 0x10102b7 field public static final int interpolator = 16843073; // 0x1010141 field public static final int isAlwaysSyncable = 16843571; // 0x1010333 - field public static final int isAsciiCapable = 16843750; // 0x10103e6 + field public static final int isAsciiCapable = 16843753; // 0x10103e9 field public static final int isAuxiliary = 16843647; // 0x101037f field public static final int isDefault = 16843297; // 0x1010221 field public static final int isIndicator = 16843079; // 0x1010147 @@ -845,7 +846,7 @@ package android { field public static final int prompt = 16843131; // 0x101017b field public static final int propertyName = 16843489; // 0x10102e1 field public static final int protectionLevel = 16842761; // 0x1010009 - field public static final int provideAssistData = 16843756; // 0x10103ec + field public static final int provideAssistData = 16843759; // 0x10103ef field public static final int publicKey = 16843686; // 0x10103a6 field public static final int queryActionMsg = 16843227; // 0x10101db field public static final int queryAfterZeroResults = 16843394; // 0x1010282 @@ -870,7 +871,7 @@ package android { field public static final int reqKeyboardType = 16843304; // 0x1010228 field public static final int reqNavigation = 16843306; // 0x101022a field public static final int reqTouchScreen = 16843303; // 0x1010227 - field public static final int requireDeviceUnlock = 16843754; // 0x10103ea + field public static final int requireDeviceUnlock = 16843757; // 0x10103ed field public static final int required = 16843406; // 0x101028e field public static final int requiredAccountType = 16843734; // 0x10103d6 field public static final int requiredForAllUsers = 16843728; // 0x10103d0 @@ -969,12 +970,13 @@ package android { field public static final int spinnersShown = 16843595; // 0x101034b field public static final int splitMotionEvents = 16843503; // 0x10102ef field public static final int src = 16843033; // 0x1010119 - field public static final int ssp = 16843744; // 0x10103e0 - field public static final int sspPattern = 16843746; // 0x10103e2 - field public static final int sspPrefix = 16843745; // 0x10103e1 + field public static final int ssp = 16843747; // 0x10103e3 + field public static final int sspPattern = 16843749; // 0x10103e5 + field public static final int sspPrefix = 16843748; // 0x10103e4 field public static final int stackFromBottom = 16843005; // 0x10100fd field public static final int starStyle = 16842882; // 0x1010082 field public static final int startColor = 16843165; // 0x101019d + field public static final int startDelay = 16843746; // 0x10103e2 field public static final int startOffset = 16843198; // 0x10101be field public static final deprecated int startYear = 16843132; // 0x101017c field public static final int stateNotNeeded = 16842774; // 0x1010016 @@ -1018,7 +1020,7 @@ package android { field public static final int summaryOff = 16843248; // 0x10101f0 field public static final int summaryOn = 16843247; // 0x10101ef field public static final int supportsRtl = 16843695; // 0x10103af - field public static final int supportsSwitchingToNextInputMethod = 16843753; // 0x10103e9 + field public static final int supportsSwitchingToNextInputMethod = 16843756; // 0x10103ec field public static final int supportsUploading = 16843419; // 0x101029b field public static final int switchMinWidth = 16843632; // 0x1010370 field public static final int switchPadding = 16843633; // 0x1010371 @@ -1035,7 +1037,7 @@ package android { field public static final int targetActivity = 16843266; // 0x1010202 field public static final int targetClass = 16842799; // 0x101002f field public static final int targetDescriptions = 16843680; // 0x10103a0 - field public static final int targetID = 16843740; // 0x10103dc + field public static final int targetId = 16843740; // 0x10103dc field public static final int targetPackage = 16842785; // 0x1010021 field public static final int targetSdkVersion = 16843376; // 0x1010270 field public static final int taskAffinity = 16842770; // 0x1010012 @@ -1140,6 +1142,7 @@ package android { field public static final int transformPivotX = 16843552; // 0x1010320 field public static final int transformPivotY = 16843553; // 0x1010321 field public static final int transition = 16843743; // 0x10103df + field public static final int transitionOrdering = 16843744; // 0x10103e0 field public static final int translationX = 16843554; // 0x1010322 field public static final int translationY = 16843555; // 0x1010323 field public static final int type = 16843169; // 0x10101a1 @@ -1158,7 +1161,7 @@ package android { field public static final int valueTo = 16843487; // 0x10102df field public static final int valueType = 16843488; // 0x10102e0 field public static final int variablePadding = 16843157; // 0x1010195 - field public static final int vendor = 16843748; // 0x10103e4 + field public static final int vendor = 16843751; // 0x10103e7 field public static final int versionCode = 16843291; // 0x101021b field public static final int versionName = 16843292; // 0x101021c field public static final int verticalCorrection = 16843322; // 0x101023a @@ -2349,7 +2352,6 @@ package android.animation { method public abstract long getDuration(); method public android.animation.TimeInterpolator getInterpolator(); method public java.util.ArrayList<android.animation.Animator.AnimatorListener> getListeners(); - method public java.util.ArrayList<android.animation.Animator.AnimatorPauseListener> getPauseListeners(); method public abstract long getStartDelay(); method public boolean isPaused(); method public abstract boolean isRunning(); @@ -3170,6 +3172,7 @@ package android.app { public class AppOpsManager { method public int checkOp(int, int, java.lang.String); method public int checkOpNoThrow(int, int, java.lang.String); + method public void checkPackage(int, java.lang.String); method public void finishOp(int, int, java.lang.String); method public void finishOp(int); method public int noteOp(int, int, java.lang.String); @@ -5620,8 +5623,10 @@ package android.content { method public void attachInfo(android.content.Context, android.content.pm.ProviderInfo); method public int bulkInsert(android.net.Uri, android.content.ContentValues[]); method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle); + method public android.net.Uri canonicalize(android.net.Uri); method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]); + method public final java.lang.String getCallingPackage(); method public final android.content.Context getContext(); method public final android.content.pm.PathPermission[] getPathPermissions(); method public final java.lang.String getReadPermission(); @@ -5648,6 +5653,7 @@ package android.content { method protected final void setReadPermission(java.lang.String); method protected final void setWritePermission(java.lang.String); method public void shutdown(); + method public android.net.Uri uncanonicalize(android.net.Uri); method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); } @@ -5659,6 +5665,7 @@ package android.content { method public android.content.ContentProviderResult[] applyBatch(java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException; method public int bulkInsert(android.net.Uri, android.content.ContentValues[]) throws android.os.RemoteException; method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle) throws android.os.RemoteException; + method public final android.net.Uri canonicalize(android.net.Uri) throws android.os.RemoteException; method public int delete(android.net.Uri, java.lang.String, java.lang.String[]) throws android.os.RemoteException; method public android.content.ContentProvider getLocalContentProvider(); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String) throws android.os.RemoteException; @@ -5673,6 +5680,7 @@ package android.content { method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) throws android.os.RemoteException; method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal) throws android.os.RemoteException; method public boolean release(); + method public final android.net.Uri uncanonicalize(android.net.Uri) throws android.os.RemoteException; method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException; } @@ -5738,6 +5746,7 @@ package android.content { method public final android.os.Bundle call(android.net.Uri, java.lang.String, java.lang.String, android.os.Bundle); method public deprecated void cancelSync(android.net.Uri); method public static void cancelSync(android.accounts.Account, java.lang.String); + method public final android.net.Uri canonicalize(android.net.Uri); method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]); method public static deprecated android.content.SyncInfo getCurrentSync(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); @@ -5775,6 +5784,7 @@ package android.content { method public static void setMasterSyncAutomatically(boolean); method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean); method public deprecated void startSync(android.net.Uri, android.os.Bundle); + method public final android.net.Uri uncanonicalize(android.net.Uri); method public final void unregisterContentObserver(android.database.ContentObserver); method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]); method public static void validateSyncExtrasBundle(android.os.Bundle); @@ -6373,7 +6383,6 @@ package android.content { field public static final java.lang.String ACTION_PROVIDER_CHANGED = "android.intent.action.PROVIDER_CHANGED"; field public static final java.lang.String ACTION_QUICK_CLOCK = "android.intent.action.QUICK_CLOCK"; field public static final java.lang.String ACTION_REBOOT = "android.intent.action.REBOOT"; - field public static final java.lang.String ACTION_RESTRICTIONS_PIN_CHALLENGE = "android.intent.action.RESTRICTIONS_PIN_CHALLENGE"; field public static final java.lang.String ACTION_RUN = "android.intent.action.RUN"; field public static final java.lang.String ACTION_SCREEN_OFF = "android.intent.action.SCREEN_OFF"; field public static final java.lang.String ACTION_SCREEN_ON = "android.intent.action.SCREEN_ON"; @@ -6902,59 +6911,6 @@ package android.content { method public abstract void onStatusChanged(int); } - public class UndoManager { - ctor public UndoManager(); - method public void addOperation(android.content.UndoOperation<?>, int); - method public void beginUpdate(java.lang.CharSequence); - method public int commitState(android.content.UndoOwner); - method public int countRedos(android.content.UndoOwner[]); - method public int countUndos(android.content.UndoOwner[]); - method public void endUpdate(); - method public int forgetRedos(android.content.UndoOwner[], int); - method public int forgetUndos(android.content.UndoOwner[], int); - method public int getHistorySize(); - method public android.content.UndoOperation<?> getLastOperation(int); - method public android.content.UndoOperation<?> getLastOperation(android.content.UndoOwner, int); - method public T getLastOperation(java.lang.Class<T>, android.content.UndoOwner, int); - method public android.content.UndoOwner getOwner(java.lang.String, java.lang.Object); - method public java.lang.CharSequence getRedoLabel(android.content.UndoOwner[]); - method public java.lang.CharSequence getUndoLabel(android.content.UndoOwner[]); - method public int getUpdateNestingLevel(); - method public boolean hasOperation(android.content.UndoOwner); - method public boolean isInUndo(); - method public boolean isInUpdate(); - method public int redo(android.content.UndoOwner[], int); - method public void restoreInstanceState(android.os.Parcelable); - method public android.os.Parcelable saveInstanceState(); - method public void setHistorySize(int); - method public void setUndoLabel(java.lang.CharSequence); - method public void suggestUndoLabel(java.lang.CharSequence); - method public boolean uncommitState(int, android.content.UndoOwner); - method public int undo(android.content.UndoOwner[], int); - field public static final int MERGE_MODE_ANY = 2; // 0x2 - field public static final int MERGE_MODE_NONE = 0; // 0x0 - field public static final int MERGE_MODE_UNIQUE = 1; // 0x1 - } - - public abstract class UndoOperation implements android.os.Parcelable { - ctor public UndoOperation(android.content.UndoOwner); - ctor protected UndoOperation(android.os.Parcel, java.lang.ClassLoader); - method public boolean allowMerge(); - method public abstract void commit(); - method public int describeContents(); - method public android.content.UndoOwner getOwner(); - method public DATA getOwnerData(); - method public boolean hasData(); - method public boolean matchOwner(android.content.UndoOwner); - method public abstract void redo(); - method public abstract void undo(); - } - - public class UndoOwner { - method public java.lang.Object getData(); - method public java.lang.String getTag(); - } - public class UriMatcher { ctor public UriMatcher(int); method public void addURI(java.lang.String, java.lang.String, int); @@ -10673,6 +10629,10 @@ package android.hardware { field public int width; } + public abstract interface FlushCompleteListener { + method public abstract void onFlushCompleted(android.hardware.Sensor); + } + public class GeomagneticField { ctor public GeomagneticField(float, float, float, long); method public float getDeclination(); @@ -10685,6 +10645,8 @@ package android.hardware { } public final class Sensor { + method public int getFifoMaxEventCount(); + method public int getFifoReservedEventCount(); method public float getMaximumRange(); method public int getMinDelay(); method public java.lang.String getName(); @@ -10735,6 +10697,7 @@ package android.hardware { public abstract class SensorManager { method public boolean cancelTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor); + method public boolean flush(android.hardware.Sensor); method public static float getAltitude(float, float); method public static void getAngleChange(float[], float[], float[]); method public android.hardware.Sensor getDefaultSensor(int); @@ -10748,7 +10711,9 @@ package android.hardware { method public deprecated boolean registerListener(android.hardware.SensorListener, int); method public deprecated boolean registerListener(android.hardware.SensorListener, int, int); method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int); + method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, int, int, android.hardware.FlushCompleteListener); method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, android.os.Handler); + method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, int, int, android.os.Handler, android.hardware.FlushCompleteListener); method public static boolean remapCoordinateSystem(float[], int, int, float[]); method public boolean requestTriggerSensor(android.hardware.TriggerEventListener, android.hardware.Sensor); method public deprecated void unregisterListener(android.hardware.SensorListener); @@ -11946,20 +11911,19 @@ package android.location { field public static final int TEMPORARILY_UNAVAILABLE = 1; // 0x1 } - public abstract class SettingInjectorService extends android.app.IntentService { + public abstract class SettingInjectorService extends android.app.Service { ctor public SettingInjectorService(java.lang.String); - method protected abstract android.location.SettingInjectorService.Status getStatus(); - method protected final void onHandleIntent(android.content.Intent); + method public final android.os.IBinder onBind(android.content.Intent); + method protected abstract boolean onGetEnabled(); + method protected abstract java.lang.String onGetSummary(); + method public final void onStart(android.content.Intent, int); + method public final int onStartCommand(android.content.Intent, int, int); field public static final java.lang.String ACTION_INJECTED_SETTING_CHANGED = "android.location.InjectedSettingChanged"; field public static final java.lang.String ACTION_SERVICE_INTENT = "android.location.SettingInjectorService"; field public static final java.lang.String ATTRIBUTES_NAME = "injected-location-setting"; field public static final java.lang.String META_DATA_NAME = "android.location.SettingInjectorService"; } - public static final class SettingInjectorService.Status { - ctor public SettingInjectorService.Status(java.lang.String, boolean); - } - } package android.media { @@ -12181,6 +12145,12 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioRecord); } + public final class AudioTimestamp { + ctor public AudioTimestamp(); + field public long framePosition; + field public long nanoTime; + } + public class AudioTrack { ctor public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException; @@ -12203,6 +12173,7 @@ package android.media { method public int getSampleRate(); method public int getState(); method public int getStreamType(); + method public android.media.AudioTimestamp getTimestamp(android.media.AudioTimestamp); method public void pause() throws java.lang.IllegalStateException; method public void play() throws java.lang.IllegalStateException; method public void release(); @@ -17702,7 +17673,7 @@ package android.os { field public static final int JELLY_BEAN = 16; // 0x10 field public static final int JELLY_BEAN_MR1 = 17; // 0x11 field public static final int JELLY_BEAN_MR2 = 18; // 0x12 - field public static final int KEY_LIME_PIE = 10000; // 0x2710 + field public static final int KITKAT = 10000; // 0x2710 } public final class Bundle implements java.lang.Cloneable android.os.Parcelable { @@ -18604,14 +18575,13 @@ package android.os { method public java.lang.String getUserName(); method public android.os.Bundle getUserRestrictions(); method public android.os.Bundle getUserRestrictions(android.os.UserHandle); - method public boolean hasRestrictionsPin(); method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); + method public boolean setRestrictionsChallenge(java.lang.String); method public void setUserRestriction(java.lang.String, boolean); method public void setUserRestrictions(android.os.Bundle); method public void setUserRestrictions(android.os.Bundle, android.os.UserHandle); - field public static final java.lang.String DISALLOW_APP_RESTRICTIONS = "no_app_restrictions"; field public static final java.lang.String DISALLOW_CONFIG_BLUETOOTH = "no_config_bluetooth"; field public static final java.lang.String DISALLOW_CONFIG_CREDENTIALS = "no_config_credentials"; field public static final java.lang.String DISALLOW_CONFIG_WIFI = "no_config_wifi"; @@ -19051,39 +19021,21 @@ package android.print { method public void clear(); method public int describeContents(); method public int getColorMode(); - method public int getDuplexMode(); - method public int getFittingMode(); - method public android.print.PrintAttributes.Tray getInputTray(); method public android.print.PrintAttributes.Margins getMargins(); method public android.print.PrintAttributes.MediaSize getMediaSize(); - method public int getOrientation(); - method public android.print.PrintAttributes.Tray getOutputTray(); method public android.print.PrintAttributes.Resolution getResolution(); method public void writeToParcel(android.os.Parcel, int); field public static final int COLOR_MODE_COLOR = 2; // 0x2 field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1 field public static final android.os.Parcelable.Creator CREATOR; - field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2 - field public static final int DUPLEX_MODE_NONE = 1; // 0x1 - field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4 - field public static final int FITTING_MODE_NONE = 1; // 0x1 - field public static final int FITTING_MODE_SCALE_TO_FILL = 4; // 0x4 - field public static final int FITTING_MODE_SCALE_TO_FIT = 2; // 0x2 - field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2 - field public static final int ORIENTATION_PORTRAIT = 1; // 0x1 } public static final class PrintAttributes.Builder { ctor public PrintAttributes.Builder(); method public android.print.PrintAttributes create(); method public android.print.PrintAttributes.Builder setColorMode(int); - method public android.print.PrintAttributes.Builder setDuplexMode(int); - method public android.print.PrintAttributes.Builder setFittingMode(int); - method public android.print.PrintAttributes.Builder setInputTray(android.print.PrintAttributes.Tray); method public android.print.PrintAttributes.Builder setMargins(android.print.PrintAttributes.Margins); method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize); - method public android.print.PrintAttributes.Builder setOrientation(int); - method public android.print.PrintAttributes.Builder setOutputTray(android.print.PrintAttributes.Tray); method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution); } @@ -19098,66 +19050,62 @@ package android.print { public static final class PrintAttributes.MediaSize { ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int); - method public static android.print.PrintAttributes.MediaSize createMediaSize(android.content.pm.PackageManager, int); + method public android.print.PrintAttributes.MediaSize asLandscape(); + method public android.print.PrintAttributes.MediaSize asPortrait(); method public int getHeightMils(); method public java.lang.String getId(); - method public java.lang.String getLabel(); + method public java.lang.String getLabel(android.content.pm.PackageManager); method public int getWidthMils(); - field public static final int ISO_A0 = 1; // 0x1 - field public static final int ISO_A1 = 2; // 0x2 - field public static final int ISO_A10 = 11; // 0xb - field public static final int ISO_A2 = 3; // 0x3 - field public static final int ISO_A3 = 4; // 0x4 - field public static final int ISO_A4 = 5; // 0x5 - field public static final int ISO_A5 = 6; // 0x6 - field public static final int ISO_A6 = 7; // 0x7 - field public static final int ISO_A7 = 8; // 0x8 - field public static final int ISO_A8 = 9; // 0x9 - field public static final int ISO_A9 = 10; // 0xa - field public static final int ISO_B0 = 100; // 0x64 - field public static final int ISO_B1 = 101; // 0x65 - field public static final int ISO_B10 = 110; // 0x6e - field public static final int ISO_B2 = 102; // 0x66 - field public static final int ISO_B3 = 103; // 0x67 - field public static final int ISO_B4 = 104; // 0x68 - field public static final int ISO_B5 = 105; // 0x69 - field public static final int ISO_B6 = 106; // 0x6a - field public static final int ISO_B7 = 107; // 0x6b - field public static final int ISO_B8 = 108; // 0x6c - field public static final int ISO_B9 = 109; // 0x6d - field public static final int ISO_C0 = 200; // 0xc8 - field public static final int ISO_C1 = 201; // 0xc9 - field public static final int ISO_C10 = 210; // 0xd2 - field public static final int ISO_C2 = 202; // 0xca - field public static final int ISO_C3 = 203; // 0xcb - field public static final int ISO_C4 = 204; // 0xcc - field public static final int ISO_C5 = 205; // 0xcd - field public static final int ISO_C6 = 206; // 0xce - field public static final int ISO_C7 = 207; // 0xcf - field public static final int ISO_C8 = 208; // 0xd0 - field public static final int ISO_C9 = 209; // 0xd1 - field public static final int NA_GOVT_LETTER = 301; // 0x12d - field public static final int NA_JUNIOR_LEGAL = 303; // 0x12f - field public static final int NA_LEDGER = 304; // 0x130 - field public static final int NA_LEGAL = 302; // 0x12e - field public static final int NA_LETTER = 300; // 0x12c - field public static final int NA_TBLOID = 305; // 0x131 + method public boolean isPortrait(); + field public static final android.print.PrintAttributes.MediaSize ISO_A0; + field public static final android.print.PrintAttributes.MediaSize ISO_A1; + field public static final android.print.PrintAttributes.MediaSize ISO_A10; + field public static final android.print.PrintAttributes.MediaSize ISO_A2; + field public static final android.print.PrintAttributes.MediaSize ISO_A3; + field public static final android.print.PrintAttributes.MediaSize ISO_A4; + field public static final android.print.PrintAttributes.MediaSize ISO_A5; + field public static final android.print.PrintAttributes.MediaSize ISO_A6; + field public static final android.print.PrintAttributes.MediaSize ISO_A7; + field public static final android.print.PrintAttributes.MediaSize ISO_A8; + field public static final android.print.PrintAttributes.MediaSize ISO_A9; + field public static final android.print.PrintAttributes.MediaSize ISO_B0; + field public static final android.print.PrintAttributes.MediaSize ISO_B1; + field public static final android.print.PrintAttributes.MediaSize ISO_B10; + field public static final android.print.PrintAttributes.MediaSize ISO_B2; + field public static final android.print.PrintAttributes.MediaSize ISO_B3; + field public static final android.print.PrintAttributes.MediaSize ISO_B4; + field public static final android.print.PrintAttributes.MediaSize ISO_B5; + field public static final android.print.PrintAttributes.MediaSize ISO_B6; + field public static final android.print.PrintAttributes.MediaSize ISO_B7; + field public static final android.print.PrintAttributes.MediaSize ISO_B8; + field public static final android.print.PrintAttributes.MediaSize ISO_B9; + field public static final android.print.PrintAttributes.MediaSize ISO_C0; + field public static final android.print.PrintAttributes.MediaSize ISO_C1; + field public static final android.print.PrintAttributes.MediaSize ISO_C10; + field public static final android.print.PrintAttributes.MediaSize ISO_C2; + field public static final android.print.PrintAttributes.MediaSize ISO_C3; + field public static final android.print.PrintAttributes.MediaSize ISO_C4; + field public static final android.print.PrintAttributes.MediaSize ISO_C5; + field public static final android.print.PrintAttributes.MediaSize ISO_C6; + field public static final android.print.PrintAttributes.MediaSize ISO_C7; + field public static final android.print.PrintAttributes.MediaSize ISO_C8; + field public static final android.print.PrintAttributes.MediaSize ISO_C9; + field public static final android.print.PrintAttributes.MediaSize NA_GOVT_LETTER; + field public static final android.print.PrintAttributes.MediaSize NA_JUNIOR_LEGAL; + field public static final android.print.PrintAttributes.MediaSize NA_LEDGER; + field public static final android.print.PrintAttributes.MediaSize NA_LEGAL; + field public static final android.print.PrintAttributes.MediaSize NA_LETTER; + field public static final android.print.PrintAttributes.MediaSize NA_TBLOID; } public static final class PrintAttributes.Resolution { ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int); method public int getHorizontalDpi(); method public java.lang.String getId(); - method public java.lang.String getLabel(); + method public java.lang.String getLabel(android.content.pm.PackageManager); method public int getVerticalDpi(); } - public static final class PrintAttributes.Tray { - ctor public PrintAttributes.Tray(java.lang.String, java.lang.String); - method public java.lang.String getId(); - method public java.lang.String getLabel(); - } - public abstract class PrintDocumentAdapter { ctor public PrintDocumentAdapter(); method public void onFinish(); @@ -19181,34 +19129,22 @@ package android.print { public final class PrintDocumentInfo implements android.os.Parcelable { method public int describeContents(); - method public int getColorMode(); method public int getContentType(); method public long getDataSize(); - method public int getFittingMode(); - method public android.print.PrintAttributes.Margins getMargins(); - method public android.print.PrintAttributes.MediaSize getMediaSize(); method public java.lang.String getName(); - method public int getOrientation(); method public int getPageCount(); method public void writeToParcel(android.os.Parcel, int); field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0 field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1 field public static final int CONTENT_TYPE_UNKNOWN = -1; // 0xffffffff field public static final android.os.Parcelable.Creator CREATOR; - field public static final android.print.PrintAttributes.MediaSize MEDIA_SIZE_UNKNOWN; field public static final int PAGE_COUNT_UNKNOWN = -1; // 0xffffffff } public static final class PrintDocumentInfo.Builder { - ctor public PrintDocumentInfo.Builder(java.lang.String, android.print.PrintAttributes); ctor public PrintDocumentInfo.Builder(java.lang.String); method public android.print.PrintDocumentInfo create(); - method public android.print.PrintDocumentInfo.Builder setColorMode(int); method public android.print.PrintDocumentInfo.Builder setContentType(int); - method public android.print.PrintDocumentInfo.Builder setFittingMode(int); - method public android.print.PrintDocumentInfo.Builder setMargins(android.print.PrintAttributes.Margins); - method public android.print.PrintDocumentInfo.Builder setMediaSize(android.print.PrintAttributes.MediaSize); - method public android.print.PrintDocumentInfo.Builder setOrientation(int); method public android.print.PrintDocumentInfo.Builder setPageCount(int); } @@ -19255,13 +19191,8 @@ package android.print { method public int describeContents(); method public int getColorModes(); method public void getDefaults(android.print.PrintAttributes); - method public int getDuplexModes(); - method public int getFittingModes(); - method public java.util.List<android.print.PrintAttributes.Tray> getInputTrays(); method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes(); method public android.print.PrintAttributes.Margins getMinMargins(); - method public int getOrientations(); - method public java.util.List<android.print.PrintAttributes.Tray> getOutputTrays(); method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator CREATOR; @@ -19269,16 +19200,11 @@ package android.print { public static final class PrinterCapabilitiesInfo.Builder { ctor public PrinterCapabilitiesInfo.Builder(android.print.PrinterId); - method public android.print.PrinterCapabilitiesInfo.Builder addInputTray(android.print.PrintAttributes.Tray, boolean); method public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(android.print.PrintAttributes.MediaSize, boolean); - method public android.print.PrinterCapabilitiesInfo.Builder addOutputTray(android.print.PrintAttributes.Tray, boolean); method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean); method public android.print.PrinterCapabilitiesInfo create(); method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int); - method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int); - method public android.print.PrinterCapabilitiesInfo.Builder setFittingModes(int, int); method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins, android.print.PrintAttributes.Margins); - method public android.print.PrinterCapabilitiesInfo.Builder setOrientations(int, int); } public final class PrinterId implements android.os.Parcelable { @@ -19399,6 +19325,7 @@ package android.printservice { ctor public PrinterDiscoverySession(); method public final void addPrinters(java.util.List<android.print.PrinterInfo>); method public final java.util.List<android.print.PrinterInfo> getPrinters(); + method public final java.util.List<android.print.PrinterId> getTrackedPrinters(); method public final boolean isDestroyed(); method public final boolean isPrinterDiscoveryStarted(); method public abstract void onDestroy(); @@ -19408,7 +19335,6 @@ package android.printservice { method public abstract void onStopPrinterStateTracking(android.print.PrinterId); method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>); method public final void removePrinters(java.util.List<android.print.PrinterId>); - method public final void updatePrinters(java.util.List<android.print.PrinterInfo>); } } @@ -20845,6 +20771,7 @@ package android.provider { method public static android.net.Uri buildChildDocumentsUri(java.lang.String, java.lang.String); method public static android.net.Uri buildDocumentUri(java.lang.String, java.lang.String); method public static android.net.Uri buildRecentDocumentsUri(java.lang.String, java.lang.String); + method public static android.net.Uri buildRootUri(java.lang.String, java.lang.String); method public static android.net.Uri buildRootsUri(java.lang.String); method public static android.net.Uri buildSearchDocumentsUri(java.lang.String, java.lang.String, java.lang.String); method public static android.net.Uri createDocument(android.content.ContentResolver, android.net.Uri, java.lang.String, java.lang.String); @@ -20869,6 +20796,7 @@ package android.provider { field public static final java.lang.String COLUMN_SIZE = "_size"; field public static final java.lang.String COLUMN_SUMMARY = "summary"; field public static final int FLAG_DIR_PREFERS_GRID = 32; // 0x20 + field public static final int FLAG_DIR_PREFERS_LAST_MODIFIED = 64; // 0x40 field public static final int FLAG_DIR_SUPPORTS_CREATE = 8; // 0x8 field public static final int FLAG_DIR_SUPPORTS_SEARCH = 16; // 0x10 field public static final int FLAG_SUPPORTS_DELETE = 4; // 0x4 @@ -20882,17 +20810,15 @@ package android.provider { field public static final java.lang.String COLUMN_DOCUMENT_ID = "document_id"; field public static final java.lang.String COLUMN_FLAGS = "flags"; field public static final java.lang.String COLUMN_ICON = "icon"; + field public static final java.lang.String COLUMN_MIME_TYPES = "mime_types"; field public static final java.lang.String COLUMN_ROOT_ID = "root_id"; field public static final java.lang.String COLUMN_ROOT_TYPE = "root_type"; field public static final java.lang.String COLUMN_SUMMARY = "summary"; field public static final java.lang.String COLUMN_TITLE = "title"; field public static final int FLAG_ADVANCED = 4; // 0x4 field public static final int FLAG_LOCAL_ONLY = 2; // 0x2 - field public static final int FLAG_PROVIDES_AUDIO = 8; // 0x8 - field public static final int FLAG_PROVIDES_IMAGES = 32; // 0x20 - field public static final int FLAG_PROVIDES_VIDEO = 16; // 0x10 field public static final int FLAG_SUPPORTS_CREATE = 1; // 0x1 - field public static final int FLAG_SUPPORTS_RECENTS = 64; // 0x40 + field public static final int FLAG_SUPPORTS_RECENTS = 8; // 0x8 field public static final int ROOT_TYPE_DEVICE = 3; // 0x3 field public static final int ROOT_TYPE_SERVICE = 1; // 0x1 field public static final int ROOT_TYPE_SHORTCUT = 2; // 0x2 @@ -21290,6 +21216,7 @@ package android.provider { field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS"; field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS"; field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS"; + field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS"; field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS"; field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS"; field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS"; @@ -21892,6 +21819,7 @@ package android.renderscript { method public static android.renderscript.Element U8_2(android.renderscript.RenderScript); method public static android.renderscript.Element U8_3(android.renderscript.RenderScript); method public static android.renderscript.Element U8_4(android.renderscript.RenderScript); + method public static android.renderscript.Element YUV(android.renderscript.RenderScript); method public static android.renderscript.Element createPixel(android.renderscript.RenderScript, android.renderscript.Element.DataType, android.renderscript.Element.DataKind); method public static android.renderscript.Element createVector(android.renderscript.RenderScript, android.renderscript.Element.DataType, int); method public int getBytesSize(); @@ -22884,6 +22812,26 @@ package android.speech { } +package android.speech.hotword { + + public abstract class HotwordRecognitionService extends android.app.Service { + ctor public HotwordRecognitionService(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract void onStartHotwordRecognition(android.speech.hotword.HotwordRecognitionService.Callback); + method public abstract void onStopHotwordRecognition(); + field public static final java.lang.String SERVICE_INTERFACE = "android.speech.hotword.HotwordRecognitionService"; + } + + public static class HotwordRecognitionService.Callback { + method public void onError(int) throws android.os.RemoteException; + method public void onHotwordEvent(int, android.os.Bundle) throws android.os.RemoteException; + method public void onHotwordRecognitionStarted() throws android.os.RemoteException; + method public void onHotwordRecognitionStopped() throws android.os.RemoteException; + method public void onHotwordRecognized(android.content.Intent) throws android.os.RemoteException; + } + +} + package android.speech.tts { public abstract interface SynthesisCallback { @@ -25536,6 +25484,119 @@ package android.text.util { } +package android.transition { + + public class AutoTransition extends android.transition.TransitionSet { + ctor public AutoTransition(); + } + + public class ChangeBounds extends android.transition.Transition { + ctor public ChangeBounds(); + method public void captureEndValues(android.transition.TransitionValues); + method public void captureStartValues(android.transition.TransitionValues); + method public void setReparent(boolean); + method public void setResizeClip(boolean); + } + + public class Fade extends android.transition.Visibility { + ctor public Fade(); + ctor public Fade(int); + field public static final int IN = 1; // 0x1 + field public static final int OUT = 2; // 0x2 + } + + public final class Scene { + ctor public Scene(android.view.ViewGroup); + ctor public Scene(android.view.ViewGroup, android.view.ViewGroup); + method public void enter(); + method public void exit(); + method public static android.transition.Scene getSceneForLayout(android.view.ViewGroup, int, android.content.Context); + method public android.view.ViewGroup getSceneRoot(); + method public void setEnterAction(java.lang.Runnable); + method public void setExitAction(java.lang.Runnable); + } + + public abstract class Transition implements java.lang.Cloneable { + ctor public Transition(); + method public android.transition.Transition addListener(android.transition.Transition.TransitionListener); + method public android.transition.Transition addTarget(android.view.View); + method public android.transition.Transition addTargetId(int); + method public abstract void captureEndValues(android.transition.TransitionValues); + method public abstract void captureStartValues(android.transition.TransitionValues); + method public android.transition.Transition clone(); + method public android.animation.Animator createAnimator(android.view.ViewGroup, android.transition.TransitionValues, android.transition.TransitionValues); + method public long getDuration(); + method public android.animation.TimeInterpolator getInterpolator(); + method public java.lang.String getName(); + method public long getStartDelay(); + method public java.util.List<java.lang.Integer> getTargetIds(); + method public java.util.List<android.view.View> getTargets(); + method public java.lang.String[] getTransitionProperties(); + method public android.transition.TransitionValues getTransitionValues(android.view.View, boolean); + method public android.transition.Transition removeListener(android.transition.Transition.TransitionListener); + method public android.transition.Transition removeTarget(android.view.View); + method public android.transition.Transition removeTargetId(int); + method public android.transition.Transition setDuration(long); + method public android.transition.Transition setInterpolator(android.animation.TimeInterpolator); + method public android.transition.Transition setStartDelay(long); + } + + public static abstract interface Transition.TransitionListener { + method public abstract void onTransitionCancel(android.transition.Transition); + method public abstract void onTransitionEnd(android.transition.Transition); + method public abstract void onTransitionPause(android.transition.Transition); + method public abstract void onTransitionResume(android.transition.Transition); + method public abstract void onTransitionStart(android.transition.Transition); + } + + public class TransitionInflater { + method public static android.transition.TransitionInflater from(android.content.Context); + method public android.transition.Transition inflateTransition(int); + method public android.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup); + } + + public class TransitionManager { + ctor public TransitionManager(); + method public static void beginDelayedTransition(android.view.ViewGroup); + method public static void beginDelayedTransition(android.view.ViewGroup, android.transition.Transition); + method public static android.transition.Transition getDefaultTransition(); + method public static void go(android.transition.Scene); + method public static void go(android.transition.Scene, android.transition.Transition); + method public void setDefaultTransition(android.transition.Transition); + method public void setTransition(android.transition.Scene, android.transition.Transition); + method public void setTransition(android.transition.Scene, android.transition.Scene, android.transition.Transition); + method public void transitionTo(android.transition.Scene); + } + + public class TransitionSet extends android.transition.Transition { + ctor public TransitionSet(); + method public android.transition.TransitionSet addTransition(android.transition.Transition); + method public void captureEndValues(android.transition.TransitionValues); + method public void captureStartValues(android.transition.TransitionValues); + method public int getOrdering(); + method public android.transition.TransitionSet removeTransition(android.transition.Transition); + method public android.transition.TransitionSet setOrdering(int); + field public static final int ORDERING_SEQUENTIAL = 1; // 0x1 + field public static final int ORDERING_TOGETHER = 0; // 0x0 + } + + public class TransitionValues { + ctor public TransitionValues(); + field public final java.util.Map values; + field public android.view.View view; + } + + public abstract class Visibility extends android.transition.Transition { + ctor public Visibility(); + method public void captureEndValues(android.transition.TransitionValues); + method public void captureStartValues(android.transition.TransitionValues); + method public boolean isVisible(android.transition.TransitionValues); + method public android.animation.Animator onAppear(android.view.ViewGroup, android.transition.TransitionValues, int, android.transition.TransitionValues, int); + method public android.animation.Animator onDisappear(android.view.ViewGroup, android.transition.TransitionValues, int, android.transition.TransitionValues, int); + } + +} + package android.util { public class AndroidException extends java.lang.Exception { @@ -27369,6 +27430,7 @@ package android.view { method public boolean canScrollHorizontally(int); method public boolean canScrollVertically(int); method public void cancelLongPress(); + method public final void cancelPendingInputEvents(); method public boolean checkInputConnectionProxy(android.view.View); method public void clearAnimation(); method public void clearFocus(); @@ -27432,7 +27494,6 @@ package android.view { method public java.lang.CharSequence getContentDescription(); method public final android.content.Context getContext(); method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo(); - method public android.view.transition.Scene getCurrentScene(); method public static int getDefaultSize(int, int); method public android.view.Display getDisplay(); method public final int[] getDrawableState(); @@ -27597,6 +27658,7 @@ package android.view { method protected void onAnimationEnd(); method protected void onAnimationStart(); method protected void onAttachedToWindow(); + method public void onCancelPendingInputEvents(); method public boolean onCheckIsTextEditor(); method protected void onConfigurationChanged(android.content.res.Configuration); method protected void onCreateContextMenu(android.view.ContextMenu); @@ -29709,155 +29771,6 @@ package android.view.textservice { } -package android.view.transition { - - public class AutoTransition extends android.view.transition.TransitionGroup { - ctor public AutoTransition(); - } - - public class Crossfade extends android.view.transition.Transition { - ctor public Crossfade(); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - method public int getFadeBehavior(); - method public int getResizeBehavior(); - method public void setFadeBehavior(int); - method public void setResizeBehavior(int); - field public static final int FADE_BEHAVIOR_CROSSFADE = 0; // 0x0 - field public static final int FADE_BEHAVIOR_OUT_IN = 2; // 0x2 - field public static final int FADE_BEHAVIOR_REVEAL = 1; // 0x1 - field public static final int RESIZE_BEHAVIOR_NONE = 0; // 0x0 - field public static final int RESIZE_BEHAVIOR_SCALE = 1; // 0x1 - } - - public class Fade extends android.view.transition.Visibility { - ctor public Fade(); - ctor public Fade(int); - field public static final int IN = 1; // 0x1 - field public static final int OUT = 2; // 0x2 - } - - public class Move extends android.view.transition.Transition { - ctor public Move(); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - method public void setReparent(boolean); - method public void setResizeClip(boolean); - } - - public class Recolor extends android.view.transition.Transition { - ctor public Recolor(); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - } - - public class Rotate extends android.view.transition.Transition { - ctor public Rotate(); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - } - - public final class Scene { - ctor public Scene(android.view.ViewGroup); - ctor public Scene(android.view.ViewGroup, int, android.content.Context); - ctor public Scene(android.view.ViewGroup, android.view.ViewGroup); - method public void enter(); - method public void exit(); - method public android.view.ViewGroup getSceneRoot(); - method public void setEnterAction(java.lang.Runnable); - method public void setExitAction(java.lang.Runnable); - } - - public class Slide extends android.view.transition.Visibility { - ctor public Slide(); - } - - public class TextChange extends android.view.transition.Transition { - ctor public TextChange(); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - method public void setChangeBehavior(int); - field public static final int CHANGE_BEHAVIOR_IN = 2; // 0x2 - field public static final int CHANGE_BEHAVIOR_KEEP = 0; // 0x0 - field public static final int CHANGE_BEHAVIOR_OUT = 1; // 0x1 - field public static final int CHANGE_BEHAVIOR_OUT_IN = 3; // 0x3 - } - - public abstract class Transition implements java.lang.Cloneable { - ctor public Transition(); - method public void addListener(android.view.transition.Transition.TransitionListener); - method protected void cancel(); - method protected abstract void captureValues(android.view.transition.TransitionValues, boolean); - method public android.view.transition.Transition clone(); - method public long getDuration(); - method public android.animation.TimeInterpolator getInterpolator(); - method public java.util.ArrayList<android.view.transition.Transition.TransitionListener> getListeners(); - method public java.lang.String getName(); - method public long getStartDelay(); - method public int[] getTargetIds(); - method public android.view.View[] getTargets(); - method public java.lang.String[] getTransitionProperties(); - method protected android.view.transition.TransitionValues getTransitionValues(android.view.View, boolean); - method protected android.animation.Animator play(android.view.ViewGroup, android.view.transition.TransitionValues, android.view.transition.TransitionValues); - method public void removeListener(android.view.transition.Transition.TransitionListener); - method public android.view.transition.Transition setDuration(long); - method public void setInterpolator(android.animation.TimeInterpolator); - method public void setStartDelay(long); - method public android.view.transition.Transition setTargetIds(int...); - method public android.view.transition.Transition setTargets(android.view.View...); - } - - public static abstract interface Transition.TransitionListener { - method public abstract void onTransitionCancel(android.view.transition.Transition); - method public abstract void onTransitionEnd(android.view.transition.Transition); - method public abstract void onTransitionPause(android.view.transition.Transition); - method public abstract void onTransitionResume(android.view.transition.Transition); - method public abstract void onTransitionStart(android.view.transition.Transition); - } - - public class TransitionGroup extends android.view.transition.Transition { - ctor public TransitionGroup(); - ctor public TransitionGroup(int); - method public void addTransitions(android.view.transition.Transition...); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - method public void removeTransition(android.view.transition.Transition); - method public void setOrdering(int); - field public static final int SEQUENTIALLY = 1; // 0x1 - field public static final int TOGETHER = 0; // 0x0 - } - - public class TransitionInflater { - method public static android.view.transition.TransitionInflater from(android.content.Context); - method public android.view.transition.Scene inflateScene(int, android.view.ViewGroup); - method public android.view.transition.Transition inflateTransition(int); - method public android.view.transition.TransitionManager inflateTransitionManager(int, android.view.ViewGroup); - } - - public class TransitionManager { - ctor public TransitionManager(); - method public static void beginDelayedTransition(android.view.ViewGroup, android.view.transition.Transition); - method public android.view.transition.Transition getDefaultTransition(); - method public static void go(android.view.transition.Scene); - method public static void go(android.view.transition.Scene, android.view.transition.Transition); - method public static void go(android.view.ViewGroup, java.lang.Runnable); - method public static void go(android.view.ViewGroup, java.lang.Runnable, android.view.transition.Transition); - method public void setDefaultTransition(android.view.transition.Transition); - method public void setTransition(android.view.transition.Scene, android.view.transition.Transition); - method public void setTransition(android.view.transition.Scene, android.view.transition.Scene, android.view.transition.Transition); - method public void transitionTo(android.view.transition.Scene); - } - - public class TransitionValues { - ctor public TransitionValues(); - field public final java.util.Map values; - field public android.view.View view; - } - - public abstract class Visibility extends android.view.transition.Transition { - ctor public Visibility(); - method protected android.animation.Animator appear(android.view.ViewGroup, android.view.transition.TransitionValues, int, android.view.transition.TransitionValues, int); - method protected void captureValues(android.view.transition.TransitionValues, boolean); - method protected android.animation.Animator disappear(android.view.ViewGroup, android.view.transition.TransitionValues, int, android.view.transition.TransitionValues, int); - method public boolean isVisible(android.view.transition.TransitionValues); - } - -} - package android.webkit { public class ConsoleMessage { @@ -32489,7 +32402,6 @@ package android.widget { method public int getTotalPaddingTop(); method public final android.text.method.TransformationMethod getTransformationMethod(); method public android.graphics.Typeface getTypeface(); - method public final android.content.UndoManager getUndoManager(); method public android.text.style.URLSpan[] getUrls(); method public boolean hasSelection(); method public boolean isCursorVisible(); @@ -32588,7 +32500,6 @@ package android.widget { method public final void setTransformationMethod(android.text.method.TransformationMethod); method public void setTypeface(android.graphics.Typeface, int); method public void setTypeface(android.graphics.Typeface); - method public final void setUndoManager(android.content.UndoManager, java.lang.String); method public void setWidth(int); } diff --git a/cmds/am/am b/cmds/am/am index c82363498242..1d426bc8c8e1 100755 --- a/cmds/am/am +++ b/cmds/am/am @@ -1,3 +1,5 @@ +#!/system/bin/sh +# # Script to start "am" on the device, which has a very rudimentary # shell. # diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java index 89accbbdc88e..129e52c5c6af 100644 --- a/core/java/android/animation/Animator.java +++ b/core/java/android/animation/Animator.java @@ -280,19 +280,9 @@ public abstract class Animator implements Cloneable { } /** - * Gets the set of {@link AnimatorPauseListener} objects that are currently - * listening for pause/resume events on this animator. - * - * @return ArrayList<AnimatorListener> The set of pause listeners. - */ - public ArrayList<AnimatorPauseListener> getPauseListeners() { - return mPauseListeners; - } - - /** - * Removes all listeners from this object. This is equivalent to calling - * {@link #getListeners()} and {@link #getPauseListeners()} followed by calling - * {@link ArrayList#clear()} on the returned lists of listeners. + * Removes all {@link #addListener(android.animation.Animator.AnimatorListener) listeners} + * and {@link #addPauseListener(android.animation.Animator.AnimatorPauseListener) + * pauseListeners} from this object. */ public void removeAllListeners() { if (mListeners != null) { diff --git a/core/java/android/animation/PropertyValuesHolder.java b/core/java/android/animation/PropertyValuesHolder.java index 5b1a7cf209ff..43014adc5300 100644 --- a/core/java/android/animation/PropertyValuesHolder.java +++ b/core/java/android/animation/PropertyValuesHolder.java @@ -636,7 +636,7 @@ public class PropertyValuesHolder implements Cloneable { } /** - * The TypeEvaluator will the automatically determined based on the type of values + * The TypeEvaluator will be automatically determined based on the type of values * supplied to PropertyValuesHolder. The evaluator can be manually set, however, if so * desired. This may be important in cases where either the type of the values supplied * do not match the way that they should be interpolated between, or if the values diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index e02410ac55bf..57686a455a7e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -17,6 +17,7 @@ package android.app; import android.util.ArrayMap; +import android.util.SuperNotCalledException; import com.android.internal.app.ActionBarImpl; import com.android.internal.policy.PolicyManager; @@ -3436,6 +3437,12 @@ public class Activity extends ContextThemeWrapper // activity is finished, no matter what happens to it. mStartedActivity = true; } + + final View decor = mWindow != null ? mWindow.peekDecorView() : null; + if (decor != null) { + decor.cancelPendingInputEvents(); + } + // TODO Consider clearing/flushing other event sources and events for child windows. } else { if (options != null) { mParent.startActivityFromChild(this, intent, requestCode, options); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index e6960b36f663..018fbe01decb 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -76,6 +76,7 @@ import android.util.Log; import android.util.LogPrinter; import android.util.PrintWriterPrinter; import android.util.Slog; +import android.util.SuperNotCalledException; import android.view.Display; import android.view.HardwareRenderer; import android.view.View; @@ -116,12 +117,6 @@ import libcore.io.IoUtils; import dalvik.system.CloseGuard; -final class SuperNotCalledException extends AndroidRuntimeException { - public SuperNotCalledException(String msg) { - super(msg); - } -} - final class RemoteServiceException extends AndroidRuntimeException { public RemoteServiceException(String msg) { super(msg); diff --git a/core/java/android/app/AlarmManager.java b/core/java/android/app/AlarmManager.java index 1a568260996c..5c3a3e5cde6c 100644 --- a/core/java/android/app/AlarmManager.java +++ b/core/java/android/app/AlarmManager.java @@ -101,7 +101,7 @@ public class AlarmManager mService = service; final int sdkVersion = ctx.getApplicationInfo().targetSdkVersion; - mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KEY_LIME_PIE); + mAlwaysExact = (sdkVersion < Build.VERSION_CODES.KITKAT); } private long legacyExactLength() { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index fe09ce1988e8..19a028d39ae7 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -616,6 +616,23 @@ public class AppOpsManager { } /** + * Do a quick check to validate if a package name belongs to a UID. + * + * @throws SecurityException if the package name doesn't belong to the given + * UID, or if ownership cannot be verified. + */ + public void checkPackage(int uid, String packageName) { + try { + if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) { + throw new SecurityException( + "Package " + packageName + " does not belong to " + uid); + } + } catch (RemoteException e) { + throw new SecurityException("Unable to verify package ownership", e); + } + } + + /** * Make note of an application performing an operation. Note that you must pass * in both the uid and name of the application to be checked; this function will verify * that these two match, and if not, return {@link #MODE_IGNORED}. If this call diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index f10290d2c3b8..e776a98a029b 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -710,7 +710,7 @@ class ContextImpl extends Context { @Override public SharedPreferences getSharedPreferences(String name, int mode) { SharedPreferencesImpl sp; - synchronized (mSync) { + synchronized (ContextImpl.class) { if (sSharedPrefs == null) { sSharedPrefs = new ArrayMap<String, ArrayMap<String, SharedPreferencesImpl>>(); } @@ -726,7 +726,7 @@ class ContextImpl extends Context { // name. This happened to work because when we generated the file name // we would stringify it to "null.xml". Nice. if (mPackageInfo.getApplicationInfo().targetSdkVersion < - Build.VERSION_CODES.KEY_LIME_PIE) { + Build.VERSION_CODES.KITKAT) { if (name == null) { name = "null"; } @@ -1453,7 +1453,7 @@ class ContextImpl extends Context { public ComponentName startServiceAsUser(Intent service, UserHandle user) { try { if (service.getComponent() == null && service.getPackage() == null) { - if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KEY_LIME_PIE) { + if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KITKAT) { IllegalArgumentException ex = new IllegalArgumentException( "Service Intent must be explicit: " + service); Log.e(TAG, "This will become an error", ex); @@ -1485,7 +1485,7 @@ class ContextImpl extends Context { public boolean stopServiceAsUser(Intent service, UserHandle user) { try { if (service.getComponent() == null && service.getPackage() == null) { - if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KEY_LIME_PIE) { + if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KITKAT) { IllegalArgumentException ex = new IllegalArgumentException( "Service Intent must be explicit: " + service); Log.e(TAG, "This will become an error", ex); @@ -1528,7 +1528,7 @@ class ContextImpl extends Context { throw new RuntimeException("Not supported in system context"); } if (service.getComponent() == null && service.getPackage() == null) { - if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KEY_LIME_PIE) { + if (getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.KITKAT) { IllegalArgumentException ex = new IllegalArgumentException( "Service Intent must be explicit: " + service); Log.e(TAG, "This will become an error", ex); diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index f8a1d82f76f2..d626e5f54aee 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -31,6 +31,7 @@ import android.util.AttributeSet; import android.util.DebugUtils; import android.util.Log; import android.util.SparseArray; +import android.util.SuperNotCalledException; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index a7789d6c0b70..4371907ad590 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -31,6 +31,7 @@ import android.util.DebugUtils; import android.util.Log; import android.util.LogWriter; import android.util.SparseArray; +import android.util.SuperNotCalledException; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index e062fa8b4eb9..676fd1f32915 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -924,6 +924,42 @@ public final class BluetoothAdapter { } /** + * Create a listening, L2CAP Bluetooth socket. + * <p>A remote device connecting to this socket will optionally be + * authenticated and communication on this socket will optionally be + * encrypted. + * <p>Use {@link BluetoothServerSocket#accept} to retrieve incoming + * connections from a listening {@link BluetoothServerSocket}. + * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} + * @param secure whether security and authentication are required + * @param fixedChannel whether we're looking for a PSM-based connection or a fixed channel + * @param channel L2CAP PSM or channel to use + * @return a listening L2CAP BluetoothServerSocket + * @throws IOException on error, for example Bluetooth not available, or + * insufficient permissions, or channel in use. + * @hide + */ + public BluetoothServerSocket listenUsingL2CapOn(boolean secure, boolean fixedChannel, + int channel) throws IOException { + BluetoothServerSocket socket; + + if (fixedChannel) { + channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; + } + + socket = new BluetoothServerSocket( + BluetoothSocket.TYPE_L2CAP, secure, secure, channel); + int errno = socket.mSocket.bindListen(); + if (errno != 0) { + //TODO(BT): Throw the same exception error code + // that the previous code was using. + //socket.mSocket.throwErrnoNative(errno); + throw new IOException("Error: " + errno); + } + return socket; + } + + /** * Create a listening, secure RFCOMM Bluetooth socket. * <p>A remote device connecting to this socket will be authenticated and * communication on this socket will be encrypted. diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index 3acd9b00c056..2c85382fe13c 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1144,6 +1144,33 @@ public final class BluetoothDevice implements Parcelable { return new BluetoothSocket(BluetoothSocket.TYPE_SCO, -1, true, true, this, -1, null); } + + /** + * Construct a L2CAP socket ready to start an outgoing connection. + * Call #connect on the returned #BluetoothSocket to begin the connection. + * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} + * + * @param secure select whether security will be required + * @param fixedChannel select if this will be a "fixed channel" L2CAP connection + * or a PSM-based connection + * @param channel fixed channel or PSM to connect to + * @return a L2CAP BluetoothSocket + * @throws IOException on error, for example Bluetooth not available, or + * insufficient permissions. + * @hide + */ + public BluetoothSocket createL2CapSocket(boolean secure, boolean fixedChannel, int channel) + throws IOException { + + if (fixedChannel) { + channel |= BluetoothSocket.PORT_MASK_FIXED_CHAN; + } + + return new BluetoothSocket(BluetoothSocket.TYPE_L2CAP, -1, secure, secure, this, + channel, null); + } + + /** * Check that a pin is valid and convert to byte array. * diff --git a/core/java/android/bluetooth/BluetoothSocket.java b/core/java/android/bluetooth/BluetoothSocket.java index d10eaea2fba1..191bf67af340 100644 --- a/core/java/android/bluetooth/BluetoothSocket.java +++ b/core/java/android/bluetooth/BluetoothSocket.java @@ -103,6 +103,8 @@ public final class BluetoothSocket implements Closeable { /*package*/ static final int SEC_FLAG_ENCRYPT = 1; /*package*/ static final int SEC_FLAG_AUTH = 1 << 1; + /*package*/ static final int PORT_MASK_FIXED_CHAN = 1 << 16; + private final int mType; /* one of TYPE_RFCOMM etc */ private BluetoothDevice mDevice; /* remote device */ private String mAddress; /* remote address */ @@ -115,7 +117,7 @@ public final class BluetoothSocket implements Closeable { private LocalSocket mSocket; private InputStream mSocketIS; private OutputStream mSocketOS; - private int mPort; /* RFCOMM channel or L2CAP psm */ + private int mPort; /* RFCOMM channel or L2CAP psm/channel */ private int mFd; private String mServiceName; private static int PROXY_CONNECTION_TIMEOUT = 5000; diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java index b9121c7f51bb..65a3a07bea98 100644 --- a/core/java/android/content/ContentProvider.java +++ b/core/java/android/content/ContentProvider.java @@ -102,6 +102,8 @@ public abstract class ContentProvider implements ComponentCallbacks2 { private boolean mExported; private boolean mNoPerms; + private final ThreadLocal<String> mCallingPackage = new ThreadLocal<String>(); + private Transport mTransport = new Transport(); /** @@ -194,8 +196,14 @@ public abstract class ContentProvider implements ComponentCallbacks2 { return rejectQuery(uri, projection, selection, selectionArgs, sortOrder, CancellationSignal.fromTransport(cancellationSignal)); } - return ContentProvider.this.query(uri, projection, selection, selectionArgs, sortOrder, - CancellationSignal.fromTransport(cancellationSignal)); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.query( + uri, projection, selection, selectionArgs, sortOrder, + CancellationSignal.fromTransport(cancellationSignal)); + } finally { + mCallingPackage.set(null); + } } @Override @@ -208,7 +216,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { if (enforceWritePermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { return rejectInsert(uri, initialValues); } - return ContentProvider.this.insert(uri, initialValues); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.insert(uri, initialValues); + } finally { + mCallingPackage.set(null); + } } @Override @@ -216,7 +229,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { if (enforceWritePermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { return 0; } - return ContentProvider.this.bulkInsert(uri, initialValues); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.bulkInsert(uri, initialValues); + } finally { + mCallingPackage.set(null); + } } @Override @@ -238,7 +256,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } } } - return ContentProvider.this.applyBatch(operations); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.applyBatch(operations); + } finally { + mCallingPackage.set(null); + } } @Override @@ -246,7 +269,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { if (enforceWritePermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { return 0; } - return ContentProvider.this.delete(uri, selection, selectionArgs); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.delete(uri, selection, selectionArgs); + } finally { + mCallingPackage.set(null); + } } @Override @@ -255,7 +283,12 @@ public abstract class ContentProvider implements ComponentCallbacks2 { if (enforceWritePermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { return 0; } - return ContentProvider.this.update(uri, values, selection, selectionArgs); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.update(uri, values, selection, selectionArgs); + } finally { + mCallingPackage.set(null); + } } @Override @@ -263,8 +296,13 @@ public abstract class ContentProvider implements ComponentCallbacks2 { String callingPkg, Uri uri, String mode, ICancellationSignal cancellationSignal) throws FileNotFoundException { enforceFilePermission(callingPkg, uri, mode); - return ContentProvider.this.openFile( - uri, mode, CancellationSignal.fromTransport(cancellationSignal)); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.openFile( + uri, mode, CancellationSignal.fromTransport(cancellationSignal)); + } finally { + mCallingPackage.set(null); + } } @Override @@ -272,13 +310,23 @@ public abstract class ContentProvider implements ComponentCallbacks2 { String callingPkg, Uri uri, String mode, ICancellationSignal cancellationSignal) throws FileNotFoundException { enforceFilePermission(callingPkg, uri, mode); - return ContentProvider.this.openAssetFile( - uri, mode, CancellationSignal.fromTransport(cancellationSignal)); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.openAssetFile( + uri, mode, CancellationSignal.fromTransport(cancellationSignal)); + } finally { + mCallingPackage.set(null); + } } @Override public Bundle call(String callingPkg, String method, String arg, Bundle extras) { - return ContentProvider.this.callFromPackage(callingPkg, method, arg, extras); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.call(method, arg, extras); + } finally { + mCallingPackage.set(null); + } } @Override @@ -290,15 +338,46 @@ public abstract class ContentProvider implements ComponentCallbacks2 { public AssetFileDescriptor openTypedAssetFile(String callingPkg, Uri uri, String mimeType, Bundle opts, ICancellationSignal cancellationSignal) throws FileNotFoundException { enforceFilePermission(callingPkg, uri, "r"); - return ContentProvider.this.openTypedAssetFile( - uri, mimeType, opts, CancellationSignal.fromTransport(cancellationSignal)); + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.openTypedAssetFile( + uri, mimeType, opts, CancellationSignal.fromTransport(cancellationSignal)); + } finally { + mCallingPackage.set(null); + } } @Override - public ICancellationSignal createCancellationSignal() throws RemoteException { + public ICancellationSignal createCancellationSignal() { return CancellationSignal.createTransport(); } + @Override + public Uri canonicalize(String callingPkg, Uri uri) { + if (enforceReadPermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { + return null; + } + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.canonicalize(uri); + } finally { + mCallingPackage.set(null); + } + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) { + if (enforceReadPermission(callingPkg, uri) != AppOpsManager.MODE_ALLOWED) { + return null; + } + mCallingPackage.set(callingPkg); + try { + return ContentProvider.this.uncanonicalize(uri); + } finally { + mCallingPackage.set(null); + } + } + private void enforceFilePermission(String callingPkg, Uri uri, String mode) throws FileNotFoundException, SecurityException { if (mode != null && mode.indexOf('w') != -1) { @@ -461,6 +540,28 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } /** + * Return the package name of the caller that initiated the request being + * processed on the current thread. The returned package will have been + * verified to belong to the calling UID. Returns {@code null} if not + * currently processing a request. + * <p> + * This will always return {@code null} when processing + * {@link #getType(Uri)} or {@link #getStreamTypes(Uri, String)} requests. + * + * @see Binder#getCallingUid() + * @see Context#grantUriPermission(String, Uri, int) + * @throws SecurityException if the calling package doesn't belong to the + * calling UID. + */ + public final String getCallingPackage() { + final String pkg = mCallingPackage.get(); + if (pkg != null) { + mTransport.mAppOpsManager.checkPackage(Binder.getCallingUid(), pkg); + } + return pkg; + } + + /** * Change the permission required to read data from the content * provider. This is normally set for you from its manifest information * when the provider is first created. @@ -529,8 +630,6 @@ public abstract class ContentProvider implements ComponentCallbacks2 { /** @hide */ public final void setAppOps(int readOp, int writeOp) { if (!mNoPerms) { - mTransport.mAppOpsManager = (AppOpsManager)mContext.getSystemService( - Context.APP_OPS_SERVICE); mTransport.mReadOp = readOp; mTransport.mWriteOp = writeOp; } @@ -768,6 +867,56 @@ public abstract class ContentProvider implements ComponentCallbacks2 { public abstract String getType(Uri uri); /** + * Implement this to support canonicalization of URIs that refer to your + * content provider. A canonical URI is one that can be transported across + * devices, backup/restore, and other contexts, and still be able to refer + * to the same data item. Typically this is implemented by adding query + * params to the URI allowing the content provider to verify that an incoming + * canonical URI references the same data as it was originally intended for and, + * if it doesn't, to find that data (if it exists) in the current environment. + * + * <p>For example, if the content provider holds people and a normal URI in it + * is created with a row index into that people database, the cananical representation + * may have an additional query param at the end which specifies the name of the + * person it is intended for. Later calls into the provider with that URI will look + * up the row of that URI's base index and, if it doesn't match or its entry's + * name doesn't match the name in the query param, perform a query on its database + * to find the correct row to operate on.</p> + * + * <p>If you implement support for canonical URIs, <b>all</b> incoming calls with + * URIs (including this one) must perform this verification and recovery of any + * canonical URIs they receive. In addition, you must also implement + * {@link #uncanonicalize} to strip the canonicalization of any of these URIs.</p> + * + * <p>The default implementation of this method returns null, indicating that + * canonical URIs are not supported.</p> + * + * @param url The Uri to canonicalize. + * + * @return Return the canonical representation of <var>url</var>, or null if + * canonicalization of that Uri is not supported. + */ + public Uri canonicalize(Uri url) { + return null; + } + + /** + * Remove canonicalization from canonical URIs previously returned by + * {@link #canonicalize}. For example, if your implementation is to add + * a query param to canonicalize a URI, this method can simply trip any + * query params on the URI. The default implementation always returns the + * same <var>url</var> that was passed in. + * + * @param url The Uri to remove any canonicalization from. + * + * @return Return the non-canonical representation of <var>url</var>, or return + * the <var>url</var> as-is if there is nothing to do. Never return null. + */ + public Uri uncanonicalize(Uri url) { + return url; + } + + /** * @hide * Implementation when a caller has performed an insert on the content * provider, but that call has been rejected for the operation given @@ -1413,6 +1562,8 @@ public abstract class ContentProvider implements ComponentCallbacks2 { */ if (mContext == null) { mContext = context; + mTransport.mAppOpsManager = (AppOpsManager) mContext.getSystemService( + Context.APP_OPS_SERVICE); mMyUid = Process.myUid(); if (info != null) { setReadPermission(info.readPermission); @@ -1452,15 +1603,6 @@ public abstract class ContentProvider implements ComponentCallbacks2 { } /** - * @hide - * Front-end to {@link #call(String, String, android.os.Bundle)} that provides the name - * of the calling package. - */ - public Bundle callFromPackage(String callingPackag, String method, String arg, Bundle extras) { - return call(method, arg, extras); - } - - /** * Call a provider-defined method. This can be used to implement * interfaces that are cheaper and/or unnatural for a table-like * model. diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java index 4e8dd829a348..e6d9b2483951 100644 --- a/core/java/android/content/ContentProviderClient.java +++ b/core/java/android/content/ContentProviderClient.java @@ -110,6 +110,30 @@ public class ContentProviderClient { } } + /** See {@link ContentProvider#canonicalize} */ + public final Uri canonicalize(Uri url) throws RemoteException { + try { + return mContentProvider.canonicalize(mPackageName, url); + } catch (DeadObjectException e) { + if (!mStable) { + mContentResolver.unstableProviderDied(mContentProvider); + } + throw e; + } + } + + /** See {@link ContentProvider#uncanonicalize} */ + public final Uri uncanonicalize(Uri url) throws RemoteException { + try { + return mContentProvider.uncanonicalize(mPackageName, url); + } catch (DeadObjectException e) { + if (!mStable) { + mContentResolver.unstableProviderDied(mContentProvider); + } + throw e; + } + } + /** See {@link ContentProvider#insert ContentProvider.insert} */ public Uri insert(Uri url, ContentValues initialValues) throws RemoteException { diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java index 744e68c6e27e..bcf0b637a213 100644 --- a/core/java/android/content/ContentProviderNative.java +++ b/core/java/android/content/ContentProviderNative.java @@ -323,6 +323,30 @@ abstract public class ContentProviderNative extends Binder implements IContentPr reply.writeStrongBinder(cancellationSignal.asBinder()); return true; } + + case CANONICALIZE_TRANSACTION: + { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + Uri url = Uri.CREATOR.createFromParcel(data); + + Uri out = canonicalize(callingPkg, url); + reply.writeNoException(); + Uri.writeToParcel(reply, out); + return true; + } + + case UNCANONICALIZE_TRANSACTION: + { + data.enforceInterface(IContentProvider.descriptor); + String callingPkg = data.readString(); + Uri url = Uri.CREATOR.createFromParcel(data); + + Uri out = uncanonicalize(callingPkg, url); + reply.writeNoException(); + Uri.writeToParcel(reply, out); + return true; + } } } catch (Exception e) { DatabaseUtils.writeExceptionToParcel(reply, e); @@ -685,5 +709,46 @@ final class ContentProviderProxy implements IContentProvider } } + public Uri canonicalize(String callingPkg, Uri url) throws RemoteException + { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + url.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.CANONICALIZE_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + Uri out = Uri.CREATOR.createFromParcel(reply); + return out; + } finally { + data.recycle(); + reply.recycle(); + } + } + + public Uri uncanonicalize(String callingPkg, Uri url) throws RemoteException { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + try { + data.writeInterfaceToken(IContentProvider.descriptor); + + data.writeString(callingPkg); + url.writeToParcel(data, 0); + + mRemote.transact(IContentProvider.UNCANONICALIZE_TRANSACTION, data, reply, 0); + + DatabaseUtils.readExceptionFromParcel(reply); + Uri out = Uri.CREATOR.createFromParcel(reply); + return out; + } finally { + data.recycle(); + reply.recycle(); + } + } + private IBinder mRemote; } diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java index 8a5a56cd2628..9f462aab54f9 100644 --- a/core/java/android/content/ContentResolver.java +++ b/core/java/android/content/ContentResolver.java @@ -497,6 +497,86 @@ public abstract class ContentResolver { } /** + * Transform the given <var>url</var> to a canonical representation of + * its referenced resource, which can be used across devices, persisted, + * backed up and restored, etc. The returned Uri is still a fully capable + * Uri for use with its content provider, allowing you to do all of the + * same content provider operations as with the original Uri -- + * {@link #query}, {@link #openInputStream(android.net.Uri)}, etc. The + * only difference in behavior between the original and new Uris is that + * the content provider may need to do some additional work at each call + * using it to resolve it to the correct resource, especially if the + * canonical Uri has been moved to a different environment. + * + * <p>If you are moving a canonical Uri between environments, you should + * perform another call to {@link #canonicalize} with that original Uri to + * re-canonicalize it for the current environment. Alternatively, you may + * want to use {@link #uncanonicalize} to transform it to a non-canonical + * Uri that works only in the current environment but potentially more + * efficiently than the canonical representation.</p> + * + * @param url The {@link Uri} that is to be transformed to a canonical + * representation. Like all resolver calls, the input can be either + * a non-canonical or canonical Uri. + * + * @return Returns the official canonical representation of <var>url</var>, + * or null if the content provider does not support a canonical representation + * of the given Uri. Many providers may not support canonicalization of some + * or all of their Uris. + * + * @see #uncanonicalize + */ + public final Uri canonicalize(Uri url) { + IContentProvider provider = acquireProvider(url); + if (provider == null) { + return null; + } + + try { + return provider.canonicalize(mPackageName, url); + } catch (RemoteException e) { + // Arbitrary and not worth documenting, as Activity + // Manager will kill this process shortly anyway. + return null; + } finally { + releaseProvider(provider); + } + } + + /** + * Given a canonical Uri previously generated by {@link #canonicalize}, convert + * it to its local non-canonical form. This can be useful in some cases where + * you know that you will only be using the Uri in the current environment and + * want to avoid any possible overhead when using it with the content + * provider. + * + * @param url The canonical {@link Uri} that is to be convered back to its + * non-canonical form. + * + * @return Returns the non-canonical representation of <var>url</var>. This + * function never returns null; if there is no conversion to be done, it returns + * the same Uri that was provided. + * + * @see #canonicalize + */ + public final Uri uncanonicalize(Uri url) { + IContentProvider provider = acquireProvider(url); + if (provider == null) { + return null; + } + + try { + return provider.uncanonicalize(mPackageName, url); + } catch (RemoteException e) { + // Arbitrary and not worth documenting, as Activity + // Manager will kill this process shortly anyway. + return null; + } finally { + releaseProvider(provider); + } + } + + /** * Open a stream on to the content associated with a content URI. If there * is no data associated with the URI, FileNotFoundException is thrown. * diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 2ff9182241ef..8df5bee57b86 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -638,7 +638,7 @@ public abstract class Context { * {@sample development/samples/ApiDemos/src/com/example/android/apis/content/ExternalStorage.java * private_picture} * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * this path. Otherwise, {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} * or {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} are required. @@ -674,7 +674,7 @@ public abstract class Context { * the device, including both emulated external storage and physical media * slots. This does not include transient devices, such as USB flash drives. * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * these paths. * <p> @@ -695,7 +695,7 @@ public abstract class Context { * should ensure that multiple instances running under different users don't * interfere with each other. * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * this path. Otherwise, * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} or @@ -713,7 +713,7 @@ public abstract class Context { * the device, including both emulated external storage and physical media * slots. This does not include transient devices, such as USB flash drives. * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * this path. * <p> @@ -774,7 +774,7 @@ public abstract class Context { * each user has their own isolated external storage. Applications only * have access to the external storage for the user they're running as.</p> * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * this path. Otherwise, * {@link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} or @@ -799,7 +799,7 @@ public abstract class Context { * the device, including both emulated external storage and physical media * slots. This does not include transient devices, such as USB flash drives. * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, no + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, no * permissions are required for the owning application to read or write to * these paths. * <p> @@ -1651,7 +1651,7 @@ public abstract class Context { * should contain either contain the complete class name of a specific service * implementation to start or a specific package name to target. If the * Intent is less specified, it will either throw an {@link IllegalArgumentException} - * (if the caller targets {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} or later), + * (if the caller targets {@link android.os.Build.VERSION_CODES#KITKAT} or later), * or which of multiple matching services it finds and uses will be undefined. If this service * is not already running, it will be instantiated and started (creating a * process for it if needed); if it is running then it remains running. diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java index 6ea88768e9a1..f92a40440904 100644 --- a/core/java/android/content/IContentProvider.java +++ b/core/java/android/content/IContentProvider.java @@ -59,6 +59,9 @@ public interface IContentProvider extends IInterface { throws RemoteException; public ICancellationSignal createCancellationSignal() throws RemoteException; + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException; + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException; + // Data interchange. public String[] getStreamTypes(Uri url, String mimeTypeFilter) throws RemoteException; public AssetFileDescriptor openTypedAssetFile(String callingPkg, Uri url, String mimeType, @@ -80,4 +83,6 @@ public interface IContentProvider extends IInterface { static final int GET_STREAM_TYPES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 21; static final int OPEN_TYPED_ASSET_FILE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 22; static final int CREATE_CANCELATION_SIGNAL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 23; + static final int CANONICALIZE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 24; + static final int UNCANONICALIZE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 25; } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index dfc041295953..2f2aae4ff063 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2469,16 +2469,19 @@ public class Intent implements Parcelable, Cloneable { "android.intent.action.GET_RESTRICTION_ENTRIES"; /** + * @hide * Activity to challenge the user for a PIN that was configured when setting up - * restrictions. Launch the activity using + * restrictions. Restrictions include blocking of apps and preventing certain user operations, + * controlled by {@link android.os.UserManager#setUserRestrictions(Bundle). + * Launch the activity using * {@link android.app.Activity#startActivityForResult(Intent, int)} and check if the * result is {@link android.app.Activity#RESULT_OK} for a successful response to the * challenge.<p/> * Before launching this activity, make sure that there is a PIN in effect, by calling - * {@link android.os.UserManager#hasRestrictionsPin()}. + * {@link android.os.UserManager#hasRestrictionsChallenge()}. */ - public static final String ACTION_RESTRICTIONS_PIN_CHALLENGE = - "android.intent.action.RESTRICTIONS_PIN_CHALLENGE"; + public static final String ACTION_RESTRICTIONS_CHALLENGE = + "android.intent.action.RESTRICTIONS_CHALLENGE"; /** * Sent the first time a user is starting, to allow system apps to diff --git a/core/java/android/content/UndoManager.java b/core/java/android/content/UndoManager.java index 1c2db47ad7d6..e9ec5a4a982b 100644 --- a/core/java/android/content/UndoManager.java +++ b/core/java/android/content/UndoManager.java @@ -50,6 +50,8 @@ import java.util.HashMap; * undo/redo them without needing to impact edits in other objects; while * within the larger document, all edits can be seen and the user must * undo/redo them as a single stream.</p> + * + * @hide */ public class UndoManager { private final HashMap<String, UndoOwner> mOwners = new HashMap<String, UndoOwner>(); diff --git a/core/java/android/content/UndoOperation.java b/core/java/android/content/UndoOperation.java index 8084b1f5946e..1ff32d4a8013 100644 --- a/core/java/android/content/UndoOperation.java +++ b/core/java/android/content/UndoOperation.java @@ -23,6 +23,8 @@ import android.os.Parcelable; * A single undoable operation. You must subclass this to implement the state * and behavior for your operation. Instances of this class are placed and * managed in an {@link UndoManager}. + * + * @hide */ public abstract class UndoOperation<DATA> implements Parcelable { UndoOwner mOwner; diff --git a/core/java/android/content/UndoOwner.java b/core/java/android/content/UndoOwner.java index a279de68635e..d0cdc950adae 100644 --- a/core/java/android/content/UndoOwner.java +++ b/core/java/android/content/UndoOwner.java @@ -18,6 +18,8 @@ package android.content; /** * Representation of an owner of {@link UndoOperation} objects in an {@link UndoManager}. + * + * @hide */ public class UndoOwner { final String mTag; diff --git a/core/java/android/content/pm/ActivityInfo.java b/core/java/android/content/pm/ActivityInfo.java index 8154bca2cb89..b8ac3bf9a8e0 100644 --- a/core/java/android/content/pm/ActivityInfo.java +++ b/core/java/android/content/pm/ActivityInfo.java @@ -16,6 +16,7 @@ package android.content.pm; +import android.content.res.Configuration; import android.os.Parcel; import android.os.Parcelable; import android.util.Printer; @@ -437,20 +438,20 @@ public class ActivityInfo extends ComponentInfo * native side given the bit we have assigned in ActivityInfo. */ public static int[] CONFIG_NATIVE_BITS = new int[] { - 0x0001, // MNC - 0x0002, // MCC - 0x0004, // LOCALE - 0x0008, // TOUCH SCREEN - 0x0010, // KEYBOARD - 0x0020, // KEYBOARD HIDDEN - 0x0040, // NAVIGATION - 0x0080, // ORIENTATION - 0x0800, // SCREEN LAYOUT - 0x1000, // UI MODE - 0x0200, // SCREEN SIZE - 0x2000, // SMALLEST SCREEN SIZE - 0x0100, // DENSITY - 0x4000, // LAYOUT DIRECTION + Configuration.NATIVE_CONFIG_MNC, // MNC + Configuration.NATIVE_CONFIG_MCC, // MCC + Configuration.NATIVE_CONFIG_LOCALE, // LOCALE + Configuration.NATIVE_CONFIG_TOUCHSCREEN, // TOUCH SCREEN + Configuration.NATIVE_CONFIG_KEYBOARD, // KEYBOARD + Configuration.NATIVE_CONFIG_KEYBOARD_HIDDEN, // KEYBOARD HIDDEN + Configuration.NATIVE_CONFIG_NAVIGATION, // NAVIGATION + Configuration.NATIVE_CONFIG_ORIENTATION, // ORIENTATION + Configuration.NATIVE_CONFIG_SCREEN_LAYOUT, // SCREEN LAYOUT + Configuration.NATIVE_CONFIG_UI_MODE, // UI MODE + Configuration.NATIVE_CONFIG_SCREEN_SIZE, // SCREEN SIZE + Configuration.NATIVE_CONFIG_SMALLEST_SCREEN_SIZE, // SMALLEST SCREEN SIZE + Configuration.NATIVE_CONFIG_DENSITY, // DENSITY + Configuration.NATIVE_CONFIG_LAYOUTDIR, // LAYOUT DIRECTION }; /** @hide * Convert Java change bits to native. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index b4321643204b..6760f4917496 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -1311,6 +1311,9 @@ public class PackageParser { // Just skip this tag XmlUtils.skipCurrentTag(parser); continue; + } else if (tagName.equals("supports-input")) { + XmlUtils.skipCurrentTag(parser); + continue; } else if (tagName.equals("eat-comment")) { // Just skip this tag @@ -1861,7 +1864,8 @@ public class PackageParser { } String manageSpaceActivity = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); + com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, + Configuration.NATIVE_CONFIG_VERSION); if (manageSpaceActivity != null) { ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, outError); @@ -1875,7 +1879,8 @@ public class PackageParser { // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant // if backup is possible for the given application. String backupAgent = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); + com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, + Configuration.NATIVE_CONFIG_VERSION); if (backupAgent != null) { ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); if (DEBUG_BACKUP) { @@ -1996,7 +2001,8 @@ public class PackageParser { if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { str = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); + com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We @@ -2011,7 +2017,8 @@ public class PackageParser { CharSequence pname; if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { pname = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestApplication_process, 0); + com.android.internal.R.styleable.AndroidManifestApplication_process, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We @@ -2275,7 +2282,8 @@ public class PackageParser { a.info.applicationInfo.uiOptions); String parentName = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivity_parentActivityName, 0); + com.android.internal.R.styleable.AndroidManifestActivity_parentActivityName, + Configuration.NATIVE_CONFIG_VERSION); if (parentName != null) { String parentClassName = buildClassName(a.info.packageName, parentName, outError); if (outError[0] == null) { @@ -2297,7 +2305,8 @@ public class PackageParser { } str = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); + com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, + Configuration.NATIVE_CONFIG_VERSION); a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, owner.applicationInfo.taskAffinity, str, outError); @@ -2506,7 +2515,8 @@ public class PackageParser { com.android.internal.R.styleable.AndroidManifestActivityAlias); String targetActivity = sa.getNonConfigurationString( - com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); + com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, + Configuration.NATIVE_CONFIG_VERSION); if (targetActivity == null) { outError[0] = "<activity-alias> does not specify android:targetActivity"; sa.recycle(); @@ -2596,7 +2606,7 @@ public class PackageParser { String parentName = sa.getNonConfigurationString( com.android.internal.R.styleable.AndroidManifestActivityAlias_parentActivityName, - 0); + Configuration.NATIVE_CONFIG_VERSION); if (parentName != null) { String parentClassName = buildClassName(a.info.packageName, parentName, outError); if (outError[0] == null) { @@ -3653,7 +3663,8 @@ public class PackageParser { if (args.processRes != 0) { CharSequence pname; if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { - pname = args.sa.getNonConfigurationString(args.processRes, 0); + pname = args.sa.getNonConfigurationString(args.processRes, + Configuration.NATIVE_CONFIG_VERSION); } else { // Some older apps have been seen to use a resource reference // here that on older builds was ignored (with a warning). We diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index 0402eeb94764..48b6fca7b2d3 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -544,7 +544,40 @@ public final class Configuration implements Parcelable, Comparable<Configuration * @hide Internal book-keeping. */ public int seq; - + + /** @hide Native-specific bit mask for MCC config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_MCC = 0x0001; + /** @hide Native-specific bit mask for MNC config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_MNC = 0x0002; + /** @hide Native-specific bit mask for LOCALE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_LOCALE = 0x0004; + /** @hide Native-specific bit mask for TOUCHSCREEN config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_TOUCHSCREEN = 0x0008; + /** @hide Native-specific bit mask for KEYBOARD config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_KEYBOARD = 0x0010; + /** @hide Native-specific bit mask for KEYBOARD_HIDDEN config; DO NOT USE UNLESS YOU + * ARE SURE. */ + public static final int NATIVE_CONFIG_KEYBOARD_HIDDEN = 0x0020; + /** @hide Native-specific bit mask for NAVIGATION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_NAVIGATION = 0x0040; + /** @hide Native-specific bit mask for ORIENTATION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_ORIENTATION = 0x0080; + /** @hide Native-specific bit mask for DENSITY config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_DENSITY = 0x0100; + /** @hide Native-specific bit mask for SCREEN_SIZE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_SCREEN_SIZE = 0x0200; + /** @hide Native-specific bit mask for VERSION config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_VERSION = 0x0400; + /** @hide Native-specific bit mask for SCREEN_LAYOUT config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_SCREEN_LAYOUT = 0x0800; + /** @hide Native-specific bit mask for UI_MODE config; DO NOT USE UNLESS YOU ARE SURE. */ + public static final int NATIVE_CONFIG_UI_MODE = 0x1000; + /** @hide Native-specific bit mask for SMALLEST_SCREEN_SIZE config; DO NOT USE UNLESS YOU + * ARE SURE. */ + public static final int NATIVE_CONFIG_SMALLEST_SCREEN_SIZE = 0x2000; + /** @hide Native-specific bit mask for LAYOUTDIR config ; DO NOT USE UNLESS YOU ARE SURE.*/ + public static final int NATIVE_CONFIG_LAYOUTDIR = 0x4000; + /** * Construct an invalid Configuration. You must call {@link #setToDefaults} * for this object to be valid. {@more} diff --git a/core/java/android/content/res/TypedArray.java b/core/java/android/content/res/TypedArray.java index 27dddd47aa32..83d48aa46542 100644 --- a/core/java/android/content/res/TypedArray.java +++ b/core/java/android/content/res/TypedArray.java @@ -16,6 +16,7 @@ package android.content.res; +import android.content.pm.ActivityInfo; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -170,8 +171,8 @@ public class TypedArray { * * @param index Index of attribute to retrieve. * @param allowedChangingConfigs Bit mask of configurations from - * ActivityInfo that are allowed to change. - * + * {@link Configuration}.NATIVE_CONFIG_* that are allowed to change. + * * @return String holding string data. Any styling information is * removed. Returns null if the attribute is not defined. */ diff --git a/core/java/android/hardware/FlushCompleteListener.java b/core/java/android/hardware/FlushCompleteListener.java index cb5b9e331e85..fbdf4c811e72 100644 --- a/core/java/android/hardware/FlushCompleteListener.java +++ b/core/java/android/hardware/FlushCompleteListener.java @@ -18,7 +18,6 @@ package android.hardware; /** * Used for receiving a notification when a flush() has been successfully completed. - * @hide */ public interface FlushCompleteListener { /** diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java index bbede57f55c3..89a581966265 100644 --- a/core/java/android/hardware/Sensor.java +++ b/core/java/android/hardware/Sensor.java @@ -385,8 +385,7 @@ public final class Sensor { /** * @return Number of events reserved for this sensor in the batch mode FIFO. This gives a - * guarantee on the minimum number of events that can be batched - * @hide + * guarantee on the minimum number of events that can be batched. */ public int getFifoReservedEventCount() { return mFifoReservedEventCount; @@ -397,7 +396,6 @@ public final class Sensor { * it indicates that batch mode is not supported for this sensor. If other applications * registered to batched sensors, the actual number of events that can be batched might be * smaller because the hardware FiFo will be partially used to batch the other sensors. - * @hide */ public int getFifoMaxEventCount() { return mFifoMaxEventCount; diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index b6ca62ab9fbd..8a4aa1df1df8 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -582,7 +582,7 @@ public abstract class SensorManager { * @param sensor * The {@link android.hardware.Sensor Sensor} to register to. * - * @param rate + * @param rateUs * The rate {@link android.hardware.SensorEvent sensor events} are * delivered at. This is only a hint to the system. Events may be * received faster or slower than the specified rate. Usually events @@ -603,14 +603,14 @@ public abstract class SensorManager { * * @throws IllegalArgumentException when sensor is null or a trigger sensor */ - public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate) { - return registerListener(listener, sensor, rate, null); + public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs) { + return registerListener(listener, sensor, rateUs, null); } /** * Enables batch mode for a sensor with the given rate and maxBatchReportLatency. If the * underlying hardware does not support batch mode, this defaults to - * {@link #registerListener(SensorEventListener, Sensor, int)} and other parameters are are + * {@link #registerListener(SensorEventListener, Sensor, int)} and other parameters are * ignored. In non-batch mode, all sensor events must be reported as soon as they are detected. * While in batch mode, sensor events do not need to be reported as soon as they are detected. * They can be temporarily stored in batches and reported in batches, as long as no event is @@ -640,13 +640,13 @@ public abstract class SensorManager { * @param listener A {@link android.hardware.SensorEventListener SensorEventListener} object * that will receive the sensor events. * @param sensor The {@link android.hardware.Sensor Sensor} to register to. - * @param rate The desired delay between two consecutive events in microseconds. This is only a - * hint to the system. Events may be received faster or slower than the specified + * @param rateUs The desired delay between two consecutive events in microseconds. This is only + * a hint to the system. Events may be received faster or slower than the specified * rate. Usually events are received faster. Can be one of * {@link #SENSOR_DELAY_NORMAL}, {@link #SENSOR_DELAY_UI}, * {@link #SENSOR_DELAY_GAME}, {@link #SENSOR_DELAY_FASTEST} or the delay in * microseconds. - * @param maxBatchReportLatency An event in the batch can be delayed by at most + * @param maxBatchReportLatencyUs An event in the batch can be delayed by at most * maxBatchReportLatency microseconds. More events can be batched if this value is * large. If this is set to zero, batch mode is disabled and events are delivered in * continuous mode as soon as they are available which is equivalent to calling @@ -661,7 +661,6 @@ public abstract class SensorManager { * @see #unregisterListener(SensorEventListener) * @see #flush(Sensor) * @throws IllegalArgumentException when sensor or listener is null or a trigger sensor. - * @hide */ public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, int maxBatchReportLatencyUs, int reservedFlags, @@ -673,7 +672,9 @@ public abstract class SensorManager { /** * Registers a {@link android.hardware.SensorEventListener SensorEventListener} for the given - * sensor. Events are delivered in continuous mode as soon as they are available. + * sensor. Events are delivered in continuous mode as soon as they are available. To reduce the + * battery usage, use {@link #registerListener(SensorEventListener, Sensor, int, int, int, + * FlushCompleteListener)} which enables batch mode for the sensor. * * <p class="note"></p> * Note: Don't use this method with a one shot trigger sensor such as @@ -688,7 +689,7 @@ public abstract class SensorManager { * @param sensor * The {@link android.hardware.Sensor Sensor} to register to. * - * @param rate + * @param rateUs * The rate {@link android.hardware.SensorEvent sensor events} are * delivered at. This is only a hint to the system. Events may be * received faster or slower than the specified rate. Usually events @@ -713,13 +714,13 @@ public abstract class SensorManager { * * @throws IllegalArgumentException when sensor is null or a trigger sensor */ - public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate, + public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, Handler handler) { if (listener == null || sensor == null) { return false; } - int delay = getDelay(rate); + int delay = getDelay(rateUs); return registerListenerImpl(listener, sensor, delay, handler, 0, 0, null); } @@ -731,7 +732,6 @@ public abstract class SensorManager { * delivered to. * * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener) - * @hide */ public boolean registerListener(SensorEventListener listener, Sensor sensor, int rateUs, int maxBatchReportLatencyUs, int reservedFlags, Handler handler, @@ -760,7 +760,6 @@ public abstract class SensorManager { * i.e no application is registered for updates from this sensor. * @see #registerListener(SensorEventListener, Sensor, int, int, int, FlushCompleteListener) * @throws IllegalArgumentException when sensor is null or a trigger sensor. - * @hide */ public boolean flush(Sensor sensor) { return flushImpl(sensor); diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 3f9b9e91caa6..7735146ab925 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -182,7 +182,7 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { /** * <p> - * When android.sensor.awbMode is not OFF, TRANSFORM_MATRIX + * When android.control.awbMode is not OFF, TRANSFORM_MATRIX * should be ignored. * </p> * @see #COLOR_CORRECTION_MODE_TRANSFORM_MATRIX diff --git a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java index fbe7ff42bbbf..2c05c58d852c 100644 --- a/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java +++ b/core/java/android/hardware/camera2/utils/CameraBinderDecorator.java @@ -49,7 +49,7 @@ public class CameraBinderDecorator { public static final int EACCES = -13; public static final int EBUSY = -16; public static final int ENODEV = -19; - public static final int ENOTSUP = -129; + public static final int EOPNOTSUPP = -95; private static class CameraBinderDecoratorListener implements Decorator.DecoratorListener { @@ -86,7 +86,7 @@ public class CameraBinderDecorator { case ENODEV: UncheckedThrow.throwAnyException(new CameraRuntimeException( CAMERA_DISCONNECTED)); - case ENOTSUP: + case EOPNOTSUPP: UncheckedThrow.throwAnyException(new CameraRuntimeException( CAMERA_DEPRECATED_HAL)); } diff --git a/core/java/android/net/BaseNetworkStateTracker.java b/core/java/android/net/BaseNetworkStateTracker.java index c39488eafc15..476fefe33cc8 100644 --- a/core/java/android/net/BaseNetworkStateTracker.java +++ b/core/java/android/net/BaseNetworkStateTracker.java @@ -103,7 +103,7 @@ public abstract class BaseNetworkStateTracker implements NetworkStateTracker { } @Override - public LinkInfo getLinkInfo() { + public LinkQualityInfo getLinkQualityInfo() { return null; } diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 3874369fcc86..4cf38b6b39f7 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -1426,9 +1426,9 @@ public class ConnectivityManager { * get the information about a specific network link * @hide */ - public LinkInfo getLinkInfo(int networkType) { + public LinkQualityInfo getLinkQualityInfo(int networkType) { try { - LinkInfo li = mService.getLinkInfo(networkType); + LinkQualityInfo li = mService.getLinkQualityInfo(networkType); return li; } catch (RemoteException e) { return null; @@ -1439,9 +1439,9 @@ public class ConnectivityManager { * get the information of currently active network link * @hide */ - public LinkInfo getActiveLinkInfo() { + public LinkQualityInfo getActiveLinkQualityInfo() { try { - LinkInfo li = mService.getActiveLinkInfo(); + LinkQualityInfo li = mService.getActiveLinkQualityInfo(); return li; } catch (RemoteException e) { return null; @@ -1452,9 +1452,9 @@ public class ConnectivityManager { * get the information of all network links * @hide */ - public LinkInfo[] getAllLinkInfo() { + public LinkQualityInfo[] getAllLinkQualityInfo() { try { - LinkInfo[] li = mService.getAllLinkInfo(); + LinkQualityInfo[] li = mService.getAllLinkQualityInfo(); return li; } catch (RemoteException e) { return null; diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index c07e900ba2d7..a6f10ecbe4c4 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -16,7 +16,7 @@ package android.net; -import android.net.LinkInfo; +import android.net.LinkQualityInfo; import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.NetworkQuotaInfo; @@ -149,11 +149,11 @@ interface IConnectivityManager String getMobileRedirectedProvisioningUrl(); - LinkInfo getLinkInfo(int networkType); + LinkQualityInfo getLinkQualityInfo(int networkType); - LinkInfo getActiveLinkInfo(); + LinkQualityInfo getActiveLinkQualityInfo(); - LinkInfo[] getAllLinkInfo(); + LinkQualityInfo[] getAllLinkQualityInfo(); void setProvisioningNotificationVisible(boolean visible, int networkType, in String extraInfo, in String url); } diff --git a/core/java/android/net/LinkInfo.java b/core/java/android/net/LinkInfo.java deleted file mode 100644 index 47b8a9579248..000000000000 --- a/core/java/android/net/LinkInfo.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * 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.net; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Class that represents useful attributes of generic network links - * such as the upload/download throughput or packet error rate. - * Generally speaking, you should be dealing with instances of - * LinkInfo subclasses, such as {@link android.net.#WifiLinkInfo} - * or {@link android.net.#MobileLinkInfo} which provide additional - * information. - * @hide - */ -public class LinkInfo implements Parcelable -{ - public static final int UNKNOWN = -1; - - public static final int NORMALIZED_MIN_SIGNAL_STRENGTH = 0; - - public static final int NORMALIZED_MAX_SIGNAL_STRENGTH = 99; - - public static final int NORMALIZED_SIGNAL_STRENGTH_RANGE = NORMALIZED_MAX_SIGNAL_STRENGTH + 1; - - /* Network type as defined by ConnectivityManager */ - public int mNetworkType = ConnectivityManager.TYPE_NONE; - - public int mNormalizedSignalStrength = UNKNOWN; - - public long mPacketCount = UNKNOWN; - public long mPacketErrorCount = UNKNOWN; - public int mTheoreticalTxBandwidth = UNKNOWN; - public int mTheoreticalRxBandwidth = UNKNOWN; - public int mTheoreticalLatency = UNKNOWN; - - /* Timestamp when last sample was made available */ - public long mLastDataSampleTime = UNKNOWN; - - /* Sample duration in millisecond */ - public int mDataSampleDuration = UNKNOWN; - - public LinkInfo() { - - } - - /** - * Implement the Parcelable interface - * @hide - */ - public int describeContents() { - return 0; - } - /** - * Implement the Parcelable interface. - */ - - protected static final int OBJECT_TYPE_LINKINFO = 1; - protected static final int OBJECT_TYPE_WIFI_LINKINFO = 2; - protected static final int OBJECT_TYPE_MOBILE_LINKINFO = 3; - - public void writeToParcel(Parcel dest, int flags) { - writeToParcel(dest, flags, OBJECT_TYPE_LINKINFO); - } - - public void writeToParcel(Parcel dest, int flags, int objectType) { - dest.writeInt(objectType); - dest.writeInt(mNetworkType); - dest.writeInt(mNormalizedSignalStrength); - dest.writeLong(mPacketCount); - dest.writeLong(mPacketErrorCount); - dest.writeInt(mTheoreticalTxBandwidth); - dest.writeInt(mTheoreticalRxBandwidth); - dest.writeInt(mTheoreticalLatency); - dest.writeLong(mLastDataSampleTime); - dest.writeInt(mDataSampleDuration); - } - - public static final Creator<LinkInfo> CREATOR = - new Creator<LinkInfo>() { - public LinkInfo createFromParcel(Parcel in) { - int objectType = in.readInt(); - if (objectType == OBJECT_TYPE_LINKINFO) { - LinkInfo li = new LinkInfo(); - li.initializeFromParcel(in); - return li; - } else if (objectType == OBJECT_TYPE_WIFI_LINKINFO) { - return WifiLinkInfo.createFromParcelBody(in); - } else if (objectType == OBJECT_TYPE_MOBILE_LINKINFO) { - return MobileLinkInfo.createFromParcelBody(in); - } else { - return null; - } - } - - public LinkInfo[] newArray(int size) { - return new LinkInfo[size]; - } - }; - - protected void initializeFromParcel(Parcel in) { - mNetworkType = in.readInt(); - mNormalizedSignalStrength = in.readInt(); - mPacketCount = in.readLong(); - mPacketErrorCount = in.readLong(); - mTheoreticalTxBandwidth = in.readInt(); - mTheoreticalRxBandwidth = in.readInt(); - mTheoreticalLatency = in.readInt(); - mLastDataSampleTime = in.readLong(); - mDataSampleDuration = in.readInt(); - } - -} diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 1f73c4ad717f..b4d07a1ec23c 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java @@ -66,6 +66,7 @@ public class LinkProperties implements Parcelable { private String mDomains; private Collection<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); private ProxyProperties mHttpProxy; + private int mMtu; // Stores the properties of links that are "stacked" above this link. // Indexed by interface name to allow modification and to prevent duplicates being added. @@ -104,6 +105,7 @@ public class LinkProperties implements Parcelable { for (LinkProperties l: source.mStackedLinks.values()) { addStackedLink(l); } + setMtu(source.getMtu()); } } @@ -197,6 +199,16 @@ public class LinkProperties implements Parcelable { return addresses; } + /** + * Replaces the LinkAddresses on this link with the given collection of addresses. + */ + public void setLinkAddresses(Collection<LinkAddress> addresses) { + mLinkAddresses.clear(); + for (LinkAddress address: addresses) { + addLinkAddress(address); + } + } + public void addDns(InetAddress dns) { if (dns != null) mDnses.add(dns); } @@ -213,6 +225,14 @@ public class LinkProperties implements Parcelable { mDomains = domains; } + public void setMtu(int mtu) { + mMtu = mtu; + } + + public int getMtu() { + return mMtu; + } + private RouteInfo routeWithInterface(RouteInfo route) { return new RouteInfo( route.getDestination(), @@ -312,6 +332,7 @@ public class LinkProperties implements Parcelable { mRoutes.clear(); mHttpProxy = null; mStackedLinks.clear(); + mMtu = 0; } /** @@ -336,6 +357,8 @@ public class LinkProperties implements Parcelable { String domainName = "Domains: " + mDomains; + String mtu = "MTU: " + mMtu; + String routes = " Routes: ["; for (RouteInfo route : mRoutes) routes += route.toString() + ","; routes += "] "; @@ -349,7 +372,8 @@ public class LinkProperties implements Parcelable { } stacked += "] "; } - return "{" + ifaceName + linkAddresses + routes + dns + domainName + proxy + stacked + "}"; + return "{" + ifaceName + linkAddresses + routes + dns + domainName + mtu + + proxy + stacked + "}"; } /** @@ -464,6 +488,16 @@ public class LinkProperties implements Parcelable { return true; } + /** + * Compares this {@code LinkProperties} MTU against the target + * + * @param target LinkProperties to compare. + * @return {@code true} if both are identical, {@code false} otherwise. + */ + public boolean isIdenticalMtu(LinkProperties target) { + return getMtu() == target.getMtu(); + } + @Override /** * Compares this {@code LinkProperties} instance against the target @@ -495,7 +529,8 @@ public class LinkProperties implements Parcelable { isIdenticalDnses(target) && isIdenticalRoutes(target) && isIdenticalHttpProxy(target) && - isIdenticalStackedLinks(target); + isIdenticalStackedLinks(target) && + isIdenticalMtu(target); } /** @@ -597,7 +632,8 @@ public class LinkProperties implements Parcelable { + ((null == mDomains) ? 0 : mDomains.hashCode()) + mRoutes.size() * 41 + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()) - + mStackedLinks.hashCode() * 47); + + mStackedLinks.hashCode() * 47) + + mMtu * 51; } /** @@ -615,7 +651,7 @@ public class LinkProperties implements Parcelable { dest.writeByteArray(d.getAddress()); } dest.writeString(mDomains); - + dest.writeInt(mMtu); dest.writeInt(mRoutes.size()); for(RouteInfo route : mRoutes) { dest.writeParcelable(route, flags); @@ -654,6 +690,7 @@ public class LinkProperties implements Parcelable { } catch (UnknownHostException e) { } } netProp.setDomains(in.readString()); + netProp.setMtu(in.readInt()); addressCount = in.readInt(); for (int i=0; i<addressCount; i++) { netProp.addRoute((RouteInfo)in.readParcelable(null)); diff --git a/core/java/android/net/LinkInfo.aidl b/core/java/android/net/LinkQualityInfo.aidl index 716674b084a4..5e072bf9ae7f 100644 --- a/core/java/android/net/LinkInfo.aidl +++ b/core/java/android/net/LinkQualityInfo.aidl @@ -16,4 +16,4 @@ package android.net; -parcelable LinkInfo; +parcelable LinkQualityInfo; diff --git a/core/java/android/net/LinkQualityInfo.java b/core/java/android/net/LinkQualityInfo.java new file mode 100644 index 000000000000..9c8e61d8fc82 --- /dev/null +++ b/core/java/android/net/LinkQualityInfo.java @@ -0,0 +1,286 @@ +/* + * 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.net; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Class that represents useful attributes of generic network links + * such as the upload/download throughput or packet error rate. + * Generally speaking, you should be dealing with instances of + * LinkQualityInfo subclasses, such as {@link android.net.#WifiLinkQualityInfo} + * or {@link android.net.#MobileLinkQualityInfo} which provide additional + * information. + * @hide + */ +public class LinkQualityInfo implements Parcelable { + + /** + * Represents a value that you can use to test if an integer field is set to a good value + */ + public static final int UNKNOWN_INT = Integer.MAX_VALUE; + + /** + * Represents a value that you can use to test if a long field is set to a good value + */ + public static final long UNKNOWN_LONG = Long.MAX_VALUE; + + public static final int NORMALIZED_MIN_SIGNAL_STRENGTH = 0; + + public static final int NORMALIZED_MAX_SIGNAL_STRENGTH = 99; + + public static final int NORMALIZED_SIGNAL_STRENGTH_RANGE = + NORMALIZED_MAX_SIGNAL_STRENGTH - NORMALIZED_MIN_SIGNAL_STRENGTH + 1; + + /* Network type as defined by ConnectivityManager */ + private int mNetworkType = ConnectivityManager.TYPE_NONE; + + private int mNormalizedSignalStrength = UNKNOWN_INT; + + private long mPacketCount = UNKNOWN_LONG; + private long mPacketErrorCount = UNKNOWN_LONG; + private int mTheoreticalTxBandwidth = UNKNOWN_INT; + private int mTheoreticalRxBandwidth = UNKNOWN_INT; + private int mTheoreticalLatency = UNKNOWN_INT; + + /* Timestamp when last sample was made available */ + private long mLastDataSampleTime = UNKNOWN_LONG; + + /* Sample duration in millisecond */ + private int mDataSampleDuration = UNKNOWN_INT; + + public LinkQualityInfo() { + + } + + /** + * Implement the Parcelable interface + * @hide + */ + public int describeContents() { + return 0; + } + + /** + * Implement the Parcelable interface. + */ + + protected static final int OBJECT_TYPE_LINK_QUALITY_INFO = 1; + protected static final int OBJECT_TYPE_WIFI_LINK_QUALITY_INFO = 2; + protected static final int OBJECT_TYPE_MOBILE_LINK_QUALITY_INFO = 3; + + /** + * @hide + */ + public void writeToParcel(Parcel dest, int flags) { + writeToParcel(dest, flags, OBJECT_TYPE_LINK_QUALITY_INFO); + } + + /** + * @hide + */ + public void writeToParcel(Parcel dest, int flags, int objectType) { + dest.writeInt(objectType); + dest.writeInt(mNetworkType); + dest.writeInt(mNormalizedSignalStrength); + dest.writeLong(mPacketCount); + dest.writeLong(mPacketErrorCount); + dest.writeInt(mTheoreticalTxBandwidth); + dest.writeInt(mTheoreticalRxBandwidth); + dest.writeInt(mTheoreticalLatency); + dest.writeLong(mLastDataSampleTime); + dest.writeInt(mDataSampleDuration); + } + + /** + * @hide + */ + public static final Creator<LinkQualityInfo> CREATOR = + new Creator<LinkQualityInfo>() { + public LinkQualityInfo createFromParcel(Parcel in) { + int objectType = in.readInt(); + if (objectType == OBJECT_TYPE_LINK_QUALITY_INFO) { + LinkQualityInfo li = new LinkQualityInfo(); + li.initializeFromParcel(in); + return li; + } else if (objectType == OBJECT_TYPE_WIFI_LINK_QUALITY_INFO) { + return WifiLinkQualityInfo.createFromParcelBody(in); + } else if (objectType == OBJECT_TYPE_MOBILE_LINK_QUALITY_INFO) { + return MobileLinkQualityInfo.createFromParcelBody(in); + } else { + return null; + } + } + + public LinkQualityInfo[] newArray(int size) { + return new LinkQualityInfo[size]; + } + }; + + /** + * @hide + */ + protected void initializeFromParcel(Parcel in) { + mNetworkType = in.readInt(); + mNormalizedSignalStrength = in.readInt(); + mPacketCount = in.readLong(); + mPacketErrorCount = in.readLong(); + mTheoreticalTxBandwidth = in.readInt(); + mTheoreticalRxBandwidth = in.readInt(); + mTheoreticalLatency = in.readInt(); + mLastDataSampleTime = in.readLong(); + mDataSampleDuration = in.readInt(); + } + + /** + * returns the type of network this link is connected to + * @return network type as defined by {@link android.net.ConnectivityManager} or + * {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getNetworkType() { + return mNetworkType; + } + + /** + * @hide + */ + public void setNetworkType(int networkType) { + mNetworkType = networkType; + } + + /** + * returns the signal strength normalized across multiple types of networks + * @return an integer value from 0 - 99 or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getNormalizedSignalStrength() { + return mNormalizedSignalStrength; + } + + /** + * @hide + */ + public void setNormalizedSignalStrength(int normalizedSignalStrength) { + mNormalizedSignalStrength = normalizedSignalStrength; + } + + /** + * returns the total number of packets sent or received in sample duration + * @return number of packets or {@link android.net.LinkQualityInfo#UNKNOWN_LONG} + */ + public long getPacketCount() { + return mPacketCount; + } + + /** + * @hide + */ + public void setPacketCount(long packetCount) { + mPacketCount = packetCount; + } + + /** + * returns the total number of packets errors encountered in sample duration + * @return number of errors or {@link android.net.LinkQualityInfo#UNKNOWN_LONG} + */ + public long getPacketErrorCount() { + return mPacketErrorCount; + } + + /** + * @hide + */ + public void setPacketErrorCount(long packetErrorCount) { + mPacketErrorCount = packetErrorCount; + } + + /** + * returns the theoretical upload bandwidth of this network + * @return bandwidth in Kbps or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getTheoreticalTxBandwidth() { + return mTheoreticalTxBandwidth; + } + + /** + * @hide + */ + public void setTheoreticalTxBandwidth(int theoreticalTxBandwidth) { + mTheoreticalTxBandwidth = theoreticalTxBandwidth; + } + + /** + * returns the theoretical download bandwidth of this network + * @return bandwidth in Kbps or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getTheoreticalRxBandwidth() { + return mTheoreticalRxBandwidth; + } + + /** + * @hide + */ + public void setTheoreticalRxBandwidth(int theoreticalRxBandwidth) { + mTheoreticalRxBandwidth = theoreticalRxBandwidth; + } + + /** + * returns the theoretical latency of this network + * @return latency in milliseconds or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getTheoreticalLatency() { + return mTheoreticalLatency; + } + + /** + * @hide + */ + public void setTheoreticalLatency(int theoreticalLatency) { + mTheoreticalLatency = theoreticalLatency; + } + + /** + * returns the time stamp of the last sample + * @return milliseconds elapsed since start and sample time or + * {@link android.net.LinkQualityInfo#UNKNOWN_LONG} + */ + public long getLastDataSampleTime() { + return mLastDataSampleTime; + } + + /** + * @hide + */ + public void setLastDataSampleTime(long lastDataSampleTime) { + mLastDataSampleTime = lastDataSampleTime; + } + + /** + * returns the sample duration used + * @return duration in milliseconds or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getDataSampleDuration() { + return mDataSampleDuration; + } + + /** + * @hide + */ + public void setDataSampleDuration(int dataSampleDuration) { + mDataSampleDuration = dataSampleDuration; + } +} diff --git a/core/java/android/net/MobileDataStateTracker.java b/core/java/android/net/MobileDataStateTracker.java index 125d5c146ec8..b914940ddd40 100644 --- a/core/java/android/net/MobileDataStateTracker.java +++ b/core/java/android/net/MobileDataStateTracker.java @@ -84,6 +84,8 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { private SamplingDataTracker mSamplingDataTracker = new SamplingDataTracker(); + private static final int UNKNOWN = LinkQualityInfo.UNKNOWN_INT; + /** * Create a new MobileDataStateTracker * @param netType the ConnectivityManager network type @@ -196,6 +198,8 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { loge("CONNECTED event did not supply link properties."); mLinkProperties = new LinkProperties(); } + mLinkProperties.setMtu(mContext.getResources().getInteger( + com.android.internal.R.integer.config_mobile_mtu)); mLinkCapabilities = intent.getParcelableExtra( PhoneConstants.DATA_LINK_CAPABILITIES_KEY); if (mLinkCapabilities == null) { @@ -207,6 +211,8 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { private class MobileDataStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { + // Assume this isn't a provisioning network. + mNetworkInfo.setIsConnectedToProvisioningNetwork(false); if (intent.getAction().equals(TelephonyIntents. ACTION_DATA_CONNECTION_CONNECTED_TO_PROVISIONING_APN)) { String apnName = intent.getStringExtra(PhoneConstants.DATA_APN_KEY); @@ -222,7 +228,11 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { // Make us in the connecting state until we make a new TYPE_MOBILE_PROVISIONING mMobileDataState = PhoneConstants.DataState.CONNECTING; updateLinkProperitesAndCapatilities(intent); - setDetailedState(DetailedState.CONNECTED_TO_PROVISIONING_NETWORK, "", apnName); + mNetworkInfo.setIsConnectedToProvisioningNetwork(true); + + // Change state to SUSPENDED so setDetailedState + // sends EVENT_STATE_CHANGED to connectivityService + setDetailedState(DetailedState.SUSPENDED, "", apnName); } else if (intent.getAction().equals(TelephonyIntents. ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) { String apnType = intent.getStringExtra(PhoneConstants.DATA_APN_TYPE_KEY); @@ -756,59 +766,59 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { } @Override - public LinkInfo getLinkInfo() { + public LinkQualityInfo getLinkQualityInfo() { if (mNetworkInfo == null || mNetworkInfo.getType() == ConnectivityManager.TYPE_NONE) { // no data available yet; just return return null; } - MobileLinkInfo li = new MobileLinkInfo(); + MobileLinkQualityInfo li = new MobileLinkQualityInfo(); - li.mNetworkType = mNetworkInfo.getType(); + li.setNetworkType(mNetworkInfo.getType()); - mSamplingDataTracker.setCommonLinkInfoFields(li); + mSamplingDataTracker.setCommonLinkQualityInfoFields(li); if (mNetworkInfo.getSubtype() != TelephonyManager.NETWORK_TYPE_UNKNOWN) { - li.mMobileNetworkType = mNetworkInfo.getSubtype(); + li.setMobileNetworkType(mNetworkInfo.getSubtype()); NetworkDataEntry entry = getNetworkDataEntry(mNetworkInfo.getSubtype()); if (entry != null) { - li.mTheoreticalRxBandwidth = entry.downloadBandwidth; - li.mTheoreticalRxBandwidth = entry.uploadBandwidth; - li.mTheoreticalLatency = entry.latency; + li.setTheoreticalRxBandwidth(entry.downloadBandwidth); + li.setTheoreticalRxBandwidth(entry.uploadBandwidth); + li.setTheoreticalLatency(entry.latency); } if (mSignalStrength != null) { - li.mNormalizedSignalStrength = getNormalizedSignalStrength( - li.mMobileNetworkType, mSignalStrength); + li.setNormalizedSignalStrength(getNormalizedSignalStrength( + li.getMobileNetworkType(), mSignalStrength)); } } SignalStrength ss = mSignalStrength; if (ss != null) { - li.mRssi = ss.getGsmSignalStrength(); - li.mGsmErrorRate = ss.getGsmBitErrorRate(); - li.mCdmaDbm = ss.getCdmaDbm(); - li.mCdmaEcio = ss.getCdmaEcio(); - li.mEvdoDbm = ss.getEvdoDbm(); - li.mEvdoEcio = ss.getEvdoEcio(); - li.mEvdoSnr = ss.getEvdoSnr(); - li.mLteSignalStrength = ss.getLteSignalStrength(); - li.mLteRsrp = ss.getLteRsrp(); - li.mLteRsrq = ss.getLteRsrq(); - li.mLteRssnr = ss.getLteRssnr(); - li.mLteCqi = ss.getLteCqi(); + li.setRssi(ss.getGsmSignalStrength()); + li.setGsmErrorRate(ss.getGsmBitErrorRate()); + li.setCdmaDbm(ss.getCdmaDbm()); + li.setCdmaEcio(ss.getCdmaEcio()); + li.setEvdoDbm(ss.getEvdoDbm()); + li.setEvdoEcio(ss.getEvdoEcio()); + li.setEvdoSnr(ss.getEvdoSnr()); + li.setLteSignalStrength(ss.getLteSignalStrength()); + li.setLteRsrp(ss.getLteRsrp()); + li.setLteRsrq(ss.getLteRsrq()); + li.setLteRssnr(ss.getLteRssnr()); + li.setLteCqi(ss.getLteCqi()); } if (VDBG) { - Slog.d(TAG, "Returning LinkInfo with" - + " MobileNetworkType = " + String.valueOf(li.mMobileNetworkType) - + " Theoretical Rx BW = " + String.valueOf(li.mTheoreticalRxBandwidth) - + " gsm Signal Strength = " + String.valueOf(li.mRssi) - + " cdma Signal Strength = " + String.valueOf(li.mCdmaDbm) - + " evdo Signal Strength = " + String.valueOf(li.mEvdoDbm) - + " Lte Signal Strength = " + String.valueOf(li.mLteSignalStrength)); + Slog.d(TAG, "Returning LinkQualityInfo with" + + " MobileNetworkType = " + String.valueOf(li.getMobileNetworkType()) + + " Theoretical Rx BW = " + String.valueOf(li.getTheoreticalRxBandwidth()) + + " gsm Signal Strength = " + String.valueOf(li.getRssi()) + + " cdma Signal Strength = " + String.valueOf(li.getCdmaDbm()) + + " evdo Signal Strength = " + String.valueOf(li.getEvdoDbm()) + + " Lte Signal Strength = " + String.valueOf(li.getLteSignalStrength())); } return li; @@ -829,21 +839,21 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { } private static NetworkDataEntry [] mTheoreticalBWTable = new NetworkDataEntry[] { - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EDGE, 237, 118, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_GPRS, 48, 40, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_UMTS, 384, 64, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSDPA, 14400, -1, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSUPA, 14400, 5760, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSPA, 14400, 5760, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSPAP, 21000, 5760, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_CDMA, -1, -1, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_1xRTT, -1, -1, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_0, 2468, 153, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_A, 3072, 1800, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_B, 14700, 1800, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_IDEN, -1, -1, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_LTE, 100000, 50000, -1), - new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EHRPD, -1, -1, -1), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EDGE, 237, 118, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_GPRS, 48, 40, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_UMTS, 384, 64, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSDPA, 14400, UNKNOWN, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSUPA, 14400, 5760, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSPA, 14400, 5760, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_HSPAP, 21000, 5760, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_CDMA, UNKNOWN, UNKNOWN, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_1xRTT, UNKNOWN, UNKNOWN, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_0, 2468, 153, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_A, 3072, 1800, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EVDO_B, 14700, 1800, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_IDEN, UNKNOWN, UNKNOWN, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_LTE, 100000, 50000, UNKNOWN), + new NetworkDataEntry(TelephonyManager.NETWORK_TYPE_EHRPD, UNKNOWN, UNKNOWN, UNKNOWN), }; private static NetworkDataEntry getNetworkDataEntry(int networkType) { @@ -886,10 +896,10 @@ public class MobileDataStateTracker extends BaseNetworkStateTracker { case TelephonyManager.NETWORK_TYPE_IDEN: case TelephonyManager.NETWORK_TYPE_EHRPD: default: - return LinkInfo.UNKNOWN; + return UNKNOWN; } - return (level * LinkInfo.NORMALIZED_SIGNAL_STRENGTH_RANGE) / + return (level * LinkQualityInfo.NORMALIZED_SIGNAL_STRENGTH_RANGE) / SignalStrength.NUM_SIGNAL_STRENGTH_BINS; } diff --git a/core/java/android/net/MobileLinkInfo.java b/core/java/android/net/MobileLinkInfo.java deleted file mode 100644 index 2d1827503990..000000000000 --- a/core/java/android/net/MobileLinkInfo.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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.net; - -import android.os.Parcel; -import android.net.LinkInfo; - -/** - * Class that represents useful attributes of mobile network links - * such as the upload/download throughput or error rate etc. - * @hide - */ -public final class MobileLinkInfo extends LinkInfo -{ - // Represents TelephonyManager.NetworkType - public int mMobileNetworkType = UNKNOWN; - public int mRssi = UNKNOWN; - public int mGsmErrorRate = UNKNOWN; - public int mCdmaDbm = UNKNOWN; - public int mCdmaEcio = UNKNOWN; - public int mEvdoDbm = UNKNOWN; - public int mEvdoEcio = UNKNOWN; - public int mEvdoSnr = UNKNOWN; - public int mLteSignalStrength = UNKNOWN; - public int mLteRsrp = UNKNOWN; - public int mLteRsrq = UNKNOWN; - public int mLteRssnr = UNKNOWN; - public int mLteCqi = UNKNOWN; - - /** - * Implement the Parcelable interface. - */ - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags, OBJECT_TYPE_MOBILE_LINKINFO); - - dest.writeInt(mMobileNetworkType); - dest.writeInt(mRssi); - dest.writeInt(mGsmErrorRate); - dest.writeInt(mCdmaDbm); - dest.writeInt(mCdmaEcio); - dest.writeInt(mEvdoDbm); - dest.writeInt(mEvdoEcio); - dest.writeInt(mEvdoSnr); - dest.writeInt(mLteSignalStrength); - dest.writeInt(mLteRsrp); - dest.writeInt(mLteRsrq); - dest.writeInt(mLteRssnr); - dest.writeInt(mLteCqi); - } - - /* Un-parceling helper */ - public static MobileLinkInfo createFromParcelBody(Parcel in) { - - MobileLinkInfo li = new MobileLinkInfo(); - - li.initializeFromParcel(in); - - li.mMobileNetworkType = in.readInt(); - li.mRssi = in.readInt(); - li.mGsmErrorRate = in.readInt(); - li.mCdmaDbm = in.readInt(); - li.mCdmaEcio = in.readInt(); - li.mEvdoDbm = in.readInt(); - li.mEvdoEcio = in.readInt(); - li.mEvdoSnr = in.readInt(); - li.mLteSignalStrength = in.readInt(); - li.mLteRsrp = in.readInt(); - li.mLteRsrq = in.readInt(); - li.mLteRssnr = in.readInt(); - li.mLteCqi = in.readInt(); - - return li; - } -} diff --git a/core/java/android/net/MobileLinkQualityInfo.java b/core/java/android/net/MobileLinkQualityInfo.java new file mode 100644 index 000000000000..a01fc8006a13 --- /dev/null +++ b/core/java/android/net/MobileLinkQualityInfo.java @@ -0,0 +1,286 @@ +/* + * 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.net; + +import android.os.Parcel; + +/** + * Class that represents useful attributes of mobile network links + * such as the upload/download throughput or error rate etc. + * @hide + */ +public class MobileLinkQualityInfo extends LinkQualityInfo { + // Represents TelephonyManager.NetworkType + private int mMobileNetworkType = UNKNOWN_INT; + private int mRssi = UNKNOWN_INT; + private int mGsmErrorRate = UNKNOWN_INT; + private int mCdmaDbm = UNKNOWN_INT; + private int mCdmaEcio = UNKNOWN_INT; + private int mEvdoDbm = UNKNOWN_INT; + private int mEvdoEcio = UNKNOWN_INT; + private int mEvdoSnr = UNKNOWN_INT; + private int mLteSignalStrength = UNKNOWN_INT; + private int mLteRsrp = UNKNOWN_INT; + private int mLteRsrq = UNKNOWN_INT; + private int mLteRssnr = UNKNOWN_INT; + private int mLteCqi = UNKNOWN_INT; + + /** + * Implement the Parcelable interface. + * @hide + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags, OBJECT_TYPE_MOBILE_LINK_QUALITY_INFO); + + dest.writeInt(mMobileNetworkType); + dest.writeInt(mRssi); + dest.writeInt(mGsmErrorRate); + dest.writeInt(mCdmaDbm); + dest.writeInt(mCdmaEcio); + dest.writeInt(mEvdoDbm); + dest.writeInt(mEvdoEcio); + dest.writeInt(mEvdoSnr); + dest.writeInt(mLteSignalStrength); + dest.writeInt(mLteRsrp); + dest.writeInt(mLteRsrq); + dest.writeInt(mLteRssnr); + dest.writeInt(mLteCqi); + } + + /* Un-parceling helper */ + /** + * @hide + */ + public static MobileLinkQualityInfo createFromParcelBody(Parcel in) { + + MobileLinkQualityInfo li = new MobileLinkQualityInfo(); + + li.initializeFromParcel(in); + + li.mMobileNetworkType = in.readInt(); + li.mRssi = in.readInt(); + li.mGsmErrorRate = in.readInt(); + li.mCdmaDbm = in.readInt(); + li.mCdmaEcio = in.readInt(); + li.mEvdoDbm = in.readInt(); + li.mEvdoEcio = in.readInt(); + li.mEvdoSnr = in.readInt(); + li.mLteSignalStrength = in.readInt(); + li.mLteRsrp = in.readInt(); + li.mLteRsrq = in.readInt(); + li.mLteRssnr = in.readInt(); + li.mLteCqi = in.readInt(); + + return li; + } + + /** + * returns mobile network type as defined by {@link android.telephony.TelephonyManager} + * @return network type or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getMobileNetworkType() { + return mMobileNetworkType; + } + + /** + * @hide + */ + public void setMobileNetworkType(int mobileNetworkType) { + mMobileNetworkType = mobileNetworkType; + } + + /** + * returns signal strength for GSM networks + * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getRssi() { + return mRssi; + } + + /** + * @hide + */ + public void setRssi(int Rssi) { + mRssi = Rssi; + } + + /** + * returns error rates for GSM networks + * @return error rate or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getGsmErrorRate() { + return mGsmErrorRate; + } + + /** + * @hide + */ + public void setGsmErrorRate(int gsmErrorRate) { + mGsmErrorRate = gsmErrorRate; + } + + /** + * returns signal strength for CDMA networks + * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getCdmaDbm() { + return mCdmaDbm; + } + + /** + * @hide + */ + public void setCdmaDbm(int cdmaDbm) { + mCdmaDbm = cdmaDbm; + } + + /** + * returns signal to noise ratio for CDMA networks + * @return signal to noise ratio in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getCdmaEcio() { + return mCdmaEcio; + } + + /** + * @hide + */ + public void setCdmaEcio(int cdmaEcio) { + mCdmaEcio = cdmaEcio; + } + + /** + * returns signal strength for EVDO networks + * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getEvdoDbm() { + return mEvdoDbm; + } + + /** + * @hide + */ + public void setEvdoDbm(int evdoDbm) { + mEvdoDbm = evdoDbm; + } + + /** + * returns signal to noise ratio for EVDO spectrum + * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getEvdoEcio() { + return mEvdoEcio; + } + + /** + * @hide + */ + public void setEvdoEcio(int evdoEcio) { + mEvdoEcio = evdoEcio; + } + + /** + * returns end-to-end signal to noise ratio for EVDO networks + * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getEvdoSnr() { + return mEvdoSnr; + } + + /** + * @hide + */ + public void setEvdoSnr(int evdoSnr) { + mEvdoSnr = evdoSnr; + } + + /** + * returns signal strength for LTE network + * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getLteSignalStrength() { + return mLteSignalStrength; + } + + /** + * @hide + */ + public void setLteSignalStrength(int lteSignalStrength) { + mLteSignalStrength = lteSignalStrength; + } + + /** + * returns RSRP (Reference Signal Received Power) for LTE network + * @return RSRP in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getLteRsrp() { + return mLteRsrp; + } + + /** + * @hide + */ + public void setLteRsrp(int lteRsrp) { + mLteRsrp = lteRsrp; + } + + /** + * returns RSRQ (Reference Signal Received Quality) for LTE network + * @return RSRQ ??? or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getLteRsrq() { + return mLteRsrq; + } + + /** + * @hide + */ + public void setLteRsrq(int lteRsrq) { + mLteRsrq = lteRsrq; + } + + /** + * returns signal to noise ratio for LTE networks + * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getLteRssnr() { + return mLteRssnr; + } + + /** + * @hide + */ + public void setLteRssnr(int lteRssnr) { + mLteRssnr = lteRssnr; + } + + /** + * returns channel quality indicator for LTE networks + * @return CQI or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getLteCqi() { + return mLteCqi; + } + + /** + * @hide + */ + public void setLteCqi(int lteCqi) { + mLteCqi = lteCqi; + } +} diff --git a/core/java/android/net/NetworkInfo.java b/core/java/android/net/NetworkInfo.java index dabc73a716aa..4d2a70ddf12b 100644 --- a/core/java/android/net/NetworkInfo.java +++ b/core/java/android/net/NetworkInfo.java @@ -83,13 +83,7 @@ public class NetworkInfo implements Parcelable { /** Link has poor connectivity. */ VERIFYING_POOR_LINK, /** Checking if network is a captive portal */ - CAPTIVE_PORTAL_CHECK, - /** - * Network is connected to provisioning network - * TODO: Probably not needed when we add TYPE_PROVISIONING_NETWORK - * @hide - */ - CONNECTED_TO_PROVISIONING_NETWORK + CAPTIVE_PORTAL_CHECK } /** @@ -114,7 +108,6 @@ public class NetworkInfo implements Parcelable { stateMap.put(DetailedState.DISCONNECTED, State.DISCONNECTED); stateMap.put(DetailedState.FAILED, State.DISCONNECTED); stateMap.put(DetailedState.BLOCKED, State.DISCONNECTED); - stateMap.put(DetailedState.CONNECTED_TO_PROVISIONING_NETWORK, State.CONNECTED); } private int mNetworkType; @@ -127,6 +120,8 @@ public class NetworkInfo implements Parcelable { private String mExtraInfo; private boolean mIsFailover; private boolean mIsRoaming; + private boolean mIsConnectedToProvisioningNetwork; + /** * Indicates whether network connectivity is possible: */ @@ -155,6 +150,7 @@ public class NetworkInfo implements Parcelable { mState = State.UNKNOWN; mIsAvailable = false; // until we're told otherwise, assume unavailable mIsRoaming = false; + mIsConnectedToProvisioningNetwork = false; } /** {@hide} */ @@ -171,6 +167,7 @@ public class NetworkInfo implements Parcelable { mIsFailover = source.mIsFailover; mIsRoaming = source.mIsRoaming; mIsAvailable = source.mIsAvailable; + mIsConnectedToProvisioningNetwork = source.mIsConnectedToProvisioningNetwork; } } @@ -329,6 +326,22 @@ public class NetworkInfo implements Parcelable { } } + /** {@hide} */ + @VisibleForTesting + public boolean isConnectedToProvisioningNetwork() { + synchronized (this) { + return mIsConnectedToProvisioningNetwork; + } + } + + /** {@hide} */ + @VisibleForTesting + public void setIsConnectedToProvisioningNetwork(boolean val) { + synchronized (this) { + mIsConnectedToProvisioningNetwork = val; + } + } + /** * Reports the current coarse-grained state of the network. * @return the coarse-grained state @@ -412,7 +425,9 @@ public class NetworkInfo implements Parcelable { append(", extra: ").append(mExtraInfo == null ? "(none)" : mExtraInfo). append(", roaming: ").append(mIsRoaming). append(", failover: ").append(mIsFailover). - append(", isAvailable: ").append(mIsAvailable); + append(", isAvailable: ").append(mIsAvailable). + append(", isConnectedToProvisioningNetwork: "). + append(mIsConnectedToProvisioningNetwork); return builder.toString(); } } @@ -440,6 +455,7 @@ public class NetworkInfo implements Parcelable { dest.writeInt(mIsFailover ? 1 : 0); dest.writeInt(mIsAvailable ? 1 : 0); dest.writeInt(mIsRoaming ? 1 : 0); + dest.writeInt(mIsConnectedToProvisioningNetwork ? 1 : 0); dest.writeString(mReason); dest.writeString(mExtraInfo); } @@ -462,6 +478,7 @@ public class NetworkInfo implements Parcelable { netInfo.mIsFailover = in.readInt() != 0; netInfo.mIsAvailable = in.readInt() != 0; netInfo.mIsRoaming = in.readInt() != 0; + netInfo.mIsConnectedToProvisioningNetwork = in.readInt() != 0; netInfo.mReason = in.readString(); netInfo.mExtraInfo = in.readString(); return netInfo; diff --git a/core/java/android/net/NetworkStateTracker.java b/core/java/android/net/NetworkStateTracker.java index a3d7b1448102..1ca925579fbb 100644 --- a/core/java/android/net/NetworkStateTracker.java +++ b/core/java/android/net/NetworkStateTracker.java @@ -122,7 +122,7 @@ public interface NetworkStateTracker { * Get interesting information about this network link * @return a copy of link information, null if not available */ - public LinkInfo getLinkInfo(); + public LinkQualityInfo getLinkQualityInfo(); /** * Return the system properties name associated with the tcp buffer sizes diff --git a/core/java/android/net/SamplingDataTracker.java b/core/java/android/net/SamplingDataTracker.java index ac2493068140..acd56f2dfdad 100644 --- a/core/java/android/net/SamplingDataTracker.java +++ b/core/java/android/net/SamplingDataTracker.java @@ -189,7 +189,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mTxByteCount - mBeginningSample.mTxByteCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -199,7 +199,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mTxPacketCount - mBeginningSample.mTxPacketCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -209,7 +209,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mTxPacketErrorCount - mBeginningSample.mTxPacketErrorCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -219,7 +219,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mRxByteCount - mBeginningSample.mRxByteCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -229,7 +229,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mRxPacketCount - mBeginningSample.mRxPacketCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -244,7 +244,7 @@ public class SamplingDataTracker long txPacketCount = end.mTxPacketCount - begin.mTxPacketCount; return rxPacketCount + txPacketCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } @@ -254,7 +254,7 @@ public class SamplingDataTracker long txPacketErrorCount = getSampledTxPacketErrorCount(); return rxPacketErrorCount + txPacketErrorCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } @@ -263,7 +263,7 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return mEndingSample.mRxPacketErrorCount - mBeginningSample.mRxPacketErrorCount; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -273,7 +273,7 @@ public class SamplingDataTracker if (mEndingSample != null) { return mEndingSample.mTimestamp; } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_LONG; } } } @@ -283,17 +283,17 @@ public class SamplingDataTracker if (mBeginningSample != null && mEndingSample != null) { return (int) (mEndingSample.mTimestamp - mBeginningSample.mTimestamp); } else { - return LinkInfo.UNKNOWN; + return LinkQualityInfo.UNKNOWN_INT; } } } - public void setCommonLinkInfoFields(LinkInfo li) { + public void setCommonLinkQualityInfoFields(LinkQualityInfo li) { synchronized(mSamplingDataLock) { - li.mLastDataSampleTime = getSampleTimestamp(); - li.mDataSampleDuration = getSampleDuration(); - li.mPacketCount = getSampledPacketCount(); - li.mPacketErrorCount = getSampledPacketErrorCount(); + li.setLastDataSampleTime(getSampleTimestamp()); + li.setDataSampleDuration(getSampleDuration()); + li.setPacketCount(getSampledPacketCount()); + li.setPacketErrorCount(getSampledPacketErrorCount()); } } } diff --git a/core/java/android/net/WifiLinkInfo.java b/core/java/android/net/WifiLinkInfo.java deleted file mode 100644 index a21f1fe73e35..000000000000 --- a/core/java/android/net/WifiLinkInfo.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * 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.net; - -import android.os.Parcel; -import android.net.LinkInfo; - -/** - * Class that represents useful attributes of wifi network links - * such as the upload/download throughput or error rate etc. - * @hide - */ -public final class WifiLinkInfo extends LinkInfo -{ - /** - * Type enumerations for Wifi Network - */ - - /* Indicates Wifi network type such as b/g etc*/ - public int mType = UNKNOWN; - - public String mBssid; - - /* Rssi found by scans */ - public int mRssi = UNKNOWN; - - /* packet statistics */ - public long mTxGood = UNKNOWN; - public long mTxBad = UNKNOWN; - - /** - * Implement the Parcelable interface. - */ - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags, OBJECT_TYPE_WIFI_LINKINFO); - - dest.writeInt(mType); - dest.writeInt(mRssi); - dest.writeLong(mTxGood); - dest.writeLong(mTxBad); - - dest.writeString(mBssid); - } - - /* Un-parceling helper */ - public static WifiLinkInfo createFromParcelBody(Parcel in) { - WifiLinkInfo li = new WifiLinkInfo(); - - li.initializeFromParcel(in); - - li.mType = in.readInt(); - li.mRssi = in.readInt(); - li.mTxGood = in.readLong(); - li.mTxBad = in.readLong(); - - li.mBssid = in.readString(); - - return li; - } -} diff --git a/core/java/android/net/WifiLinkQualityInfo.java b/core/java/android/net/WifiLinkQualityInfo.java new file mode 100644 index 000000000000..20ec9a739b50 --- /dev/null +++ b/core/java/android/net/WifiLinkQualityInfo.java @@ -0,0 +1,149 @@ +/* + * 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.net; + +import android.os.Parcel; + +/** + * Class that represents useful attributes of wifi network links + * such as the upload/download throughput or error rate etc. + * @hide + */ +public class WifiLinkQualityInfo extends LinkQualityInfo { + + /* Indicates Wifi network type such as b/g etc*/ + private int mType = UNKNOWN_INT; + + private String mBssid; + + /* Rssi found by scans */ + private int mRssi = UNKNOWN_INT; + + /* packet statistics */ + private long mTxGood = UNKNOWN_LONG; + private long mTxBad = UNKNOWN_LONG; + + /** + * Implement the Parcelable interface. + * @hide + */ + @Override + public void writeToParcel(Parcel dest, int flags) { + super.writeToParcel(dest, flags, OBJECT_TYPE_WIFI_LINK_QUALITY_INFO); + + dest.writeInt(mType); + dest.writeInt(mRssi); + dest.writeLong(mTxGood); + dest.writeLong(mTxBad); + + dest.writeString(mBssid); + } + + /* Un-parceling helper */ + /** + * @hide + */ + public static WifiLinkQualityInfo createFromParcelBody(Parcel in) { + WifiLinkQualityInfo li = new WifiLinkQualityInfo(); + + li.initializeFromParcel(in); + + li.mType = in.readInt(); + li.mRssi = in.readInt(); + li.mTxGood = in.readLong(); + li.mTxBad = in.readLong(); + + li.mBssid = in.readString(); + + return li; + } + + /** + * returns Wifi network type + * @return network type or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getType() { + return mType; + } + + /** + * @hide + */ + public void setType(int type) { + mType = type; + } + + /** + * returns BSSID of the access point + * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX} or null + */ + public String getBssid() { + return mBssid; + } + + /** + * @hide + */ + public void setBssid(String bssid) { + mBssid = bssid; + } + + /** + * returns RSSI of the network in raw form + * @return un-normalized RSSI or {@link android.net.LinkQualityInfo#UNKNOWN_INT} + */ + public int getRssi() { + return mRssi; + } + + /** + * @hide + */ + public void setRssi(int rssi) { + mRssi = rssi; + } + + /** + * returns number of packets transmitted without error + * @return number of packets or {@link android.net.LinkQualityInfo#UNKNOWN_LONG} + */ + public long getTxGood() { + return mTxGood; + } + + /** + * @hide + */ + public void setTxGood(long txGood) { + mTxGood = txGood; + } + + /** + * returns number of transmitted packets that encountered errors + * @return number of packets or {@link android.net.LinkQualityInfo#UNKNOWN_LONG} + */ + public long getTxBad() { + return mTxBad; + } + + /** + * @hide + */ + public void setTxBad(long txBad) { + mTxBad = txBad; + } +} diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 38ffb960a6f6..dbaa325596d8 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -2380,22 +2380,25 @@ public abstract class BatteryStats implements Parcelable { @SuppressWarnings("unused") public void dumpCheckinLocked( - PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly) { + PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly, + boolean includeHistory) { prepareForDumpLocked(); long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); - final HistoryItem rec = new HistoryItem(); - if (startIteratingHistoryLocked()) { - HistoryPrinter hprinter = new HistoryPrinter(); - while (getNextHistoryLocked(rec)) { - pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); - pw.print(0); pw.print(','); - pw.print(HISTORY_DATA); pw.print(','); - hprinter.printNextItemCheckin(pw, rec, now); - pw.println(); + if (includeHistory) { + final HistoryItem rec = new HistoryItem(); + if (startIteratingHistoryLocked()) { + HistoryPrinter hprinter = new HistoryPrinter(); + while (getNextHistoryLocked(rec)) { + pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); + pw.print(0); pw.print(','); + pw.print(HISTORY_DATA); pw.print(','); + hprinter.printNextItemCheckin(pw, rec, now); + pw.println(); + } + finishIteratingHistoryLocked(); } - finishIteratingHistoryLocked(); } if (apps != null) { diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java index 4627c885288c..26fc769db559 100644 --- a/core/java/android/os/Binder.java +++ b/core/java/android/os/Binder.java @@ -399,17 +399,27 @@ public class Binder implements IBinder { // but all that does is rewind it, and we just got these from an IPC, // so we'll just call it directly. boolean res; + // Log any exceptions as warnings, don't silently suppress them. + // If the call was FLAG_ONEWAY then these exceptions disappear into the ether. try { res = onTransact(code, data, reply, flags); } catch (RemoteException e) { + if ((flags & FLAG_ONEWAY) != 0) { + Log.w(TAG, "Binder call failed.", e); + } reply.setDataPosition(0); reply.writeException(e); res = true; } catch (RuntimeException e) { + if ((flags & FLAG_ONEWAY) != 0) { + Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e); + } reply.setDataPosition(0); reply.writeException(e); res = true; } catch (OutOfMemoryError e) { + // Unconditionally log this, since this is generally unrecoverable. + Log.e(TAG, "Caught an OutOfMemoryError from the binder stub implementation.", e); RuntimeException re = new RuntimeException("Out of memory", e); reply.setDataPosition(0); reply.writeException(re); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index dd40e3506303..88eb280afb40 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -438,7 +438,7 @@ public class Build { public static final int JELLY_BEAN_MR2 = 18; /** - * Android X.X: Key Lime Pie, another tasty treat. + * Android X.X: KitKat, another tasty treat. * * <p>Applications targeting this or a later release will get these * new changes in behavior:</p> @@ -448,7 +448,7 @@ public class Build { * {@link android.content.Context#bindService}. * </ul> */ - public static final int KEY_LIME_PIE = CUR_DEVELOPMENT; + public static final int KITKAT = CUR_DEVELOPMENT; } /** The type of build, like "user" or "eng". */ diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 60ce1327913b..8f68fc1a3cbc 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -158,7 +158,7 @@ public final class Debug public int otherSharedClean; /** @hide */ - public static final int NUM_OTHER_STATS = 13; + public static final int NUM_OTHER_STATS = 14; /** @hide */ public static final int NUM_DVK_STATS = 5; @@ -285,11 +285,12 @@ public final class Debug case 10: return "code mmap"; case 11: return "image mmap"; case 12: return "Other mmap"; - case 13: return ".Heap"; - case 14: return ".LOS"; - case 15: return ".LinearAlloc"; - case 16: return ".GC"; - case 17: return ".JITCache"; + case 13: return "GPU"; + case 14: return ".Heap"; + case 15: return ".LOS"; + case 16: return ".LinearAlloc"; + case 17: return ".GC"; + case 18: return ".JITCache"; default: return "????"; } } diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 3b9456f79875..c6e8c3e5b7be 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -20,7 +20,6 @@ import android.content.Context; import android.os.storage.IMountService; import android.os.storage.StorageManager; import android.os.storage.StorageVolume; -import android.os.SystemProperties; import android.text.TextUtils; import android.util.Log; @@ -324,7 +323,7 @@ public class Environment { * {@link android.Manifest.permission#READ_EXTERNAL_STORAGE} permission, * which is automatically granted if you hold the write permission. * <p> - * Starting in {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, if your + * Starting in {@link android.os.Build.VERSION_CODES#KITKAT}, if your * application only needs to store internal data, consider using * {@link Context#getExternalFilesDir(String)} or * {@link Context#getExternalCacheDir()}, which require no permissions to diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index ed9620fbd9b1..61e5a4ba5a54 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -118,6 +118,11 @@ interface INetworkManagementService void removeSecondaryRoute(String iface, in RouteInfo route); /** + * Set the specified MTU size + */ + void setMtu(String iface, int mtu); + + /** * Shuts down the service */ void shutdown(); diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index bd2d9ac5ada8..3c9d0d904a6c 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -46,8 +46,8 @@ interface IUserManager { int userHandle); Bundle getApplicationRestrictions(in String packageName); Bundle getApplicationRestrictionsForUser(in String packageName, int userHandle); - boolean changeRestrictionsPin(in String newPin); - int checkRestrictionsPin(in String pin); - boolean hasRestrictionsPin(); + boolean setRestrictionsChallenge(in String newPin); + int checkRestrictionsChallenge(in String pin); + boolean hasRestrictionsChallenge(); void removeRestrictions(); } diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index 1e8983ee3fe8..d1b8213d95fc 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -39,7 +39,7 @@ public final class MessageQueue { Message mMessages; private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>(); private IdleHandler[] mPendingIdleHandlers; - private boolean mQuiting; + private boolean mQuitting; // Indicates whether next() is blocked waiting in pollOnce() with a non-zero timeout. private boolean mBlocked; @@ -115,6 +115,8 @@ public final class MessageQueue { } } + // Disposes of the underlying message queue. + // Must only be called on the looper thread or the finalizer. private void dispose() { if (mPtr != 0) { nativeDestroy(mPtr); @@ -125,11 +127,13 @@ public final class MessageQueue { Message next() { int pendingIdleHandlerCount = -1; // -1 only during first iteration int nextPollTimeoutMillis = 0; - for (;;) { if (nextPollTimeoutMillis != 0) { Binder.flushPendingCommands(); } + + // We can assume mPtr != 0 because the loop is obviously still running. + // The looper will not call this method after the loop quits. nativePollOnce(mPtr, nextPollTimeoutMillis); synchronized (this) { @@ -167,7 +171,7 @@ public final class MessageQueue { } // Process the quit message now that all pending messages have been handled. - if (mQuiting) { + if (mQuitting) { dispose(); return null; } @@ -226,18 +230,20 @@ public final class MessageQueue { } synchronized (this) { - if (mQuiting) { + if (mQuitting) { return; } - mQuiting = true; + mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } + + // We can assume mPtr != 0 because mQuitting was previously false. + nativeWake(mPtr); } - nativeWake(mPtr); } int enqueueSyncBarrier(long when) { @@ -270,7 +276,6 @@ public final class MessageQueue { void removeSyncBarrier(int token) { // Remove a sync barrier token from the queue. // If the queue is no longer stalled by a barrier then wake it. - final boolean needWake; synchronized (this) { Message prev = null; Message p = mMessages; @@ -282,6 +287,7 @@ public final class MessageQueue { throw new IllegalStateException("The specified message queue synchronization " + " barrier token has not been posted or has already been removed."); } + final boolean needWake; if (prev != null) { prev.next = p.next; needWake = false; @@ -290,9 +296,12 @@ public final class MessageQueue { needWake = mMessages == null || mMessages.target != null; } p.recycle(); - } - if (needWake) { - nativeWake(mPtr); + + // If the loop is quitting then it is already awake. + // We can assume mPtr != 0 when mQuitting is false. + if (needWake && !mQuitting) { + nativeWake(mPtr); + } } } @@ -304,9 +313,8 @@ public final class MessageQueue { throw new AndroidRuntimeException("Message must have a target."); } - boolean needWake; synchronized (this) { - if (mQuiting) { + if (mQuitting) { RuntimeException e = new RuntimeException( msg.target + " sending message to a Handler on a dead thread"); Log.w("MessageQueue", e.getMessage(), e); @@ -315,6 +323,7 @@ public final class MessageQueue { msg.when = when; Message p = mMessages; + boolean needWake; if (p == null || when == 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next = p; @@ -339,9 +348,11 @@ public final class MessageQueue { msg.next = p; // invariant: p == prev.next prev.next = msg; } - } - if (needWake) { - nativeWake(mPtr); + + // We can assume mPtr != 0 because mQuitting is false. + if (needWake) { + nativeWake(mPtr); + } } return true; } @@ -381,7 +392,11 @@ public final class MessageQueue { } boolean isIdling() { - return nativeIsIdling(mPtr); + synchronized (this) { + // If the loop is quitting then it must not be idling. + // We can assume mPtr != 0 when mQuitting is false. + return !mQuitting && nativeIsIdling(mPtr); + } } void removeMessages(Handler h, int what, Object object) { diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 10b97652d1ba..a3752a1a2d95 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -140,16 +140,6 @@ public class UserManager { */ public static final String DISALLOW_REMOVE_USER = "no_remove_user"; - /** - * Key for user restrictions. Specifies if a user is disallowed from setting app restrictions - * via a restrictions PIN. The default is <code>false</code>. If app restrictions have already - * been set up, then this user restriction cannot be set to true. - * <p/> - * Type: Boolean - * @see #hasRestrictionsPin() - */ - public static final String DISALLOW_APP_RESTRICTIONS = "no_app_restrictions"; - /** @hide */ public static final int PIN_VERIFICATION_FAILED_INCORRECT = -3; /** @hide */ @@ -650,15 +640,14 @@ public class UserManager { } /** - * @hide - * Sets a new restrictions PIN. This should only be called after verifying that there - * currently isn't a PIN set, or after the user successfully enters the current PIN. - * @param newPin - * @return Returns true if the PIN was changed successfully. + * Sets a new challenge PIN for restrictions. This is only for use by pre-installed + * apps and requires the MANAGE_USERS permission. + * @param newPin the PIN to use for challenge dialogs. + * @return Returns true if the challenge PIN was set successfully. */ - public boolean changeRestrictionsPin(String newPin) { + public boolean setRestrictionsChallenge(String newPin) { try { - return mService.changeRestrictionsPin(newPin); + return mService.setRestrictionsChallenge(newPin); } catch (RemoteException re) { Log.w(TAG, "Could not change restrictions pin"); } @@ -674,9 +663,9 @@ public class UserManager { * Returns {@link #PIN_VERIFICATION_SUCCESS} if the input matches the saved PIN. Returns * {@link #PIN_VERIFICATION_FAILED_NOT_SET} if there is no PIN set. */ - public int checkRestrictionsPin(String pin) { + public int checkRestrictionsChallenge(String pin) { try { - return mService.checkRestrictionsPin(pin); + return mService.checkRestrictionsChallenge(pin); } catch (RemoteException re) { Log.w(TAG, "Could not check restrictions pin"); } @@ -684,16 +673,17 @@ public class UserManager { } /** + * @hide * Checks whether the user has restrictions that are PIN-protected. An application that * participates in restrictions can check if the owner has requested a PIN challenge for * any restricted operations. If there is a PIN in effect, the application should launch - * the PIN challenge activity {@link android.content.Intent#ACTION_RESTRICTIONS_PIN_CHALLENGE}. - * @see android.content.Intent#ACTION_RESTRICTIONS_PIN_CHALLENGE + * the PIN challenge activity {@link android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE}. + * @see android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE * @return whether a restrictions PIN is in effect. */ - public boolean hasRestrictionsPin() { + public boolean hasRestrictionsChallenge() { try { - return mService.hasRestrictionsPin(); + return mService.hasRestrictionsChallenge(); } catch (RemoteException re) { Log.w(TAG, "Could not change restrictions pin"); } diff --git a/core/java/android/preference/PreferenceActivity.java b/core/java/android/preference/PreferenceActivity.java index 0f765fa6ba4d..a99705bd12ae 100644 --- a/core/java/android/preference/PreferenceActivity.java +++ b/core/java/android/preference/PreferenceActivity.java @@ -893,15 +893,12 @@ public abstract class PreferenceActivity extends ListActivity implements * @return true if the fragment class name is valid for this Activity and false otherwise. */ protected boolean isValidFragment(String fragmentName) { - if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KEY_LIME_PIE) { - Log.w(TAG, "Subclasses of PreferenceActivity must override isValidFragment(String)" + if (getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.KITKAT) { + throw new RuntimeException( + "Subclasses of PreferenceActivity must override isValidFragment(String)" + " to verify that the Fragment class is valid! " + this.getClass().getName() + " has not checked if fragment " + fragmentName + " is valid."); - // Return true for now, but will eventually return false when all bundled apps - // have been modified. TODO: change to return false - return true; } else { - Log.i(TAG, "PreferenceActivity built on pre-KLP launching fragment: " + fragmentName); return true; } } diff --git a/core/java/android/preference/PreferenceGroup.java b/core/java/android/preference/PreferenceGroup.java index a5e05ba31a74..5f8c78d269e6 100644 --- a/core/java/android/preference/PreferenceGroup.java +++ b/core/java/android/preference/PreferenceGroup.java @@ -210,10 +210,7 @@ public abstract class PreferenceGroup extends Preference implements GenericInfla * @return Whether to allow adding the preference (true), or not (false). */ protected boolean onPrepareAddPreference(Preference preference) { - if (!super.isEnabled()) { - preference.setEnabled(false); - } - + preference.onParentChanged(this, shouldDisableDependents()); return true; } diff --git a/core/java/android/print/IPrinterDiscoveryObserver.aidl b/core/java/android/print/IPrinterDiscoveryObserver.aidl index 625f38384a6c..b558011cf699 100644 --- a/core/java/android/print/IPrinterDiscoveryObserver.aidl +++ b/core/java/android/print/IPrinterDiscoveryObserver.aidl @@ -16,7 +16,6 @@ package android.print; -import android.print.IPrintClient; import android.print.PrinterId; import android.print.PrinterInfo; @@ -28,5 +27,4 @@ import android.print.PrinterInfo; oneway interface IPrinterDiscoveryObserver { void onPrintersAdded(in List<PrinterInfo> printers); void onPrintersRemoved(in List<PrinterId> printerIds); - void onPrintersUpdated(in List<PrinterInfo> printerIds); } diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java index caa10aee03b0..b1e427ed3d34 100644 --- a/core/java/android/print/PrintAttributes.java +++ b/core/java/android/print/PrintAttributes.java @@ -18,10 +18,11 @@ package android.print; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; -import android.content.res.Resources; +import android.content.res.Resources.NotFoundException; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.Log; import com.android.internal.R; @@ -29,60 +30,20 @@ import com.android.internal.R; * This class represents the attributes of a print job. */ public final class PrintAttributes implements Parcelable { - /** Duplex mode: No duplexing */ - public static final int DUPLEX_MODE_NONE = 1 << 0; - /** Duplex mode: Turn a page along its long edge, e.g. like a book */ - public static final int DUPLEX_MODE_LONG_EDGE = 1 << 1; - /** Duplex mode: Turn a page along its short edge, e.g. like a notepad */ - public static final int DUPLEX_MODE_SHORT_EDGE = 1 << 2; - - - /** Orientation: Portrait page orientation. */ - public static final int ORIENTATION_PORTRAIT = 1 << 0; - /** Orientation: Landscape page orientation. */ - public static final int ORIENTATION_LANDSCAPE = 1 << 1; - /** Color mode: Monochrome color scheme, e.g. one color is used. */ public static final int COLOR_MODE_MONOCHROME = 1 << 0; /** Color mode: Color color scheme, e.g. many colors are used. */ public static final int COLOR_MODE_COLOR = 1 << 1; - - /** Fitting mode: No fitting. */ - public static final int FITTING_MODE_NONE = 1 << 0; - /** Fitting mode: Scale the content to fit in the page - * without cropping it in any dimension. */ - public static final int FITTING_MODE_SCALE_TO_FIT = 1 << 1; - /** - * Fitting mode: Uniformly scale the content to fill the entire page - * potentially cropping the content if it overflows in one dimension. - */ - public static final int FITTING_MODE_SCALE_TO_FILL = 1 << 2; - - - private static final int VALID_DUPLEX_MODES = - DUPLEX_MODE_NONE | DUPLEX_MODE_LONG_EDGE | DUPLEX_MODE_SHORT_EDGE; - private static final int VALID_COLOR_MODES = COLOR_MODE_MONOCHROME | COLOR_MODE_COLOR; - private static final int VALID_FITTING_MODES = - FITTING_MODE_NONE | FITTING_MODE_SCALE_TO_FIT | FITTING_MODE_SCALE_TO_FILL; - - private static final int VALID_ORIENTATIONS = - ORIENTATION_PORTRAIT | ORIENTATION_LANDSCAPE; - private MediaSize mMediaSize; private Resolution mResolution; private Margins mMargins; - private Tray mInputTray; - private Tray mOutputTray; - private int mDuplexMode; private int mColorMode; - private int mFittingMode; - private int mOrientation; PrintAttributes() { /* hide constructor */ @@ -92,12 +53,7 @@ public final class PrintAttributes implements Parcelable { mMediaSize = (parcel.readInt() == 1) ? MediaSize.createFromParcel(parcel) : null; mResolution = (parcel.readInt() == 1) ? Resolution.createFromParcel(parcel) : null; mMargins = (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null; - mInputTray = (parcel.readInt() == 1) ? Tray.createFromParcel(parcel) : null; - mOutputTray = (parcel.readInt() == 1) ? Tray.createFromParcel(parcel) : null; - mDuplexMode = parcel.readInt(); mColorMode = parcel.readInt(); - mFittingMode = parcel.readInt(); - mOrientation = parcel.readInt(); } /** @@ -161,71 +117,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the input tray. - * - * @return The input tray or <code>null</code> if not set. - */ - public Tray getInputTray() { - return mInputTray; - } - - /** - * Gets the input tray. - * - * @param The input tray. - * - * @hide - */ - public void setInputTray(Tray inputTray) { - mInputTray = inputTray; - } - - /** - * Gets the output tray. - * - * @return The output tray or <code>null</code> if not set. - */ - public Tray getOutputTray() { - return mOutputTray; - } - - /** - * Sets the output tray. - * - * @param The output tray. - * - * @hide - */ - public void setOutputTray(Tray outputTray) { - mOutputTray = outputTray; - } - - /** - * Gets the duplex mode. - * - * @return The duplex mode or zero if not set. - * - * @see #DUPLEX_MODE_NONE - * @see #DUPLEX_MODE_SHORT_EDGE - * @see #DUPLEX_MODE_LONG_EDGE - */ - public int getDuplexMode() { - return mDuplexMode; - } - - /** - * Sets the duplex mode. - * - * @param The duplex mode. - * - * @hide - */ - public void setDuplexMode(int duplexMode) { - enforceValidDuplexMode(duplexMode); - mDuplexMode = duplexMode; - } - - /** * Gets the color mode. * * @return The color mode or zero if not set. @@ -252,62 +143,6 @@ public final class PrintAttributes implements Parcelable { mColorMode = colorMode; } - /** - * Gets the fitting mode. - * - * @return The fitting mode or zero if not set. - * - * @see #FITTING_MODE_NONE - * @see #FITTING_MODE_SCALE_TO_FILL - * @see #FITTING_MODE_SCALE_TO_FIT - */ - public int getFittingMode() { - return mFittingMode; - } - - /** - * Sets the fitting mode. - * - * @param The fitting mode. - * - * @see #FITTING_MODE_NONE - * @see #FITTING_MODE_SCALE_TO_FILL - * @see #FITTING_MODE_SCALE_TO_FIT - * - * @hide - */ - public void setFittingMode(int fittingMode) { - enforceValidFittingMode(fittingMode); - mFittingMode = fittingMode; - } - - /** - * Gets the orientation. - * - * @return The orientation or zero if not set. - * - * @see #ORIENTATION_PORTRAIT - * @see #ORIENTATION_LANDSCAPE - */ - public int getOrientation() { - return mOrientation; - } - - /** - * Sets the orientation. - * - * @param The orientation. - * - * @see #ORIENTATION_PORTRAIT - * @see #ORIENTATION_LANDSCAPE - * - * @hide - */ - public void setOrientation(int orientation) { - enforceValidOrientation(orientation); - mOrientation = orientation; - } - @Override public void writeToParcel(Parcel parcel, int flags) { if (mMediaSize != null) { @@ -328,22 +163,7 @@ public final class PrintAttributes implements Parcelable { } else { parcel.writeInt(0); } - if (mInputTray != null) { - parcel.writeInt(1); - mInputTray.writeToParcel(parcel); - } else { - parcel.writeInt(0); - } - if (mOutputTray != null) { - parcel.writeInt(1); - mOutputTray.writeToParcel(parcel); - } else { - parcel.writeInt(0); - } - parcel.writeInt(mDuplexMode); parcel.writeInt(mColorMode); - parcel.writeInt(mFittingMode); - parcel.writeInt(mOrientation); } @Override @@ -356,13 +176,8 @@ public final class PrintAttributes implements Parcelable { final int prime = 31; int result = 1; result = prime * result + mColorMode; - result = prime * result + mDuplexMode; - result = prime * result + mFittingMode; - result = prime * result + mOrientation; - result = prime * result + ((mInputTray == null) ? 0 : mInputTray.hashCode()); result = prime * result + ((mMargins == null) ? 0 : mMargins.hashCode()); result = prime * result + ((mMediaSize == null) ? 0 : mMediaSize.hashCode()); - result = prime * result + ((mOutputTray == null) ? 0 : mOutputTray.hashCode()); result = prime * result + ((mResolution == null) ? 0 : mResolution.hashCode()); return result; } @@ -382,29 +197,6 @@ public final class PrintAttributes implements Parcelable { if (mColorMode != other.mColorMode) { return false; } - if (mDuplexMode != other.mDuplexMode) { - return false; - } - if (mFittingMode != other.mFittingMode) { - return false; - } - if (mOrientation != other.mOrientation) { - return false; - } - if (mInputTray == null) { - if (other.mInputTray != null) { - return false; - } - } else if (!mInputTray.equals(other.mInputTray)) { - return false; - } - if (mOutputTray == null) { - if (other.mOutputTray != null) { - return false; - } - } else if (!mOutputTray.equals(other.mOutputTray)) { - return false; - } if (mMargins == null) { if (other.mMargins != null) { return false; @@ -436,12 +228,7 @@ public final class PrintAttributes implements Parcelable { builder.append("mediaSize: ").append(mMediaSize); builder.append(", resolution: ").append(mResolution); builder.append(", margins: ").append(mMargins); - builder.append(", inputTray: ").append(mInputTray); - builder.append(", outputTray: ").append(mOutputTray); builder.append(", colorMode: ").append(colorModeToString(mColorMode)); - builder.append(", duplexMode: ").append(duplexModeToString(mDuplexMode)); - builder.append(", fittingMode: ").append(fittingModeToString(mFittingMode)); - builder.append(", orientation: ").append(orientationToString(mOrientation)); builder.append("}"); return builder.toString(); } @@ -451,12 +238,7 @@ public final class PrintAttributes implements Parcelable { mMediaSize = null; mResolution = null; mMargins = null; - mInputTray = null; - mOutputTray = null; - mDuplexMode = 0; mColorMode = 0; - mFittingMode = 0; - mOrientation = 0; } /** @@ -466,483 +248,200 @@ public final class PrintAttributes implements Parcelable { mMediaSize = other.mMediaSize; mResolution = other.mResolution; mMargins = other.mMargins; - mInputTray = other.mInputTray; - mOutputTray = other.mOutputTray; - mDuplexMode = other.mDuplexMode; mColorMode = other.mColorMode; - mFittingMode = other.mFittingMode; - mOrientation = other.mOrientation; } /** * This class specifies a supported media size. */ public static final class MediaSize { + private static final String LOG_TAG = "MediaSize"; // TODO: Verify media sizes and add more standard ones. // ISO sizes - /** - * ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A0 = 1; - - /** - * ISO A1 media size: 594mm x 841mm (23.39" x 33.11") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A1 = 2; - - /** - * - *ISO A2 media size: 420mm x 594mm (16.54" x 23.39") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A2 = 3; - - /** - * ISO A3 media size: 297mm x 420mm (11.69" x 16.54") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A3 = 4; - - /** - * ISO A4 media size: 210mm x 297mm (8.27" x 11.69") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A4 = 5; - - /** - * ISO A5 media size: 148mm x 210mm (5.83" x 8.27") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A5 = 6; - - /** - * ISO A6 media size: 105mm x 148mm (4.13" x 5.83") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A6 = 7; - - /** - * ISO A7 media size: 74mm x 105mm (2.91" x 4.13") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A7 = 8; - - /** - * ISO A8 media size: 52mm x 74mm (2.05" x 2.91") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A8 = 9; - - /** - * ISO A9 media size: 37mm x 52mm (1.46" x 2.05") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A9 = 10; - - /** - * ISO A10 media size: 26mm x 37mm (1.02" x 1.46") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_A10 = 11; - - - /** - * ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B0 = 100; - - /** - * ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B1 = 101; - - /** - * ISO B2 media size: 500mm x 707mm (19.69" x 27.83") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B2 = 102; - - /** - * ISO B3 media size: 353mm x 500mm (13.90" x 19.69") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B3 = 103; - - /** - * ISO B4 media size: 250mm x 353mm (9.84" x 13.90") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B4 = 104; - - /** - * ISO B5 media size: 176mm x 250mm (6.93" x 9.84") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B5 = 105; - - /** - * ISO B6 media size: 125mm x 176mm (4.92" x 6.93") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B6 = 106; - - /** - * ISO B7 media size: 88mm x 125mm (3.46" x 4.92") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B7 = 107; - - /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B8 = 108; - - /** - * ISO B9 media size: 44mm x 62mm (1.73" x 2.44") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B9 = 109; - - /** - * ISO B10 media size: 31mm x 44mm (1.22" x 1.73") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_B10 = 110; - - - /** - * ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C0 = 200; - - /** - * ISO C1 media size: 648mm x 917mm (25.51" x 36.10") - * - * @see #createMediaSize(PackageManager, int) - */ - - public static final int ISO_C1 = 201; - /** - * ISO C2 media size: 458mm x 648mm (18.03" x 25.51") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C2 = 202; - - /** - * ISO C3 media size: 324mm x 458mm (12.76" x 18.03") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C3 = 203; - - /** - * ISO C4 media size: 229mm x 324mm (9.02" x 12.76") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C4 = 204; - - /** - * ISO C5 media size: 162mm x 229mm (6.38" x 9.02") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C5 = 205; - - /** - * ISO C6 media size: 114mm x 162mm (4.49" x 6.38") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C6 = 206; - - /** - * ISO C7 media size: 81mm x 114mm (3.19" x 4.49") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C7 = 207; - - /** - * ISO C8 media size: 57mm x 81mm (2.24" x 3.19") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C8 = 208; - - /** - * ISO C9 media size: 40mm x 57mm (1.57" x 2.24") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C9 = 209; - - /** - * ISO C10 media size: 28mm x 40mm (1.10" x 1.57") - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int ISO_C10 = 210; - + /** ISO A0 media size: 841mm x 1189mm (33.11" x 46.81") */ + public static final MediaSize ISO_A0 = + new MediaSize("ISO_A0", "android", R.string.mediaSize_iso_a0, 33110, 46810); + /** ISO A1 media size: 594mm x 841mm (23.39" x 33.11") */ + public static final MediaSize ISO_A1 = + new MediaSize("ISO_A1", "android", R.string.mediaSize_iso_a1, 23390, 33110); + /** ISO A2 media size: 420mm x 594mm (16.54" x 23.39") */ + public static final MediaSize ISO_A2 = + new MediaSize("ISO_A2", "android", R.string.mediaSize_iso_a2, 16540, 23390); + /** ISO A3 media size: 297mm x 420mm (11.69" x 16.54") */ + public static final MediaSize ISO_A3 = + new MediaSize("ISO_A3", "android", R.string.mediaSize_iso_a3, 11690, 16540); + /** ISO A4 media size: 210mm x 297mm (8.27" x 11.69") */ + public static final MediaSize ISO_A4 = + new MediaSize("ISO_A4", "android", R.string.mediaSize_iso_a4, 8270, 11690); + /** ISO A5 media size: 148mm x 210mm (5.83" x 8.27") */ + public static final MediaSize ISO_A5 = + new MediaSize("ISO_A5", "android", R.string.mediaSize_iso_a5, 5830, 8270); + /** ISO A6 media size: 105mm x 148mm (4.13" x 5.83") */ + public static final MediaSize ISO_A6 = + new MediaSize("ISO_A6", "android", R.string.mediaSize_iso_a6, 4130, 5830); + /** ISO A7 media size: 74mm x 105mm (2.91" x 4.13") */ + public static final MediaSize ISO_A7 = + new MediaSize("ISO_A7", "android", R.string.mediaSize_iso_a7, 2910, 4130); + /** ISO A8 media size: 52mm x 74mm (2.05" x 2.91") */ + public static final MediaSize ISO_A8 = + new MediaSize("ISO_A8", "android", R.string.mediaSize_iso_a8, 2050, 2910); + /** ISO A9 media size: 37mm x 52mm (1.46" x 2.05") */ + public static final MediaSize ISO_A9 = + new MediaSize("ISO_A9", "android", R.string.mediaSize_iso_a9, 1460, 2050); + /** ISO A10 media size: 26mm x 37mm (1.02" x 1.46") */ + public static final MediaSize ISO_A10 = + new MediaSize("ISO_A10", "android", R.string.mediaSize_iso_a10, 1020, 1460); + + /** ISO B0 media size: 1000mm x 1414mm (39.37" x 55.67") */ + public static final MediaSize ISO_B0 = + new MediaSize("ISO_B0", "android", R.string.mediaSize_iso_b0, 39370, 55670); + /** ISO B1 media size: 707mm x 1000mm (27.83" x 39.37") */ + public static final MediaSize ISO_B1 = + new MediaSize("ISO_B1", "android", R.string.mediaSize_iso_b1, 27830, 39370); + /** ISO B2 media size: 500mm x 707mm (19.69" x 27.83") */ + public static final MediaSize ISO_B2 = + new MediaSize("ISO_B2", "android", R.string.mediaSize_iso_b2, 19690, 27830); + /** ISO B3 media size: 353mm x 500mm (13.90" x 19.69") */ + public static final MediaSize ISO_B3 = + new MediaSize("ISO_B3", "android", R.string.mediaSize_iso_b3, 13900, 19690); + /** ISO B4 media size: 250mm x 353mm (9.84" x 13.90") */ + public static final MediaSize ISO_B4 = + new MediaSize("ISO_B4", "android", R.string.mediaSize_iso_b4, 9840, 13900); + /** ISO B5 media size: 176mm x 250mm (6.93" x 9.84") */ + public static final MediaSize ISO_B5 = + new MediaSize("ISO_B5", "android", R.string.mediaSize_iso_b5, 6930, 9840); + /** ISO B6 media size: 125mm x 176mm (4.92" x 6.93") */ + public static final MediaSize ISO_B6 = + new MediaSize("ISO_B6", "android", R.string.mediaSize_iso_b6, 4920, 6930); + /** ISO B7 media size: 88mm x 125mm (3.46" x 4.92") */ + public static final MediaSize ISO_B7 = + new MediaSize("ISO_B7", "android", R.string.mediaSize_iso_b7, 3460, 4920); + /** ISO B8 media size: 62mm x 88mm (2.44" x 3.46") */ + public static final MediaSize ISO_B8 = + new MediaSize("ISO_B8", "android", R.string.mediaSize_iso_b8, 2440, 3460); + /** ISO B9 media size: 44mm x 62mm (1.73" x 2.44") */ + public static final MediaSize ISO_B9 = + new MediaSize("ISO_B9", "android", R.string.mediaSize_iso_b9, 1730, 2440); + /** ISO B10 media size: 31mm x 44mm (1.22" x 1.73") */ + public static final MediaSize ISO_B10 = + new MediaSize("ISO_B10", "android", R.string.mediaSize_iso_b10, 1220, 1730); + + /** ISO C0 media size: 917mm x 1297mm (36.10" x 51.06") */ + public static final MediaSize ISO_C0 = + new MediaSize("ISO_C0", "android", R.string.mediaSize_iso_c0, 36100, 51060); + /** ISO C1 media size: 648mm x 917mm (25.51" x 36.10") */ + public static final MediaSize ISO_C1 = + new MediaSize("ISO_C1", "android", R.string.mediaSize_iso_c1, 25510, 36100); + /** ISO C2 media size: 458mm x 648mm (18.03" x 25.51") */ + public static final MediaSize ISO_C2 = + new MediaSize("ISO_C2", "android", R.string.mediaSize_iso_c2, 18030, 25510); + /** ISO C3 media size: 324mm x 458mm (12.76" x 18.03") */ + public static final MediaSize ISO_C3 = + new MediaSize("ISO_C3", "android", R.string.mediaSize_iso_c3, 12760, 18030); + /** ISO C4 media size: 229mm x 324mm (9.02" x 12.76") */ + public static final MediaSize ISO_C4 = + new MediaSize("ISO_C4", "android", R.string.mediaSize_iso_c4, 9020, 12760); + /** ISO C5 media size: 162mm x 229mm (6.38" x 9.02") */ + public static final MediaSize ISO_C5 = + new MediaSize("ISO_C5", "android", R.string.mediaSize_iso_c5, 6380, 9020); + /** ISO C6 media size: 114mm x 162mm (4.49" x 6.38") */ + public static final MediaSize ISO_C6 = + new MediaSize("ISO_C6", "android", R.string.mediaSize_iso_c6, 4490, 6380); + /** ISO C7 media size: 81mm x 114mm (3.19" x 4.49") */ + public static final MediaSize ISO_C7 = + new MediaSize("ISO_C7", "android", R.string.mediaSize_iso_c7, 3190, 4490); + /** ISO C8 media size: 57mm x 81mm (2.24" x 3.19") */ + public static final MediaSize ISO_C8 = + new MediaSize("ISO_C8", "android", R.string.mediaSize_iso_c8, 2240, 3190); + /** ISO C9 media size: 40mm x 57mm (1.57" x 2.24") */ + public static final MediaSize ISO_C9 = + new MediaSize("ISO_C9", "android", R.string.mediaSize_iso_c9, 1570, 2240); + /** ISO C10 media size: 28mm x 40mm (1.10" x 1.57") */ + public static final MediaSize ISO_C10 = + new MediaSize("ISO_C10", "android", R.string.mediaSize_iso_c10, 1100, 1570); // North America - /** - * North America Letter media size: 8.5" x 11" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LETTER = 300; - - /** - * North America Government-Letter media size: 8.0" x 10.5" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_GOVT_LETTER = 301; - - /** - * North America Legal media size: 8.5" x 14" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LEGAL = 302; + /** North America Letter media size: 8.5" x 11" */ + public static final MediaSize NA_LETTER = + new MediaSize("NA_LETTER", "android", R.string.mediaSize_na_letter, 8500, 11000); + /** North America Government-Letter media size: 8.0" x 10.5" */ + public static final MediaSize NA_GOVT_LETTER = + new MediaSize("NA_GOVT_LETTER", "android", + R.string.mediaSize_na_gvrnmt_letter, 8000, 10500); + /** North America Legal media size: 8.5" x 14" */ + public static final MediaSize NA_LEGAL = + new MediaSize("NA_LEGAL", "android", R.string.mediaSize_na_legal, 8500, 14000); + /** North America Junior Legal media size: 8.0" x 5.0" */ + public static final MediaSize NA_JUNIOR_LEGAL = + new MediaSize("NA_JUNIOR_LEGAL", "android", + R.string.mediaSize_na_junior_legal, 8000, 5000); + /** North America Ledger media size: 17" x 11" */ + public static final MediaSize NA_LEDGER = + new MediaSize("NA_LEDGER", "android", R.string.mediaSize_na_ledger, 17000, 11000); + /** North America Tabloid media size: 11" x 17" */ + public static final MediaSize NA_TBLOID = + new MediaSize("NA_TABLOID", "android", + R.string.mediaSize_na_tabloid, 11000, 17000); - /** - * North America Junior Legal media size: 8.0" x 5.0" - * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_JUNIOR_LEGAL = 303; + private final String mId; + /**@hide */ + public final String mLabel; + /**@hide */ + public final String mPackageName; + /**@hide */ + public final int mLabelResId; + private final int mWidthMils; + private final int mHeightMils; /** - * North America Ledger media size: 17" x 11" + * Creates a new instance. This is the preferred constructor since + * it enables the media size label to be shown in a localized fashion + * on a locale change. * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_LEDGER = 304; - - /** - * North America Tabloid media size: 11" x 17" + * @param id The unique media size id. + * @param packageName The name of the creating package. + * @param labelResId The resource if of a human readable label. + * @param widthMils The width in mils (thousands of an inch). + * @param heightMils The height in mils (thousands of an inch). * - * @see #createMediaSize(PackageManager, int) - */ - public static final int NA_TBLOID = 305; - - /** - * Creates a standard media size with a localized label. + * @throws IllegalArgumentException If the id is empty. + * @throws IllegalArgumentException If the label is empty. + * @throws IllegalArgumentException If the widthMils is less than or equal to zero. + * @throws IllegalArgumentException If the heightMils is less than or equal to zero. * - * @param pm Package manager used to load the label. - * @param mediaSize Media size constant. - * @return A {@link MediaSize} instance with a localized label. + * @hide */ - public static MediaSize createMediaSize(PackageManager pm, int mediaSize) { - final Resources resources; - try { - resources = pm.getResourcesForApplication("android"); - } catch (NameNotFoundException nnfe) { - return null; + public MediaSize(String id, String packageName, int labelResId, + int widthMils, int heightMils) { + if (TextUtils.isEmpty(id)) { + throw new IllegalArgumentException("id cannot be empty."); } - switch (mediaSize) { - case ISO_A0: { - return new MediaSize("ISO_A0", resources - .getString(R.string.mediaSize_iso_a0), 33110, 46810); - } - case ISO_A1: { - return new MediaSize("ISO_A1", resources - .getString(R.string.mediaSize_iso_a1), 23390, 33110); - } - case ISO_A2: { - return new MediaSize("ISO_A2", resources - .getString(R.string.mediaSize_iso_a2), 16540, 23390); - } - case ISO_A3: { - return new MediaSize("ISO_A3", resources - .getString(R.string.mediaSize_iso_a3), 11690, 16540); - } - case ISO_A4: { - return new MediaSize("ISO_A4", resources - .getString(R.string.mediaSize_iso_a4), 8270, 11690); - } - case ISO_A5: { - return new MediaSize("ISO_A5", resources - .getString(R.string.mediaSize_iso_a5), 5830, 8270); - } - case ISO_A6: { - return new MediaSize("ISO_A6", resources - .getString(R.string.mediaSize_iso_a6), 4130, 5830); - } - case ISO_A7: { - return new MediaSize("ISO_A7", resources - .getString(R.string.mediaSize_iso_a7), 2910, 4130); - } - case ISO_A8: { - return new MediaSize("ISO_A8", resources - .getString(R.string.mediaSize_iso_a8), 2050, 2910); - } - case ISO_A9: { - return new MediaSize("ISO_A9", resources - .getString(R.string.mediaSize_iso_a9), 1460, 2050); - } - case ISO_A10: { - return new MediaSize("ISO_A10", resources - .getString(R.string.mediaSize_iso_a10), 1020, 1460); - } - case ISO_B0: { - return new MediaSize("ISO_B0", resources - .getString(R.string.mediaSize_iso_b0), 39370, 55670); - } - case ISO_B1: { - return new MediaSize("ISO_B1", resources - .getString(R.string.mediaSize_iso_b1), 27830, 39370); - } - case ISO_B2: { - return new MediaSize("ISO_B2", resources - .getString(R.string.mediaSize_iso_b2), 19690, 27830); - } - case ISO_B3: { - return new MediaSize("ISO_B3", resources - .getString(R.string.mediaSize_iso_b3), 13900, 19690); - } - case ISO_B4: { - return new MediaSize("ISO_B4", resources - .getString(R.string.mediaSize_iso_b4), 9840, 13900); - } - case ISO_B5: { - return new MediaSize("ISO_B5", resources - .getString(R.string.mediaSize_iso_b5), 6930, 9840); - } - case ISO_B6: { - return new MediaSize("ISO_B6", resources - .getString(R.string.mediaSize_iso_b6), 4920, 6930); - } - case ISO_B7: { - return new MediaSize("ISO_B7", resources - .getString(R.string.mediaSize_iso_b7), 3460, 4920); - } - case ISO_B8: { - return new MediaSize("ISO_B8", resources - .getString(R.string.mediaSize_iso_b8), 2440, 3460); - } - case ISO_B9: { - return new MediaSize("ISO_B9", resources - .getString(R.string.mediaSize_iso_b9), 1730, 2440); - } - case ISO_B10: { - return new MediaSize("ISO_B10", resources - .getString(R.string.mediaSize_iso_b10), 1220, 1730); - } - case ISO_C0: { - return new MediaSize("ISO_C0", resources - .getString(R.string.mediaSize_iso_c0), 36100, 51060); - } - case ISO_C1: { - return new MediaSize("ISO_C1", resources - .getString(R.string.mediaSize_iso_c1), 25510, 36100); - } - case ISO_C2: { - return new MediaSize("ISO_C2", resources - .getString(R.string.mediaSize_iso_c2), 18030, 25510); - } - case ISO_C3: { - return new MediaSize("ISO_C3", resources - .getString(R.string.mediaSize_iso_c3), 12760, 18030); - } - case ISO_C4: { - return new MediaSize("ISO_C4", resources - .getString(R.string.mediaSize_iso_c4), 9020, 12760); - } - case ISO_C5: { - return new MediaSize("ISO_C5", resources - .getString(R.string.mediaSize_iso_c5), 6380, 9020); - } - case ISO_C6: { - return new MediaSize("ISO_C6", resources - .getString(R.string.mediaSize_iso_c6), 4490, 6380); - } - case ISO_C7: { - return new MediaSize("ISO_C7", resources - .getString(R.string.mediaSize_iso_c7), 3190, 4490); - } - case ISO_C8: { - return new MediaSize("ISO_C8", resources - .getString(R.string.mediaSize_iso_c8), 2240, 3190); - } - case ISO_C9: { - return new MediaSize("ISO_C9", resources - .getString(R.string.mediaSize_iso_c9), 1570, 2240); - } - case ISO_C10: { - return new MediaSize("ISO_C10", resources - .getString(R.string.mediaSize_iso_c10), 1100, 1570); - } - case NA_LETTER: { - return new MediaSize("NA_LETTER", resources - .getString(R.string.mediaSize_na_letter), 8500, 11000); - } - case NA_GOVT_LETTER: { - return new MediaSize("NA_GOVT_LETTER", resources - .getString(R.string.mediaSize_na_gvrnmt_letter), 8000, 10500); - } - case NA_LEGAL: { - return new MediaSize("NA_LEGAL", resources - .getString(R.string.mediaSize_na_legal), 8500, 14000); - } - case NA_JUNIOR_LEGAL: { - return new MediaSize("NA_JUNIOR_LEGAL", resources - .getString(R.string.mediaSize_na_junior_legal), 8000, 5000); - } - case NA_LEDGER: { - return new MediaSize("NA_LEDGER", resources - .getString(R.string.mediaSize_na_ledger), 17000, 11000); - } - case NA_TBLOID: { - return new MediaSize("NA_TABLOID", resources - .getString(R.string.mediaSize_na_tabloid), 11000, 17000); - } - default: { - throw new IllegalArgumentException("Unknown media size."); - } + if (TextUtils.isEmpty(packageName)) { + throw new IllegalArgumentException("packageName cannot be empty."); + } + if (labelResId <= 0) { + throw new IllegalArgumentException("labelResId must be greater than zero."); + } + if (widthMils <= 0) { + throw new IllegalArgumentException("widthMils " + + "cannot be less than or equal to zero."); } + if (heightMils <= 0) { + throw new IllegalArgumentException("heightMils " + + "cannot be less than or euqual to zero."); + } + mPackageName = packageName; + mId = id; + mLabelResId = labelResId; + mWidthMils = widthMils; + mHeightMils = heightMils; + mLabel = null; } - private final String mId; - private final String mLabel; - private final int mWidthMils; - private final int mHeightMils; - /** * Creates a new instance. * @@ -975,6 +474,19 @@ public final class PrintAttributes implements Parcelable { mLabel = label; mWidthMils = widthMils; mHeightMils = heightMils; + mLabelResId = 0; + mPackageName = null; + } + + /** @hide */ + public MediaSize(String id, String label, String packageName, + int widthMils, int heightMils, int labelResId) { + mPackageName = packageName; + mId = id; + mLabelResId = labelResId; + mWidthMils = widthMils; + mHeightMils = heightMils; + mLabel = label; } /** @@ -989,9 +501,22 @@ public final class PrintAttributes implements Parcelable { /** * Gets the human readable media size label. * + * @param packageManager The package manager for loading the label. * @return The human readable label. */ - public String getLabel() { + public String getLabel(PackageManager packageManager) { + if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) { + try { + return packageManager.getResourcesForApplication( + mPackageName).getString(mLabelResId); + } catch (NotFoundException nfe) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } catch (NameNotFoundException nnfee) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } + } return mLabel; } @@ -1013,17 +538,58 @@ public final class PrintAttributes implements Parcelable { return mHeightMils; } + /** + * Gets whether this media size is in portrait which is the + * height is greater or equal to the width. + * + * @return True if the media size is in portrait, false if + * it is in landscape. + */ + public boolean isPortrait() { + return mHeightMils >= mWidthMils; + } + + /** + * Returns a new media size in a portrait orientation + * which is the height is the greater dimension. + * + * @return New instance in landscape orientation. + */ + public MediaSize asPortrait() { + return new MediaSize(mId, mLabel, mPackageName, + Math.min(mWidthMils, mHeightMils), + Math.max(mWidthMils, mHeightMils), + mLabelResId); + } + + /** + * Returns a new media size in a landscape orientation + * which is the height is the lesser dimension. + * + * @return New instance in landscape orientation. + */ + public MediaSize asLandscape() { + return new MediaSize(mId, mLabel, mPackageName, + Math.max(mWidthMils, mHeightMils), + Math.min(mWidthMils, mHeightMils), + mLabelResId); + } + void writeToParcel(Parcel parcel) { parcel.writeString(mId); parcel.writeString(mLabel); + parcel.writeString(mPackageName); parcel.writeInt(mWidthMils); parcel.writeInt(mHeightMils); + parcel.writeInt(mLabelResId); } static MediaSize createFromParcel(Parcel parcel) { return new MediaSize( parcel.readString(), parcel.readString(), + parcel.readString(), + parcel.readInt(), parcel.readInt(), parcel.readInt()); } @@ -1032,8 +598,6 @@ public final class PrintAttributes implements Parcelable { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); result = prime * result + mWidthMils; result = prime * result + mHeightMils; return result; @@ -1051,12 +615,6 @@ public final class PrintAttributes implements Parcelable { return false; } MediaSize other = (MediaSize) obj; - if (!TextUtils.equals(mId, other.mId)) { - return false; - } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } if (mWidthMils != other.mWidthMils) { return false; } @@ -1072,8 +630,10 @@ public final class PrintAttributes implements Parcelable { builder.append("MediaSize{"); builder.append("id: ").append(mId); builder.append(", label: ").append(mLabel); + builder.append(", packageName: ").append(mPackageName); builder.append(", heightMils: ").append(mHeightMils); builder.append(", widthMils: ").append(mWidthMils); + builder.append(", labelResId: ").append(mLabelResId); builder.append("}"); return builder.toString(); } @@ -1083,12 +643,64 @@ public final class PrintAttributes implements Parcelable { * This class specifies a supported resolution in dpi (dots per inch). */ public static final class Resolution { + private static final String LOG_TAG = "Resolution"; + private final String mId; - private final String mLabel; + /**@hide */ + public final String mLabel; + /**@hide */ + public final String mPackageName; + /**@hide */ + public final int mLabelResId; private final int mHorizontalDpi; private final int mVerticalDpi; /** + * Creates a new instance. This is the preferred constructor since + * it enables the resolution label to be shown in a localized fashion + * on a locale change. + * + * @param id The unique resolution id. + * @param packageName The name of the creating package. + * @param labelResId The resource id of a human readable label. + * @param horizontalDpi The horizontal resolution in dpi. + * @param verticalDpi The vertical resolution in dpi. + * + * @throws IllegalArgumentException If the id is empty. + * @throws IllegalArgumentException If the label is empty. + * @throws IllegalArgumentException If the horizontalDpi is less than or equal to zero. + * @throws IllegalArgumentException If the verticalDpi is less than or equal to zero. + * + * @hide + */ + public Resolution(String id, String packageName, int labelResId, + int horizontalDpi, int verticalDpi) { + if (TextUtils.isEmpty(id)) { + throw new IllegalArgumentException("id cannot be empty."); + } + if (TextUtils.isEmpty(packageName)) { + throw new IllegalArgumentException("packageName cannot be empty."); + } + if (labelResId <= 0) { + throw new IllegalArgumentException("labelResId must be greater than zero."); + } + if (horizontalDpi <= 0) { + throw new IllegalArgumentException("horizontalDpi " + + "cannot be less than or equal to zero."); + } + if (verticalDpi <= 0) { + throw new IllegalArgumentException("verticalDpi" + + " cannot be less than or equal to zero."); + } + mId = id; + mPackageName = packageName; + mLabelResId = labelResId; + mHorizontalDpi = horizontalDpi; + mVerticalDpi = verticalDpi; + mLabel = null; + } + + /** * Creates a new instance. * * @param id The unique resolution id. @@ -1120,6 +732,19 @@ public final class PrintAttributes implements Parcelable { mLabel = label; mHorizontalDpi = horizontalDpi; mVerticalDpi = verticalDpi; + mPackageName = null; + mLabelResId = 0; + } + + /** @hide */ + public Resolution(String id, String label, String packageName, + int horizontalDpi, int verticalDpi, int labelResId) { + mId = id; + mPackageName = packageName; + mLabelResId = labelResId; + mHorizontalDpi = horizontalDpi; + mVerticalDpi = verticalDpi; + mLabel = label; } /** @@ -1134,14 +759,27 @@ public final class PrintAttributes implements Parcelable { /** * Gets the resolution human readable label. * + * @param packageManager The package manager for loading the label. * @return The human readable label. */ - public String getLabel() { + public String getLabel(PackageManager packageManager) { + if (!TextUtils.isEmpty(mPackageName) && mLabelResId > 0) { + try { + return packageManager.getResourcesForApplication( + mPackageName).getString(mLabelResId); + } catch (NotFoundException nfe) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } catch (NameNotFoundException nnfee) { + Log.w(LOG_TAG, "Could not load resouce" + mLabelResId + + " from package " + mPackageName); + } + } return mLabel; } /** - * Gets the horizontal resolution in dpi. + * Gets the vertical resolution in dpi. * * @return The horizontal resolution. */ @@ -1161,14 +799,18 @@ public final class PrintAttributes implements Parcelable { void writeToParcel(Parcel parcel) { parcel.writeString(mId); parcel.writeString(mLabel); + parcel.writeString(mPackageName); parcel.writeInt(mHorizontalDpi); parcel.writeInt(mVerticalDpi); + parcel.writeInt(mLabelResId); } static Resolution createFromParcel(Parcel parcel) { return new Resolution( parcel.readString(), parcel.readString(), + parcel.readString(), + parcel.readInt(), parcel.readInt(), parcel.readInt()); } @@ -1177,8 +819,6 @@ public final class PrintAttributes implements Parcelable { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); result = prime * result + mHorizontalDpi; result = prime * result + mVerticalDpi; return result; @@ -1196,12 +836,6 @@ public final class PrintAttributes implements Parcelable { return false; } Resolution other = (Resolution) obj; - if (!TextUtils.equals(mId, other.mId)) { - return false; - } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } if (mHorizontalDpi != other.mHorizontalDpi) { return false; } @@ -1217,8 +851,10 @@ public final class PrintAttributes implements Parcelable { builder.append("Resolution{"); builder.append("id: ").append(mId); builder.append(", label: ").append(mLabel); + builder.append(", packageName: ").append(mPackageName); builder.append(", horizontalDpi: ").append(mHorizontalDpi); builder.append(", verticalDpi: ").append(mVerticalDpi); + builder.append(", labelResId: ").append(mLabelResId); builder.append("}"); return builder.toString(); } @@ -1358,120 +994,6 @@ public final class PrintAttributes implements Parcelable { } } - /** - * Represents a printer tray. - */ - public static final class Tray { - private final String mId; - private final String mLabel; - - /** - * Creates a new instance. - * - * @param id The unique tray id. - * @param label The <strong>internationalized</strong> human readable label. - * - * @throws IllegalArgumentException If the id is empty. - * @throws IllegalArgumentException If the label is empty. - */ - public Tray(String id, String label) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("id cannot be empty."); - } - if (TextUtils.isEmpty(label)) { - throw new IllegalArgumentException("label cannot be empty."); - } - mId = id; - mLabel = label; - } - - /** - * Gets the unique tray id. - * - * @return The unique tray id. - */ - public String getId() { - return mId; - } - - /** - * Gets the tray human readable label. - * - * @return The human readable label. - */ - public String getLabel() { - return mLabel; - } - - void writeToParcel(Parcel parcel) { - parcel.writeString(mId); - parcel.writeString(mLabel); - } - - static Tray createFromParcel(Parcel parcel) { - return new Tray( - parcel.readString(), - parcel.readString()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((mId == null) ? 0 : mId.hashCode()); - result = prime * result + ((mLabel == null) ? 0 : mLabel.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - Tray other = (Tray) obj; - if (!TextUtils.equals(mId, other.mId)) { - return false; - } - if (!TextUtils.equals(mLabel, other.mLabel)) { - return false; - } - return true; - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Tray{"); - builder.append("id: ").append(mId); - builder.append("id: ").append(mId); - builder.append(", label: ").append(mLabel); - builder.append("}"); - return builder.toString(); - } - } - - static String duplexModeToString(int duplexMode) { - switch (duplexMode) { - case DUPLEX_MODE_NONE: { - return "DUPLEX_MODE_NONE"; - } - case DUPLEX_MODE_LONG_EDGE: { - return "DUPLEX_MODE_LONG_EDGE"; - } - case DUPLEX_MODE_SHORT_EDGE: { - return "DUPLEX_MODE_SHORT_EDGE"; - } - default: - return "DUPLEX_MODE_UNKNOWN"; - } - } - static String colorModeToString(int colorMode) { switch (colorMode) { case COLOR_MODE_MONOCHROME: { @@ -1485,59 +1007,12 @@ public final class PrintAttributes implements Parcelable { } } - static String orientationToString(int orientation) { - switch (orientation) { - case ORIENTATION_PORTRAIT: { - return "ORIENTATION_PORTRAIT"; - } - case ORIENTATION_LANDSCAPE: { - return "ORIENTATION_LANDSCAPE"; - } - default: - return "ORIENTATION_UNKNOWN"; - } - } - - static String fittingModeToString(int fittingMode) { - switch (fittingMode) { - case FITTING_MODE_NONE: { - return "FITTING_MODE_NONE"; - } - case FITTING_MODE_SCALE_TO_FIT: { - return "FITTING_MODE_SCALE_TO_FIT"; - } - case FITTING_MODE_SCALE_TO_FILL: { - return "FITTING_MODE_SCALE_TO_FILL"; - } - default: - return "FITTING_MODE_UNKNOWN"; - } - } - - static void enforceValidDuplexMode(int duplexMode) { - if ((duplexMode & VALID_DUPLEX_MODES) == 0 && Integer.bitCount(duplexMode) == 1) { - throw new IllegalArgumentException("invalid duplex mode: " + duplexMode); - } - } - static void enforceValidColorMode(int colorMode) { if ((colorMode & VALID_COLOR_MODES) == 0 && Integer.bitCount(colorMode) == 1) { throw new IllegalArgumentException("invalid color mode: " + colorMode); } } - static void enforceValidFittingMode(int fittingMode) { - if ((fittingMode & VALID_FITTING_MODES) == 0 && Integer.bitCount(fittingMode) == 1) { - throw new IllegalArgumentException("invalid fitting mode: " + fittingMode); - } - } - - static void enforceValidOrientation(int orientation) { - if ((orientation & VALID_ORIENTATIONS) == 0 && Integer.bitCount(orientation) == 1) { - throw new IllegalArgumentException("invalid orientation: " + orientation); - } - } - /** * Builder for creating {@link PrintAttributes}. */ @@ -1578,46 +1053,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the input tray. - * - * @param inputTray The tray. - * @return This builder. - */ - public Builder setInputTray(Tray inputTray) { - mAttributes.setInputTray(inputTray); - return this; - } - - /** - * Sets the output tray. - * - * @param outputTray The tray. - * @return This builder. - */ - public Builder setOutputTray(Tray outputTray) { - mAttributes.setOutputTray(outputTray); - return this; - } - - /** - * Sets the duplex mode. - * - * @param duplexMode A valid duplex mode or zero. - * @return This builder. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - */ - public Builder setDuplexMode(int duplexMode) { - if (Integer.bitCount(duplexMode) > 1) { - throw new IllegalArgumentException("can specify at most one duplexMode bit."); - } - mAttributes.setDuplexMode(duplexMode); - return this; - } - - /** * Sets the color mode. * * @param colorMode A valid color mode or zero. @@ -1635,40 +1070,6 @@ public final class PrintAttributes implements Parcelable { } /** - * Sets the fitting mode. - * - * @param fittingMode A valid fitting mode or zero. - * @return This builder. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public Builder setFittingMode(int fittingMode) { - if (Integer.bitCount(fittingMode) > 1) { - throw new IllegalArgumentException("can specify at most one fittingMode bit."); - } - mAttributes.setFittingMode(fittingMode); - return this; - } - - /** - * Sets the orientation. - * - * @param orientation A valid orientation or zero. - * @return This builder. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public Builder setOrientation(int orientation) { - if (Integer.bitCount(orientation) > 1) { - throw new IllegalArgumentException("can specify at most one orientation bit."); - } - mAttributes.setOrientation(orientation); - return this; - } - - /** * Creates a new {@link PrintAttributes} instance. * * @return The new instance. diff --git a/core/java/android/print/PrintDocumentAdapter.java b/core/java/android/print/PrintDocumentAdapter.java index 33b4aad58ade..c81ca95413ca 100644 --- a/core/java/android/print/PrintDocumentAdapter.java +++ b/core/java/android/print/PrintDocumentAdapter.java @@ -55,7 +55,7 @@ import java.util.List; * The APIs defined in this class are designed to enable doing part or all * of the work on an arbitrary thread. For example, if the printed content * does not depend on the UI state, i.e. on what is shown on the screen, then - * you can off load the entire work on a dedicated thread, thus making your + * you can offload the entire work on a dedicated thread, thus making your * application interactive while the print work is being performed. * </p> * <p> @@ -99,28 +99,7 @@ public abstract class PrintDocumentAdapter { * the last argument <code>true</code> or <code>false</code> depending on * whether the layout changed the content or not, respectively; and {@link * LayoutResultCallback#onLayoutFailed(CharSequence)}, if an error occurred. - * </p> - * <p> - * When doing a layout you may satisfy some of the constraints in the print - * attributes such as applying the appropriate fitting, emitting content in the - * requested orientation, using the specified margins, generating content with - * the desired color mode, producing output with the given media size. Ideally, - * you will satisfy all of these constraints. It is important that if you - * satisfy a given constraint, you update the {@link PrintDocumentInfo} that - * is returned in the given {@link LayoutResultCallback}. This way the printer - * will have more accurate information about the content, thus producing a - * better output. For example, assume that your application is printing - * an image and the print attributes request landscape and fitting mode scale - * to fill. The result of this operation should be the entire media is filled - * and the content is rotated ninety degrees. In this case it is beneficial - * you do the rotation and select a higher resolution image to utilize - * the wider media (the height is now the width), rather to use a lower - * resolution image that is later stretched by the printer. If you applied - * the rotation you have to update the returned print document info to - * reflect that the content is already in landscape by calling - * {@link PrintDocumentInfo.Builder#setOrientation(int)} with {@link - * PrintAttributes#ORIENTATION_LANDSCAPE}. In this case the printer does not - * have to rotate the content. + * Note that you must call one of the methods of the given callback. * </p> * <p> * <strong>Note:</strong> If the content is large and a layout will be @@ -147,13 +126,14 @@ public abstract class PrintDocumentAdapter { /** * Called when specific pages of the content should be written in the - * from of a PDF file to the given file descriptor. This method is invoked + * form of a PDF file to the given file descriptor. This method is invoked * on the main thread. *<p> * After you are done writing, you should close the file descriptor and - * invoke {@link WriteResultCallback #onWriteFinished(List)}, if writing + * invoke {@link WriteResultCallback #onWriteFinished(PageRange[]), if writing * completed successfully; or {@link WriteResultCallback#onWriteFailed( - * CharSequence)}, if an error occurred. + * CharSequence)}, if an error occurred. Note that you must call one of + * the methods of the given callback. * </p> * <p> * <strong>Note:</strong> If the printed content is large, it is a good diff --git a/core/java/android/print/PrintDocumentInfo.java b/core/java/android/print/PrintDocumentInfo.java index f2b91ae93c7e..7a96e691fa16 100644 --- a/core/java/android/print/PrintDocumentInfo.java +++ b/core/java/android/print/PrintDocumentInfo.java @@ -18,8 +18,6 @@ package android.print; import android.os.Parcel; import android.os.Parcelable; -import android.print.PrintAttributes.Margins; -import android.print.PrintAttributes.MediaSize; import android.text.TextUtils; /** @@ -28,11 +26,6 @@ import android.text.TextUtils; public final class PrintDocumentInfo implements Parcelable { /** - * Constant for an unknown media size. - */ - public static final MediaSize MEDIA_SIZE_UNKNOWN = new MediaSize("Unknown", "Unknown", 1, 1); - - /** * Constant for unknown page count.. */ public static final int PAGE_COUNT_UNKNOWN = -1; @@ -55,11 +48,6 @@ public final class PrintDocumentInfo implements Parcelable { private String mName; private int mPageCount; private int mContentType; - private int mOrientation; - private int mFittingMode; - private int mColorMode; - private Margins mMargins; - private MediaSize mMediaSize; private long mDataSize; /** @@ -78,11 +66,6 @@ public final class PrintDocumentInfo implements Parcelable { mName = prototype.mName; mPageCount = prototype.mPageCount; mContentType = prototype.mContentType; - mOrientation = prototype.mOrientation; - mFittingMode = prototype.mFittingMode; - mColorMode = prototype.mColorMode; - mMargins = prototype.mMargins; - mMediaSize = prototype.mMediaSize; mDataSize = prototype.mDataSize; } @@ -95,11 +78,6 @@ public final class PrintDocumentInfo implements Parcelable { mName = parcel.readString(); mPageCount = parcel.readInt(); mContentType = parcel.readInt(); - mOrientation = parcel.readInt(); - mFittingMode = parcel.readInt(); - mColorMode = parcel.readInt(); - mMargins = Margins.createFromParcel(parcel); - mMediaSize = MediaSize.createFromParcel(parcel); mDataSize = parcel.readLong(); } @@ -137,61 +115,6 @@ public final class PrintDocumentInfo implements Parcelable { } /** - * Gets the document orientation. - * - * @return The orientation. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE - */ - public int getOrientation() { - return mOrientation; - } - - /** - * Gets the document fitting mode. - * - * @return The fitting mode. - * - * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT - */ - public int getFittingMode() { - return mFittingMode; - } - - /** - * Gets document color mode. - * - * @return The color mode. - * - * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR - * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME - */ - public int getColorMode() { - return mColorMode; - } - - /** - * Gets the document margins. - * - * @return The margins. - */ - public Margins getMargins() { - return mMargins; - } - - /** - * Gets the media size. - * - * @return The media size. - */ - public MediaSize getMediaSize() { - return mMediaSize; - } - - /** * Gets the document data size in bytes. * * @return The data size. @@ -221,11 +144,6 @@ public final class PrintDocumentInfo implements Parcelable { parcel.writeString(mName); parcel.writeInt(mPageCount); parcel.writeInt(mContentType); - parcel.writeInt(mOrientation); - parcel.writeInt(mFittingMode); - parcel.writeInt(mColorMode); - mMargins.writeToParcel(parcel); - mMediaSize.writeToParcel(parcel); parcel.writeLong(mDataSize); } @@ -236,11 +154,6 @@ public final class PrintDocumentInfo implements Parcelable { result = prime * result + ((mName != null) ? mName.hashCode() : 0); result = prime * result + mContentType; result = prime * result + mPageCount; - result = prime * result + mOrientation; - result = prime * result + mFittingMode; - result = prime * result + mColorMode; - result = prime * result + (mMargins != null ? mMargins.hashCode() : 0); - result = prime * result + (mMediaSize != null ? mMediaSize.hashCode() : 0); result = prime * result + (int) mDataSize; result = prime * result + (int) mDataSize >> 32; return result; @@ -267,29 +180,6 @@ public final class PrintDocumentInfo implements Parcelable { if (mPageCount != other.mPageCount) { return false; } - if (mOrientation != other.mOrientation) { - return false; - } - if (mFittingMode != other.mFittingMode) { - return false; - } - if (mColorMode != other.mColorMode) { - return false; - } - if (mMargins == null) { - if (other.mMargins != null) { - return false; - } - } else if (!mMargins.equals(other.mMargins)) { - return false; - } - if (mMediaSize == null) { - if (other.mMediaSize != null) { - return false; - } - } else if (!mMediaSize.equals(other.mMediaSize)) { - return false; - } if (mDataSize != other.mDataSize) { return false; } @@ -303,11 +193,6 @@ public final class PrintDocumentInfo implements Parcelable { builder.append("name=").append(mName); builder.append(", pageCount=").append(mPageCount); builder.append(", contentType=").append(contentTyepToString(mContentType)); - builder.append(", orientation=").append(PrintAttributes.orientationToString(mOrientation)); - builder.append(", fittingMode=").append(PrintAttributes.fittingModeToString(mFittingMode)); - builder.append(", colorMode=").append(PrintAttributes.colorModeToString(mColorMode)); - builder.append(", margins=").append(mMargins); - builder.append(", mediaSize=").append(mMediaSize); builder.append(", size=").append(mDataSize); builder.append("}"); return builder.toString(); @@ -336,36 +221,6 @@ public final class PrintDocumentInfo implements Parcelable { /** * Constructor. * <p> - * The values of the relevant properties are initialized from the - * provided print attributes. For example, the orientation is set - * to be the same as the orientation returned by calling {@link - * PrintAttributes#getOrientation() PrintAttributes.getOrientation()}. - * </p> - * - * @param name The document name. Cannot be empty. - * @param attributes Print attributes. Cannot be null. - * - * @throws IllegalArgumentException If the name is empty. - */ - public Builder(String name, PrintAttributes attributes) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name cannot be empty"); - } - if (attributes == null) { - throw new IllegalArgumentException("attributes cannot be null"); - } - mPrototype = new PrintDocumentInfo(); - mPrototype.mName = name; - mPrototype.mOrientation = attributes.getOrientation(); - mPrototype.mFittingMode = attributes.getFittingMode(); - mPrototype.mColorMode = attributes.getColorMode(); - mPrototype.mMargins = attributes.getMargins(); - mPrototype.mMediaSize = attributes.getMediaSize(); - } - - /** - * Constructor. - * <p> * The values of the relevant properties are initialized with default * values. Please refer to the documentation of the individual setters * for information about the default values. @@ -379,11 +234,6 @@ public final class PrintDocumentInfo implements Parcelable { } mPrototype = new PrintDocumentInfo(); mPrototype.mName = name; - mPrototype.mOrientation = PrintAttributes.ORIENTATION_PORTRAIT; - mPrototype.mFittingMode = PrintAttributes.FITTING_MODE_NONE; - mPrototype.mColorMode = PrintAttributes.COLOR_MODE_COLOR; - mPrototype.mMargins = Margins.NO_MARGINS; - mPrototype.mMediaSize = MEDIA_SIZE_UNKNOWN; } /** @@ -423,95 +273,6 @@ public final class PrintDocumentInfo implements Parcelable { } /** - * Sets the orientation. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#ORIENTATION_PORTRAIT - * PrintAttributes.ORIENTATION_PORTRAIT} - * </p> - * - * @param orientation The orientation. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE - */ - public Builder setOrientation(int orientation) { - PrintAttributes.enforceValidOrientation(orientation); - mPrototype.mOrientation = orientation; - return this; - } - - /** - * Sets the content fitting mode. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#FITTING_MODE_NONE - * PrintAttributes.FITTING_MODE_NONE} - * </p> - * - * @param fittingMode The fitting mode. - * - * @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL - * @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT - */ - public Builder setFittingMode(int fittingMode) { - PrintAttributes.enforceValidFittingMode(fittingMode); - mPrototype.mFittingMode = fittingMode; - return this; - } - - /** - * Sets the content color mode. - * <p> - * <strong>Default: </strong> {@link PrintAttributes#COLOR_MODE_COLOR - * PrintAttributes.COLOR_MODE_COLOR} - * </p> - * - * @param colorMode The color mode. - * - * @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR - * @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME - */ - public Builder setColorMode(int colorMode) { - PrintAttributes.enforceValidColorMode(colorMode); - mPrototype.mColorMode = colorMode; - return this; - } - - /** - * Sets the document margins. - * <p> - * <strong>Default: </strong> {@link PrintAttributes.Margins#NO_MARGINS Margins.NO_MARGINS} - * </p> - * - * @param margins The margins. Cannot be null. - */ - public Builder setMargins(Margins margins) { - if (margins == null) { - throw new IllegalArgumentException("margins cannot be null"); - } - mPrototype.mMargins = margins; - return this; - } - - /** - * Sets the document media size. - * <p> - * <strong>Default: </strong>#MEDIA_SIZE_UNKNOWN - * </p> - * - * @param mediaSize The media size. Cannot be null. - * - * @see #MEDIA_SIZE_UNKNOWN - */ - public Builder setMediaSize(MediaSize mediaSize) { - if (mediaSize == null) { - throw new IllegalArgumentException("media size cannot be null"); - } - mPrototype.mMediaSize = mediaSize; - return this; - } - - /** * Creates a new {@link PrintDocumentInfo} instance. * * @return The new instance. diff --git a/core/java/android/print/PrintFileDocumentAdapter.java b/core/java/android/print/PrintFileDocumentAdapter.java index b9053961baf7..c3a23a53e426 100644 --- a/core/java/android/print/PrintFileDocumentAdapter.java +++ b/core/java/android/print/PrintFileDocumentAdapter.java @@ -36,10 +36,11 @@ import java.io.InputStream; import java.io.OutputStream; /** - * Adapter for printing files. This class could be useful if you + * Adapter for printing PDF files. This class could be useful if you * want to print a file and intercept when the system is ready - * spooling the data, so you can deleted the file if it is a - * temporary one. + * 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. */ public class PrintFileDocumentAdapter extends PrintDocumentAdapter { @@ -57,7 +58,7 @@ public class PrintFileDocumentAdapter extends PrintDocumentAdapter { * Constructor. * * @param context Context for accessing resources. - * @param file The file to print. + * @param file The PDF file to print. * @param documentInfo The information about the printed file. */ public PrintFileDocumentAdapter(Context context, File file, diff --git a/core/java/android/print/PrinterCapabilitiesInfo.java b/core/java/android/print/PrinterCapabilitiesInfo.java index 941e6e1f7d2c..ea44c876672a 100644 --- a/core/java/android/print/PrinterCapabilitiesInfo.java +++ b/core/java/android/print/PrinterCapabilitiesInfo.java @@ -21,7 +21,6 @@ import android.os.Parcelable; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; -import android.print.PrintAttributes.Tray; import java.util.ArrayList; import java.util.Arrays; @@ -40,26 +39,16 @@ public final class PrinterCapabilitiesInfo implements Parcelable { private static final int PROPERTY_MEDIA_SIZE = 0; private static final int PROPERTY_RESOLUTION = 1; - private static final int PROPERTY_INPUT_TRAY = 2; - private static final int PROPERTY_OUTPUT_TRAY = 3; - private static final int PROPERTY_DUPLEX_MODE = 4; - private static final int PROPERTY_COLOR_MODE = 5; - private static final int PROPERTY_FITTING_MODE = 6; - private static final int PROPERTY_ORIENTATION = 7; - private static final int PROPERTY_COUNT = 8; + private static final int PROPERTY_COLOR_MODE = 2; + private static final int PROPERTY_COUNT = 3; private static final Margins DEFAULT_MARGINS = new Margins(0, 0, 0, 0); private Margins mMinMargins = DEFAULT_MARGINS; private List<MediaSize> mMediaSizes; private List<Resolution> mResolutions; - private List<Tray> mInputTrays; - private List<Tray> mOutputTrays; - private int mDuplexModes; private int mColorModes; - private int mFittingModes; - private int mOrientations; private final int[] mDefaults = new int[PROPERTY_COUNT]; private Margins mDefaultMargins = DEFAULT_MARGINS; @@ -106,32 +95,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable { mResolutions = null; } - if (other.mInputTrays != null) { - if (mInputTrays != null) { - mInputTrays.clear(); - mInputTrays.addAll(other.mInputTrays); - } else { - mInputTrays = new ArrayList<Tray>(other.mInputTrays); - } - } else { - mInputTrays = null; - } - - if (other.mOutputTrays != null) { - if (mOutputTrays != null) { - mOutputTrays.clear(); - mOutputTrays.addAll(other.mOutputTrays); - } else { - mOutputTrays = new ArrayList<Tray>(other.mOutputTrays); - } - } else { - mOutputTrays = null; - } - - mDuplexModes = other.mDuplexModes; mColorModes = other.mColorModes; - mFittingModes = other.mFittingModes; - mOrientations = other.mOrientations; final int defaultCount = other.mDefaults.length; for (int i = 0; i < defaultCount; i++) { @@ -169,37 +133,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Gets the available input trays. - * - * @return The input trays. - */ - public List<Tray> getInputTrays() { - return mInputTrays; - } - - /** - * Gets the available output trays. - * - * @return The output trays. - */ - public List<Tray> getOutputTrays() { - return mOutputTrays; - } - - /** - * Gets the supported duplex modes. - * - * @return The duplex modes. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - */ - public int getDuplexModes() { - return mDuplexModes; - } - - /** * Gets the supported color modes. * * @return The color modes. @@ -212,30 +145,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Gets the supported fitting modes. - * - * @return The fitting modes. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public int getFittingModes() { - return mFittingModes; - } - - /** - * Gets the supported orientations. - * - * @return The orientations. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public int getOrientations() { - return mOrientations; - } - - /** * Gets the default print attributes. * * @param outAttributes The attributes to populated. @@ -255,48 +164,18 @@ public final class PrinterCapabilitiesInfo implements Parcelable { outAttributes.setResolution(mResolutions.get(resolutionIndex)); } - final int inputTrayIndex = mDefaults[PROPERTY_INPUT_TRAY]; - if (inputTrayIndex >= 0) { - outAttributes.setInputTray(mInputTrays.get(inputTrayIndex)); - } - - final int outputTrayIndex = mDefaults[PROPERTY_OUTPUT_TRAY]; - if (outputTrayIndex >= 0) { - outAttributes.setOutputTray(mOutputTrays.get(outputTrayIndex)); - } - - final int duplexMode = mDefaults[PROPERTY_DUPLEX_MODE]; - if (duplexMode > 0) { - outAttributes.setDuplexMode(duplexMode); - } - final int colorMode = mDefaults[PROPERTY_COLOR_MODE]; if (colorMode > 0) { outAttributes.setColorMode(colorMode); } - - final int fittingMode = mDefaults[PROPERTY_FITTING_MODE]; - if (fittingMode > 0) { - outAttributes.setFittingMode(fittingMode); - } - - final int orientation = mDefaults[PROPERTY_ORIENTATION]; - if (orientation > 0) { - outAttributes.setOrientation(orientation); - } } private PrinterCapabilitiesInfo(Parcel parcel) { mMinMargins = readMargins(parcel); readMediaSizes(parcel); readResolutions(parcel); - mInputTrays = readInputTrays(parcel); - mOutputTrays = readOutputTrays(parcel); mColorModes = parcel.readInt(); - mDuplexModes = parcel.readInt(); - mFittingModes = parcel.readInt(); - mOrientations = parcel.readInt(); readDefaults(parcel); mDefaultMargins = readMargins(parcel); @@ -312,13 +191,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable { writeMargins(mMinMargins, parcel); writeMediaSizes(parcel); writeResolutions(parcel); - writeInputTrays(parcel); - writeOutputTrays(parcel); parcel.writeInt(mColorModes); - parcel.writeInt(mDuplexModes); - parcel.writeInt(mFittingModes); - parcel.writeInt(mOrientations); writeDefaults(parcel); writeMargins(mDefaultMargins, parcel); @@ -331,12 +205,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable { result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode()); result = prime * result + ((mMediaSizes == null) ? 0 : mMediaSizes.hashCode()); result = prime * result + ((mResolutions == null) ? 0 : mResolutions.hashCode()); - result = prime * result + ((mInputTrays == null) ? 0 : mInputTrays.hashCode()); - result = prime * result + ((mOutputTrays == null) ? 0 : mOutputTrays.hashCode()); result = prime * result + mColorModes; - result = prime * result + mDuplexModes; - result = prime * result + mFittingModes; - result = prime * result + mOrientations; result = prime * result + Arrays.hashCode(mDefaults); result = prime * result + ((mDefaultMargins == null) ? 0 : mDefaultMargins.hashCode()); return result; @@ -375,32 +244,9 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } else if (!mResolutions.equals(other.mResolutions)) { return false; } - if (mInputTrays == null) { - if (other.mInputTrays != null) { - return false; - } - } else if (!mInputTrays.equals(other.mInputTrays)) { - return false; - } - if (mOutputTrays == null) { - if (other.mOutputTrays != null) { - return false; - } - } else if (!mOutputTrays.equals(other.mOutputTrays)) { - return false; - } - if (mDuplexModes != other.mDuplexModes) { - return false; - } if (mColorModes != other.mColorModes) { return false; } - if (mFittingModes != other.mFittingModes) { - return false; - } - if (mOrientations != other.mOrientations) { - return false; - } if (!Arrays.equals(mDefaults, other.mDefaults)) { return false; } @@ -421,32 +267,11 @@ public final class PrinterCapabilitiesInfo implements Parcelable { builder.append("minMargins=").append(mMinMargins); builder.append(", mediaSizes=").append(mMediaSizes); builder.append(", resolutions=").append(mResolutions); - builder.append(", inputTrays=").append(mInputTrays); - builder.append(", outputTrays=").append(mOutputTrays); - builder.append(", duplexModes=").append(duplexModesToString()); builder.append(", colorModes=").append(colorModesToString()); - builder.append(", fittingModes=").append(fittingModesToString()); - builder.append(", orientations=").append(orientationsToString()); builder.append("\"}"); return builder.toString(); } - private String duplexModesToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int duplexModes = mDuplexModes; - while (duplexModes != 0) { - final int duplexMode = 1 << Integer.numberOfTrailingZeros(duplexModes); - duplexModes &= ~duplexMode; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.duplexModeToString(duplexMode)); - } - builder.append(']'); - return builder.toString(); - } - private String colorModesToString() { StringBuilder builder = new StringBuilder(); builder.append('['); @@ -463,38 +288,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { return builder.toString(); } - private String fittingModesToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int fittingModes = mFittingModes; - while (fittingModes != 0) { - final int fittingMode = 1 << Integer.numberOfTrailingZeros(fittingModes); - fittingModes &= ~fittingMode; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.fittingModeToString(fittingMode)); - } - builder.append(']'); - return builder.toString(); - } - - private String orientationsToString() { - StringBuilder builder = new StringBuilder(); - builder.append('['); - int orientations = mOrientations; - while (orientations != 0) { - final int orientation = 1 << Integer.numberOfTrailingZeros(orientations); - orientations &= ~orientation; - if (builder.length() > 0) { - builder.append(", "); - } - builder.append(PrintAttributes.orientationToString(orientation)); - } - builder.append(']'); - return builder.toString(); - } - private void writeMediaSizes(Parcel parcel) { if (mMediaSizes == null) { parcel.writeInt(0); @@ -552,54 +345,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { return (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null; } - private void writeInputTrays(Parcel parcel) { - if (mInputTrays == null) { - parcel.writeInt(0); - return; - } - final int inputTrayCount = mInputTrays.size(); - parcel.writeInt(inputTrayCount); - for (int i = 0; i < inputTrayCount; i++) { - mInputTrays.get(i).writeToParcel(parcel); - } - } - - private List<Tray> readInputTrays(Parcel parcel) { - final int inputTrayCount = parcel.readInt(); - if (inputTrayCount <= 0) { - return null; - } - List<Tray> inputTrays = new ArrayList<Tray>(inputTrayCount); - for (int i = 0; i < inputTrayCount; i++) { - inputTrays.add(Tray.createFromParcel(parcel)); - } - return inputTrays; - } - - private void writeOutputTrays(Parcel parcel) { - if (mOutputTrays == null) { - parcel.writeInt(0); - return; - } - final int outputTrayCount = mOutputTrays.size(); - parcel.writeInt(outputTrayCount); - for (int i = 0; i < outputTrayCount; i++) { - mOutputTrays.get(i).writeToParcel(parcel); - } - } - - private List<Tray> readOutputTrays(Parcel parcel) { - final int outputTrayCount = parcel.readInt(); - if (outputTrayCount <= 0) { - return null; - } - List<Tray> outputTrays = new ArrayList<Tray>(outputTrayCount); - for (int i = 0; i < outputTrayCount; i++) { - outputTrays.add(Tray.createFromParcel(parcel)); - } - return outputTrays; - } - private void readDefaults(Parcel parcel) { final int defaultCount = parcel.readInt(); for (int i = 0; i < defaultCount; i++) { @@ -722,62 +467,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Adds an input tray. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param inputTray A tray. - * @param isDefault Whether this is the default. - * @return This builder. - * - * @throws IllegalArgumentException If set as default and there - * is already a default. - * - * @see PrintAttributes.Tray - */ - public Builder addInputTray(Tray inputTray, boolean isDefault) { - if (mPrototype.mInputTrays == null) { - mPrototype.mInputTrays = new ArrayList<Tray>(); - } - final int insertionIndex = mPrototype.mInputTrays.size(); - mPrototype.mInputTrays.add(inputTray); - if (isDefault) { - throwIfDefaultAlreadySpecified(PROPERTY_INPUT_TRAY); - mPrototype.mDefaults[PROPERTY_INPUT_TRAY] = insertionIndex; - } - return this; - } - - /** - * Adds an output tray. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param outputTray A tray. - * @param isDefault Whether this is the default. - * @return This builder. - * - * @throws IllegalArgumentException If set as default and there - * is already a default. - * - * @see PrintAttributes.Tray - */ - public Builder addOutputTray(Tray outputTray, boolean isDefault) { - if (mPrototype.mOutputTrays == null) { - mPrototype.mOutputTrays = new ArrayList<Tray>(); - } - final int insertionIndex = mPrototype.mOutputTrays.size(); - mPrototype.mOutputTrays.add(outputTray); - if (isDefault) { - throwIfDefaultAlreadySpecified(PROPERTY_OUTPUT_TRAY); - mPrototype.mDefaults[PROPERTY_OUTPUT_TRAY] = insertionIndex; - } - return this; - } - - /** * Sets the color modes. * <p> * <strong>Required:</strong> Yes @@ -810,103 +499,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { } /** - * Set the duplex modes. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param duplexModes The duplex mode bit mask. - * @param defaultDuplexMode The default duplex mode. - * @return This builder. - * - * @throws IllegalArgumentException If duplex modes contains an invalid - * mode bit or if the default duplex mode is invalid. - * - * @see PrintAttributes#DUPLEX_MODE_NONE - * @see PrintAttributes#DUPLEX_MODE_LONG_EDGE - * @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE - */ - public Builder setDuplexModes(int duplexModes, int defaultDuplexMode) { - int currentModes = duplexModes; - while (currentModes > 0) { - final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes)); - currentModes &= ~currentMode; - PrintAttributes.enforceValidDuplexMode(currentMode); - } - if ((duplexModes & defaultDuplexMode) == 0) { - throw new IllegalArgumentException("Default duplex mode not in duplex modes."); - } - PrintAttributes.enforceValidDuplexMode(defaultDuplexMode); - mPrototype.mDuplexModes = duplexModes; - mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode; - return this; - } - - /** - * Sets the fitting modes. - * <p> - * <strong>Required:</strong> No - * </p> - * - * @param fittingModes The fitting mode bit mask. - * @param defaultFittingMode The default fitting mode. - * @return This builder. - * - * @throws IllegalArgumentException If fitting modes contains an invalid - * mode bit or if the default fitting mode is invalid. - * - * @see PrintAttributes#FITTING_MODE_NONE - * @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE - */ - public Builder setFittingModes(int fittingModes, int defaultFittingMode) { - int currentModes = fittingModes; - while (currentModes > 0) { - final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes)); - currentModes &= ~currentMode; - PrintAttributes.enforceValidFittingMode(currentMode); - } - if ((fittingModes & defaultFittingMode) == 0) { - throw new IllegalArgumentException("Default fitting mode not in fiting modes."); - } - PrintAttributes.enforceValidFittingMode(defaultFittingMode); - mPrototype.mFittingModes = fittingModes; - mPrototype.mDefaults[PROPERTY_FITTING_MODE] = defaultFittingMode; - return this; - } - - /** - * Sets the orientations. - * <p> - * <strong>Required:</strong> Yes - * </p> - * - * @param orientations The orientation bit mask. - * @param defaultOrientation The default orientation. - * @return This builder. - * - * @throws IllegalArgumentException If orientations contains an invalid - * mode bit or if the default orientation is invalid. - * - * @see PrintAttributes#ORIENTATION_PORTRAIT - * @see PrintAttributes#ORIENTATION_LANDSCAPE - */ - public Builder setOrientations(int orientations, int defaultOrientation) { - int currentOrientaions = orientations; - while (currentOrientaions > 0) { - final int currentOrnt = (1 << Integer.numberOfTrailingZeros(currentOrientaions)); - currentOrientaions &= ~currentOrnt; - PrintAttributes.enforceValidOrientation(currentOrnt); - } - if ((orientations & defaultOrientation) == 0) { - throw new IllegalArgumentException("Default orientation not in orientations."); - } - PrintAttributes.enforceValidOrientation(defaultOrientation); - mPrototype.mOrientations = orientations; - mPrototype.mDefaults[PROPERTY_ORIENTATION] = defaultOrientation; - return this; - } - - /** * Crates a new {@link PrinterCapabilitiesInfo} enforcing that all * required properties have need specified. See individual methods * in this class for reference about required attributes. @@ -934,12 +526,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable { if (mPrototype.mDefaults[PROPERTY_COLOR_MODE] == DEFAULT_UNDEFINED) { throw new IllegalStateException("No default color mode specified."); } - if (mPrototype.mOrientations == 0) { - throw new IllegalStateException("No oprientation specified."); - } - if (mPrototype.mDefaults[PROPERTY_ORIENTATION] == DEFAULT_UNDEFINED) { - throw new IllegalStateException("No default orientation specified."); - } if (mPrototype.mMinMargins == null) { mPrototype.mMinMargins = new Margins(0, 0, 0, 0); } diff --git a/core/java/android/print/PrinterDiscoverySession.java b/core/java/android/print/PrinterDiscoverySession.java index 46f0bef8fe20..64249b4ee36f 100644 --- a/core/java/android/print/PrinterDiscoverySession.java +++ b/core/java/android/print/PrinterDiscoverySession.java @@ -38,7 +38,6 @@ public final class PrinterDiscoverySession { private static final int MSG_PRINTERS_ADDED = 1; private static final int MSG_PRINTERS_REMOVED = 2; - private static final int MSG_PRINTERS_UPDATED = 3; private final ArrayMap<PrinterId, PrinterInfo> mPrinters = new ArrayMap<PrinterId, PrinterInfo>(); @@ -200,8 +199,8 @@ public final class PrinterDiscoverySession { final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo addedPrinter = printers.get(i); - if (mPrinters.get(addedPrinter.getId()) == null) { - mPrinters.put(addedPrinter.getId(), addedPrinter); + PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter); + if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) { printersChanged = true; } } @@ -227,25 +226,6 @@ public final class PrinterDiscoverySession { } } - private void handlePrintersUpdated(List<PrinterInfo> printers) { - if (isDestroyed()) { - return; - } - boolean printersChanged = false; - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - printersChanged = true; - } - } - if (printersChanged) { - notifyOnPrintersChanged(); - } - } - private void notifyOnPrintersChanged() { if (mListener != null) { mListener.onPrintersChanged(); @@ -277,11 +257,6 @@ public final class PrinterDiscoverySession { List<PrinterId> printerIds = (List<PrinterId>) message.obj; handlePrintersRemoved(printerIds); } break; - - case MSG_PRINTERS_UPDATED: { - List<PrinterInfo> printers = (List<PrinterInfo>) message.obj; - handlePrintersUpdated(printers); - } break; } } } @@ -311,14 +286,5 @@ public final class PrinterDiscoverySession { printerIds).sendToTarget(); } } - - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - PrinterDiscoverySession session = mWeakSession.get(); - if (session != null) { - session.mHandler.obtainMessage(MSG_PRINTERS_UPDATED, - printers).sendToTarget(); - } - } } } diff --git a/core/java/android/printservice/IPrintServiceClient.aidl b/core/java/android/printservice/IPrintServiceClient.aidl index 1e33fc07c92c..ad3c04f4ea30 100644 --- a/core/java/android/printservice/IPrintServiceClient.aidl +++ b/core/java/android/printservice/IPrintServiceClient.aidl @@ -35,5 +35,4 @@ interface IPrintServiceClient { void onPrintersAdded(in List<PrinterInfo> printers); void onPrintersRemoved(in List<PrinterId> printerIds); - void onPrintersUpdated(in List<PrinterInfo> printers); } diff --git a/core/java/android/printservice/PrintJob.java b/core/java/android/printservice/PrintJob.java index 8bae9d677572..4ff7f0c5be85 100644 --- a/core/java/android/printservice/PrintJob.java +++ b/core/java/android/printservice/PrintJob.java @@ -26,8 +26,8 @@ import android.util.Log; * service. It provides APIs for observing the print job state and * performing operations on the print job. * <p> - * <strong>Note: </strong> All methods of this class must be executed on the main - * application thread. + * <strong>Note: </strong> All methods of this class must be invoked on + * the main application thread. * </p> */ public final class PrintJob { diff --git a/core/java/android/printservice/PrinterDiscoverySession.java b/core/java/android/printservice/PrinterDiscoverySession.java index 6464cc117108..b0bf3da4fa49 100644 --- a/core/java/android/printservice/PrinterDiscoverySession.java +++ b/core/java/android/printservice/PrinterDiscoverySession.java @@ -30,7 +30,7 @@ import java.util.List; /** * This class encapsulates the interaction between a print service and the * system during printer discovery. During printer discovery you are responsible - * for adding discovered printers, removing already added printers that + * for adding discovered printers, removing previously added printers that * disappeared, and updating already added printers. * <p> * During the lifetime of this session you may be asked to start and stop @@ -47,7 +47,7 @@ import java.util.List; * PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared are * removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. Added * printers whose properties or capabilities changed are updated through a call to - * {@link PrinterDiscoverySession#updatePrinters(List)}. The printers added in this + * {@link PrinterDiscoverySession#addPrinters(List)}. The printers added in this * session can be acquired via {@link #getPrinters()} where the returned printers * will be an up-to-date snapshot of the printers that you reported during the * session. Printers are <strong>not</strong> persisted across sessions. @@ -89,6 +89,9 @@ public abstract class PrinterDiscoverySession { private final ArrayMap<PrinterId, PrinterInfo> mPrinters = new ArrayMap<PrinterId, PrinterInfo>(); + private final List<PrinterId> mTrackedPrinters = + new ArrayList<PrinterId>(); + private ArrayMap<PrinterId, PrinterInfo> mLastSentPrinters; private IPrintServiceClient mObserver; @@ -130,7 +133,6 @@ public abstract class PrinterDiscoverySession { * * @see #addPrinters(List) * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #isDestroyed() */ public final List<PrinterInfo> getPrinters() { @@ -142,7 +144,7 @@ public abstract class PrinterDiscoverySession { } /** - * Adds discovered printers. Adding an already added printer has no effect. + * Adds discovered printers. Adding an already added printer updates it. * Removed printers can be added again. You can call this method multiple * times during the life of this session. Duplicates will be ignored. * <p> @@ -153,7 +155,6 @@ public abstract class PrinterDiscoverySession { * @param printers The printers to add. * * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #getPrinters() * @see #isDestroyed() */ @@ -168,18 +169,21 @@ public abstract class PrinterDiscoverySession { if (mIsDiscoveryStarted) { // If during discovery, add the new printers and send them. - List<PrinterInfo> addedPrinters = new ArrayList<PrinterInfo>(); + List<PrinterInfo> addedPrinters = null; final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo addedPrinter = printers.get(i); - if (mPrinters.get(addedPrinter.getId()) == null) { - mPrinters.put(addedPrinter.getId(), addedPrinter); + PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter); + if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) { + if (addedPrinters == null) { + addedPrinters = new ArrayList<PrinterInfo>(); + } addedPrinters.add(addedPrinter); } } // Send the added printers, if such. - if (!addedPrinters.isEmpty()) { + if (addedPrinters != null) { sendAddedPrinters(mObserver, addedPrinters); } } else { @@ -232,7 +236,6 @@ public abstract class PrinterDiscoverySession { * @param printerIds The ids of the removed printers. * * @see #addPrinters(List) - * @see #updatePrinters(List) * @see #getPrinters() * @see #isDestroyed() */ @@ -295,86 +298,6 @@ public abstract class PrinterDiscoverySession { } } - /** - * Updates added printers. Updating a printer that was not added or that - * was removed has no effect. You can call this method multiple times - * during the lifetime of this session. - * <p> - * <strong>Note: </strong> Calls to this method after the session is - * destroyed, that is after the {@link #onDestroy()} callback, will be ignored. - * </p> - * - * @param printers The printers to update. - * - * @see #addPrinters(List) - * @see #removePrinters(List) - * @see #getPrinters() - * @see #isDestroyed() - */ - public final void updatePrinters(List<PrinterInfo> printers) { - PrintService.throwIfNotCalledOnMainThread(); - - // If the session is destroyed - nothing do to. - if (mIsDestroyed) { - Log.w(LOG_TAG, "Not updating printers - session destroyed."); - return; - } - - if (mIsDiscoveryStarted) { - // If during discovery, update existing printers and send them. - List<PrinterInfo> updatedPrinters = new ArrayList<PrinterInfo>(); - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - updatedPrinters.add(updatedPrinter); - } - } - - // Send the updated printers, if such. - if (!updatedPrinters.isEmpty()) { - sendUpdatedPrinters(mObserver, updatedPrinters); - } - } else { - // Remember the last sent printers if needed. - if (mLastSentPrinters == null) { - mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters); - } - - // Update the printers. - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId()); - if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - } - } - } - } - - private static void sendUpdatedPrinters(IPrintServiceClient observer, - List<PrinterInfo> printers) { - try { - final int printerCount = printers.size(); - if (printerCount <= MAX_ITEMS_PER_CALLBACK) { - observer.onPrintersUpdated(printers); - } else { - final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; - for (int i = 0; i < transactionCount; i++) { - final int start = i * MAX_ITEMS_PER_CALLBACK; - final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); - List<PrinterInfo> subPrinters = printers.subList(start, end); - observer.onPrintersUpdated(subPrinters); - } - } - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error sending updated printers", re); - } - } - private void sendOutOfDiscoveryPeriodPrinterChanges() { // Noting changed since the last discovery period - nothing to do. if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) { @@ -382,21 +305,11 @@ public abstract class PrinterDiscoverySession { return; } + // Determine the added printers. List<PrinterInfo> addedPrinters = null; - List<PrinterInfo> updatedPrinters = null; - List<PrinterId> removedPrinterIds = null; - - // Determine the added and updated printers. for (PrinterInfo printer : mPrinters.values()) { PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId()); - if (sentPrinter != null) { - if (!sentPrinter.equals(printer)) { - if (updatedPrinters == null) { - updatedPrinters = new ArrayList<PrinterInfo>(); - } - updatedPrinters.add(printer); - } - } else { + if (sentPrinter == null || !sentPrinter.equals(printer)) { if (addedPrinters == null) { addedPrinters = new ArrayList<PrinterInfo>(); } @@ -409,12 +322,8 @@ public abstract class PrinterDiscoverySession { sendAddedPrinters(mObserver, addedPrinters); } - // Send the updated printers, if such. - if (updatedPrinters != null) { - sendUpdatedPrinters(mObserver, updatedPrinters); - } - // Determine the removed printers. + List<PrinterId> removedPrinterIds = null; for (PrinterInfo sentPrinter : mLastSentPrinters.values()) { if (!mPrinters.containsKey(sentPrinter.getId())) { if (removedPrinterIds == null) { @@ -437,14 +346,15 @@ public abstract class PrinterDiscoverySession { * added via calling {@link #addPrinters(List)}. Added printers that disappeared * should be removed via calling {@link #removePrinters(List)}. Added printers * whose properties or capabilities changed should be updated via calling {@link - * #updatePrinters(List)}. You will receive a call to call to {@link - * #onStopPrinterDiscovery()} when you should stop printer discovery. + * #addPrinters(List)}. You will receive a call to {@link #onStopPrinterDiscovery()} + * when you should stop printer discovery. * <p> * During the lifetime of this session all printers that are known to your print * service have to be added. The system does not retain any printers across sessions. * However, if you were asked to start and then stop performing printer discovery * in this session, then a subsequent discovering should not re-discover already - * discovered printers. + * discovered printers. You can get the printers reported during this session by + * calling {@link #getPrinters()}. * </p> * <p> * <strong>Note: </strong>You are also given a list of printers whose availability @@ -459,7 +369,6 @@ public abstract class PrinterDiscoverySession { * @see #onStopPrinterDiscovery() * @see #addPrinters(List) * @see #removePrinters(List) - * @see #updatePrinters(List) * @see #isPrinterDiscoveryStarted() */ public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList); @@ -476,7 +385,7 @@ public abstract class PrinterDiscoverySession { * Callback asking you to validate that the given printers are valid, that * is they exist. You are responsible for checking whether these printers * exist and for the ones that do exist notify the system via calling - * {@link #updatePrinters(List)}. + * {@link #addPrinters(List)}. * <p> * <strong>Note: </strong> You are <strong>not required</strong> to provide * the printer capabilities when updating the printers that do exist. @@ -484,7 +393,6 @@ public abstract class PrinterDiscoverySession { * * @param printerIds The printers to validate. * - * @see #updatePrinters(List) * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo) * PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo) */ @@ -494,7 +402,7 @@ public abstract class PrinterDiscoverySession { * Callback asking you to start tracking the state of a printer. Tracking * the state means that you should do a best effort to observe the state * of this printer and notify the system if that state changes via calling - * {@link #updatePrinters(List)}. + * {@link #addPrinters(List)}. * <p> * <strong>Note: </strong> A printer can be initially added without its * capabilities to avoid polling printers that the user will not select. @@ -513,7 +421,6 @@ public abstract class PrinterDiscoverySession { * @param printerId The printer to start tracking. * * @see #onStopPrinterStateTracking(PrinterId) - * @see #updatePrinters(List) * @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo) * PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo) */ @@ -531,6 +438,32 @@ public abstract class PrinterDiscoverySession { public abstract void onStopPrinterStateTracking(PrinterId printerId); /** + * Gets the printers that should be tracked. These are printers that are + * important to the user and for which you received a call to {@link + * #onStartPrinterStateTracking(PrinterId)} asking you to observer their + * state and reporting it to the system via {@link #addPrinters(List)}. + * You will receive a call to {@link #onStopPrinterStateTracking(PrinterId)} + * if you should stop tracking a printer. + * <p> + * <strong>Note: </strong> Calls to this method after the session is + * destroyed, that is after the {@link #onDestroy()} callback, will be ignored. + * </p> + * + * @return The printers. + * + * @see #onStartPrinterStateTracking(PrinterId) + * @see #onStopPrinterStateTracking(PrinterId) + * @see #isDestroyed() + */ + public final List<PrinterId> getTrackedPrinters() { + PrintService.throwIfNotCalledOnMainThread(); + if (mIsDestroyed) { + return Collections.emptyList(); + } + return new ArrayList<PrinterId>(mTrackedPrinters); + } + + /** * Notifies you that the session is destroyed. After this callback is invoked * any calls to the methods of this class will be ignored, {@link #isDestroyed()} * will return true and you will also no longer receive callbacks. @@ -589,13 +522,16 @@ public abstract class PrinterDiscoverySession { } void startPrinterStateTracking(PrinterId printerId) { - if (!mIsDestroyed && mObserver != null) { + if (!mIsDestroyed && mObserver != null + && !mTrackedPrinters.contains(printerId)) { + mTrackedPrinters.add(printerId); onStartPrinterStateTracking(printerId); } } void stopPrinterStateTracking(PrinterId printerId) { - if (!mIsDestroyed && mObserver != null) { + if (!mIsDestroyed && mObserver != null + && mTrackedPrinters.remove(printerId)) { onStopPrinterStateTracking(printerId); } } diff --git a/core/java/android/printservice/package.html b/core/java/android/printservice/package.html index 6b0327cc1ae3..7410a49ca375 100644 --- a/core/java/android/printservice/package.html +++ b/core/java/android/printservice/package.html @@ -9,8 +9,7 @@ implementation is factored out of the system and can by independently developed <p> A print service implementation should extend {@link android.printservice.PrintService} and implement its abstract methods. Also the print service has to follow the contract for -managing print {@link android.printservice.PrintJob}s to ensure correct interaction with -the system and consistent user experience. +managing print {@link android.printservice.PrintJob}s. <p/> <p> The system is responsible for starting and stopping a print service depending on whether diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java index f445fd5481a4..eaa4f78a1005 100644 --- a/core/java/android/provider/DocumentsContract.java +++ b/core/java/android/provider/DocumentsContract.java @@ -72,7 +72,9 @@ public final class DocumentsContract { public static final String META_DATA_DOCUMENT_PROVIDER = "android.content.DOCUMENT_PROVIDER"; /** {@hide} */ - public static final String ACTION_MANAGE_DOCUMENTS = "android.provider.action.MANAGE_DOCUMENTS"; + public static final String ACTION_MANAGE_ROOT = "android.provider.action.MANAGE_ROOT"; + /** {@hide} */ + public static final String ACTION_MANAGE_DOCUMENT = "android.provider.action.MANAGE_DOCUMENT"; /** * Constants related to a document, including {@link Cursor} columns names @@ -249,6 +251,15 @@ public final class DocumentsContract { * @see #COLUMN_FLAGS */ public static final int FLAG_DIR_PREFERS_GRID = 1 << 5; + + /** + * Flag indicating that a directory prefers its contents be sorted by + * {@link #COLUMN_LAST_MODIFIED}. Only valid when + * {@link #COLUMN_MIME_TYPE} is {@link #MIME_TYPE_DIR}. + * + * @see #COLUMN_FLAGS + */ + public static final int FLAG_DIR_PREFERS_LAST_MODIFIED = 1 << 6; } /** @@ -290,9 +301,6 @@ public final class DocumentsContract { * @see #FLAG_LOCAL_ONLY * @see #FLAG_SUPPORTS_CREATE * @see #FLAG_ADVANCED - * @see #FLAG_PROVIDES_AUDIO - * @see #FLAG_PROVIDES_IMAGES - * @see #FLAG_PROVIDES_VIDEO */ public static final String COLUMN_FLAGS = "flags"; @@ -337,6 +345,19 @@ public final class DocumentsContract { public static final String COLUMN_AVAILABLE_BYTES = "available_bytes"; /** + * MIME types supported by this root, or {@code null} if the root + * supports all MIME types. Multiple MIME types can be separated by a + * newline. For example, a root supporting audio might use + * "audio/*\napplication/x-flac". + * <p> + * Type: String + */ + public static final String COLUMN_MIME_TYPES = "mime_types"; + + /** {@hide} */ + public static final String MIME_TYPE_ITEM = "vnd.android.document/root"; + + /** * Type of root that represents a storage service, such as a cloud-based * service. * @@ -386,40 +407,13 @@ public final class DocumentsContract { public static final int FLAG_ADVANCED = 1 << 2; /** - * Flag indicating that a root offers audio documents. When a user is - * selecting audio, roots not providing audio may be excluded. - * - * @see #COLUMN_FLAGS - * @see Intent#EXTRA_MIME_TYPES - */ - public static final int FLAG_PROVIDES_AUDIO = 1 << 3; - - /** - * Flag indicating that a root offers video documents. When a user is - * selecting video, roots not providing video may be excluded. - * - * @see #COLUMN_FLAGS - * @see Intent#EXTRA_MIME_TYPES - */ - public static final int FLAG_PROVIDES_VIDEO = 1 << 4; - - /** - * Flag indicating that a root offers image documents. When a user is - * selecting images, roots not providing images may be excluded. - * - * @see #COLUMN_FLAGS - * @see Intent#EXTRA_MIME_TYPES - */ - public static final int FLAG_PROVIDES_IMAGES = 1 << 5; - - /** * Flag indicating that this root can report recently modified * documents. * * @see #COLUMN_FLAGS * @see DocumentsContract#buildRecentDocumentsUri(String, String) */ - public static final int FLAG_SUPPORTS_RECENTS = 1 << 6; + public static final int FLAG_SUPPORTS_RECENTS = 1 << 3; } /** @@ -479,6 +473,17 @@ public final class DocumentsContract { } /** + * Build Uri representing the given {@link Root#COLUMN_ROOT_ID} in a + * document provider. + * + * @see #getRootId(Uri) + */ + public static Uri buildRootUri(String authority, String rootId) { + return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) + .authority(authority).appendPath(PATH_ROOT).appendPath(rootId).build(); + } + + /** * Build Uri representing the recently modified documents of a specific * root. When queried, a provider will return zero or more rows with columns * defined by {@link Document}. diff --git a/core/java/android/provider/DocumentsProvider.java b/core/java/android/provider/DocumentsProvider.java index 09f4866dda2c..1b0fc4d1f70d 100644 --- a/core/java/android/provider/DocumentsProvider.java +++ b/core/java/android/provider/DocumentsProvider.java @@ -28,6 +28,7 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.UriMatcher; +import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.res.AssetFileDescriptor; import android.database.Cursor; @@ -71,11 +72,12 @@ import java.io.FileNotFoundException; public abstract class DocumentsProvider extends ContentProvider { private static final String TAG = "DocumentsProvider"; - private static final int MATCH_ROOT = 1; - private static final int MATCH_RECENT = 2; - private static final int MATCH_DOCUMENT = 3; - private static final int MATCH_CHILDREN = 4; - private static final int MATCH_SEARCH = 5; + private static final int MATCH_ROOTS = 1; + private static final int MATCH_ROOT = 2; + private static final int MATCH_RECENT = 3; + private static final int MATCH_DOCUMENT = 4; + private static final int MATCH_CHILDREN = 5; + private static final int MATCH_SEARCH = 6; private String mAuthority; @@ -89,7 +91,8 @@ public abstract class DocumentsProvider extends ContentProvider { mAuthority = info.authority; mMatcher = new UriMatcher(UriMatcher.NO_MATCH); - mMatcher.addURI(mAuthority, "root", MATCH_ROOT); + mMatcher.addURI(mAuthority, "root", MATCH_ROOTS); + mMatcher.addURI(mAuthority, "root/*", MATCH_ROOT); mMatcher.addURI(mAuthority, "root/*/recent", MATCH_RECENT); mMatcher.addURI(mAuthority, "document/*", MATCH_DOCUMENT); mMatcher.addURI(mAuthority, "document/*/children", MATCH_CHILDREN); @@ -252,7 +255,7 @@ public abstract class DocumentsProvider extends ContentProvider { String[] selectionArgs, String sortOrder) { try { switch (mMatcher.match(uri)) { - case MATCH_ROOT: + case MATCH_ROOTS: return queryRoots(projection); case MATCH_RECENT: return queryRecentDocuments(getRootId(uri), projection); @@ -281,6 +284,8 @@ public abstract class DocumentsProvider extends ContentProvider { public final String getType(Uri uri) { try { switch (mMatcher.match(uri)) { + case MATCH_ROOT: + return DocumentsContract.Root.MIME_TYPE_ITEM; case MATCH_DOCUMENT: return getDocumentType(getDocumentId(uri)); default: @@ -324,20 +329,35 @@ public abstract class DocumentsProvider extends ContentProvider { throw new UnsupportedOperationException("Update not supported"); } - /** {@hide} */ + /** + * Implementation is provided by the parent class. Can be overridden to + * provide additional functionality, but subclasses <em>must</em> always + * call the superclass. If the superclass returns {@code null}, the subclass + * may implement custom behavior. + * + * @see #openDocument(String, String, CancellationSignal) + * @see #deleteDocument(String) + */ @Override - public final Bundle callFromPackage( - String callingPackage, String method, String arg, Bundle extras) { + public Bundle call(String method, String arg, Bundle extras) { + final Context context = getContext(); + if (!method.startsWith("android:")) { // Let non-platform methods pass through - return super.callFromPackage(callingPackage, method, arg, extras); + return super.call(method, arg, extras); } - // Require that caller can manage given document final String documentId = extras.getString(Document.COLUMN_DOCUMENT_ID); final Uri documentUri = DocumentsContract.buildDocumentUri(mAuthority, documentId); - getContext().enforceCallingOrSelfUriPermission( - documentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, method); + + // Require that caller can manage given document + final boolean callerHasManage = + context.checkCallingOrSelfPermission(android.Manifest.permission.MANAGE_DOCUMENTS) + == PackageManager.PERMISSION_GRANTED; + if (!callerHasManage) { + getContext().enforceCallingOrSelfUriPermission( + documentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION, method); + } final Bundle out = new Bundle(); try { @@ -345,14 +365,26 @@ public abstract class DocumentsProvider extends ContentProvider { final String mimeType = extras.getString(Document.COLUMN_MIME_TYPE); final String displayName = extras.getString(Document.COLUMN_DISPLAY_NAME); - // TODO: issue Uri grant towards calling package - // TODO: enforce that package belongs to caller final String newDocumentId = createDocument(documentId, mimeType, displayName); out.putString(Document.COLUMN_DOCUMENT_ID, newDocumentId); + // Extend permission grant towards caller if needed + if (!callerHasManage) { + final Uri newDocumentUri = DocumentsContract.buildDocumentUri( + mAuthority, newDocumentId); + context.grantUriPermission(getCallingPackage(), newDocumentUri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION + | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); + } + } else if (METHOD_DELETE_DOCUMENT.equals(method)) { - final String docId = extras.getString(Document.COLUMN_DOCUMENT_ID); - deleteDocument(docId); + deleteDocument(documentId); + + // Document no longer exists, clean up any grants + context.revokeUriPermission(documentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION + | Intent.FLAG_GRANT_WRITE_URI_PERMISSION + | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION); } else { throw new UnsupportedOperationException("Method not supported " + method); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 83e154411256..1a80818ff08f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -343,7 +343,7 @@ public final class Settings { /** * Activity Action: Show settings to manage the user input dictionary. * <p> - * Starting with {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, + * Starting with {@link android.os.Build.VERSION_CODES#KITKAT}, * it is guaranteed there will always be an appropriate implementation for this Intent action. * In prior releases of the platform this was optional, so ensure you safeguard against it. * <p> @@ -703,6 +703,20 @@ public final class Settings { @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS"; + /** + * Activity Action: Show the top level print settings. + * <p> + * In some cases, a matching Activity may not exist, so ensure you + * safeguard against this. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_PRINT_SETTINGS = + "android.settings.ACTION_PRINT_SETTINGS"; + // End of Intent actions for Settings /** @@ -5107,6 +5121,21 @@ public final class Settings { "wifi_display_certification_on"; /** + * WPS Configuration method used by Wifi display, this setting only + * takes effect when WIFI_DISPLAY_CERTIFICATION_ON is 1 (enabled). + * + * Possible values are: + * + * WpsInfo.INVALID: use default WPS method chosen by framework + * WpsInfo.PBC : use Push button + * WpsInfo.KEYPAD : use Keypad + * WpsInfo.DISPLAY: use Display + * @hide + */ + public static final String WIFI_DISPLAY_WPS_CONFIG = + "wifi_display_wps_config"; + + /** * Whether to notify the user of open networks. * <p> * If not connected and the scan results have an open network, we will @@ -5268,6 +5297,13 @@ public final class Settings { "data_stall_alarm_aggressive_delay_in_ms"; /** + * The number of milliseconds to allow the provisioning apn to remain active + * @hide + */ + public static final String PROVISIONING_APN_ALARM_DELAY_IN_MS = + "provisioning_apn_alarm_delay_in_ms"; + + /** * The interval in milliseconds at which to check gprs registration * after the first registration mismatch of gprs and voice service, * to detect possible data network registration problems. diff --git a/core/java/android/security/IKeystoreService.java b/core/java/android/security/IKeystoreService.java index bf8d4e59074b..f8bf45b4a7a1 100644 --- a/core/java/android/security/IKeystoreService.java +++ b/core/java/android/security/IKeystoreService.java @@ -444,12 +444,13 @@ public interface IKeystoreService extends IInterface { } @Override - public int is_hardware_backed() throws RemoteException { + public int is_hardware_backed(String keyType) throws RemoteException { Parcel _data = Parcel.obtain(); Parcel _reply = Parcel.obtain(); int _result; try { _data.writeInterfaceToken(DESCRIPTOR); + _data.writeString(keyType); mRemote.transact(Stub.TRANSACTION_is_hardware_backed, _data, _reply, 0); _reply.readException(); _result = _reply.readInt(); @@ -593,7 +594,7 @@ public interface IKeystoreService extends IInterface { public int duplicate(String srcKey, int srcUid, String destKey, int destUid) throws RemoteException; - public int is_hardware_backed() throws RemoteException; + public int is_hardware_backed(String string) throws RemoteException; public int clear_uid(long uid) throws RemoteException; } diff --git a/core/java/android/speech/hotword/HotwordRecognitionListener.java b/core/java/android/speech/hotword/HotwordRecognitionListener.java index 8e62373d65ca..8a32654c5bac 100644 --- a/core/java/android/speech/hotword/HotwordRecognitionListener.java +++ b/core/java/android/speech/hotword/HotwordRecognitionListener.java @@ -16,7 +16,6 @@ package android.speech.hotword; -import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; @@ -47,9 +46,10 @@ public interface HotwordRecognitionListener { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param intent for the activity to launch, post hotword detection. */ - void onHotwordRecognized(PendingIntent intent); + void onHotwordRecognized(Intent intent); /** * Called when the HotwordRecognitionService encounters an error. diff --git a/core/java/android/speech/hotword/HotwordRecognitionService.java b/core/java/android/speech/hotword/HotwordRecognitionService.java index 521d06d8abb4..7a26e0ce87ee 100644 --- a/core/java/android/speech/hotword/HotwordRecognitionService.java +++ b/core/java/android/speech/hotword/HotwordRecognitionService.java @@ -21,6 +21,7 @@ import android.annotation.SdkConstant.SdkConstantType; import android.app.PendingIntent; import android.app.Service; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; @@ -31,7 +32,6 @@ import android.util.Log; /** * This class provides a base class for hotword detection service implementations. * This class should be extended only if you wish to implement a new hotword recognizer. - * {@hide} */ public abstract class HotwordRecognitionService extends Service { /** @@ -45,8 +45,7 @@ public abstract class HotwordRecognitionService extends Service { private static final String TAG = "HotwordRecognitionService"; /** Debugging flag */ - // TODO: Turn off. - private static final boolean DBG = true; + private static final boolean DBG = false; private static final int MSG_START_RECOGNITION = 1; private static final int MSG_STOP_RECOGNITION = 2; @@ -160,7 +159,7 @@ public abstract class HotwordRecognitionService extends Service { public void startHotwordRecognition(IHotwordRecognitionListener listener) { if (DBG) Log.d(TAG, "startRecognition called by: " + listener.asBinder()); - if (mInternalService != null) { + if (mInternalService != null && mInternalService.checkPermissions(listener)) { mInternalService.mHandler.sendMessage( Message.obtain(mInternalService.mHandler, MSG_START_RECOGNITION, listener)); } @@ -168,7 +167,7 @@ public abstract class HotwordRecognitionService extends Service { public void stopHotwordRecognition(IHotwordRecognitionListener listener) { if (DBG) Log.d(TAG, "stopRecognition called by: " + listener.asBinder()); - if (mInternalService != null) { + if (mInternalService != null && mInternalService.checkPermissions(listener)) { mInternalService.mHandler.sendMessage( Message.obtain(mInternalService.mHandler, MSG_STOP_RECOGNITION, listener)); } @@ -180,6 +179,27 @@ public abstract class HotwordRecognitionService extends Service { } /** + * Checks whether the caller has sufficient permissions + * + * @param listener to send the error message to in case of error. + * @return {@code true} if the caller has enough permissions, {@code false} otherwise. + */ + private boolean checkPermissions(IHotwordRecognitionListener listener) { + if (DBG) Log.d(TAG, "checkPermissions"); + if (checkCallingOrSelfPermission(android.Manifest.permission.HOTWORD_RECOGNITION) == + PackageManager.PERMISSION_GRANTED) { + return true; + } + try { + Log.e(TAG, "Recognition service called without HOTWORD_RECOGNITION permissions"); + listener.onHotwordError(HotwordRecognizer.ERROR_FAILED); + } catch (RemoteException e) { + Log.e(TAG, "onHotwordError(ERROR_FAILED) message failed", e); + } + return false; + } + + /** * This class acts passes on the callbacks received from the Hotword service * to the listener. */ @@ -207,7 +227,7 @@ public abstract class HotwordRecognitionService extends Service { /** * Called on an event of interest to the client. * - * @param eventType the event type. Event types are defined in {@link HotwordRecognizer}. + * @param eventType the event type. * @param eventBundle a Bundle containing the hotword event(s). */ public void onHotwordEvent(int eventType, Bundle eventBundle) throws RemoteException { @@ -216,17 +236,17 @@ public abstract class HotwordRecognitionService extends Service { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param activityIntent for the activity to launch, post hotword detection. */ - public void onHotwordRecognized(PendingIntent intent) throws RemoteException { - mListener.onHotwordRecognized(intent); + public void onHotwordRecognized(Intent activityIntent) throws RemoteException { + mListener.onHotwordRecognized(activityIntent); } /** * Called when the HotwordRecognitionService encounters an error. * * @param errorCode the error code describing the error that was encountered. - * Error codes are defined in {@link HotwordRecognizer}. */ public void onError(int errorCode) throws RemoteException { mListener.onHotwordError(errorCode); diff --git a/core/java/android/speech/hotword/HotwordRecognizer.java b/core/java/android/speech/hotword/HotwordRecognizer.java index 82cec1017833..939c11d7792f 100644 --- a/core/java/android/speech/hotword/HotwordRecognizer.java +++ b/core/java/android/speech/hotword/HotwordRecognizer.java @@ -45,8 +45,7 @@ import java.util.Queue; */ public class HotwordRecognizer { /** DEBUG value to enable verbose debug prints */ - // TODO: Turn off. - private final static boolean DBG = true; + private final static boolean DBG = false; /** Log messages identifier */ private static final String TAG = "HotwordRecognizer"; @@ -81,6 +80,9 @@ public class HotwordRecognizer { /** The service received concurrent start calls */ public static final int ERROR_SERVICE_ALREADY_STARTED = 6; + /** Hotword recognition is unavailable on the device */ + public static final int ERROR_UNAVAILABLE = 7; + /** action codes */ private static final int MSG_START = 1; private static final int MSG_STOP = 2; @@ -354,7 +356,7 @@ public class HotwordRecognizer { mInternalListener.onHotwordEvent(msg.arg1, (Bundle) msg.obj); break; case MSG_ON_RECOGNIZED: - mInternalListener.onHotwordRecognized((PendingIntent) msg.obj); + mInternalListener.onHotwordRecognized((Intent) msg.obj); break; case MSG_ON_ERROR: mInternalListener.onHotwordError((Integer) msg.obj); @@ -380,8 +382,8 @@ public class HotwordRecognizer { } @Override - public void onHotwordRecognized(PendingIntent intent) throws RemoteException { - Message.obtain(mInternalHandler, MSG_ON_RECOGNIZED, intent) + public void onHotwordRecognized(Intent activityIntent) throws RemoteException { + Message.obtain(mInternalHandler, MSG_ON_RECOGNIZED, activityIntent) .sendToTarget(); } diff --git a/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl b/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl index 49c523328296..4ea2e8e0ecfa 100644 --- a/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl +++ b/core/java/android/speech/hotword/IHotwordRecognitionListener.aidl @@ -16,7 +16,7 @@ package android.speech.hotword; -import android.app.PendingIntent; +import android.content.Intent; import android.os.Bundle; /** @@ -47,9 +47,10 @@ oneway interface IHotwordRecognitionListener { /** * Called back when hotword is detected. - * The action tells the client what action to take, post hotword-detection. + * + * @param intent for the activity to launch, post hotword detection. */ - void onHotwordRecognized(in PendingIntent intent); + void onHotwordRecognized(in Intent intent); /** * Called when the HotwordRecognitionService encounters an error. diff --git a/core/java/android/view/transition/AutoTransition.java b/core/java/android/transition/AutoTransition.java index 7ddac7e08c8e..6e46021e5b3c 100644 --- a/core/java/android/view/transition/AutoTransition.java +++ b/core/java/android/transition/AutoTransition.java @@ -14,22 +14,28 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; /** * Utility class for creating a default transition that automatically fades, * moves, and resizes views during a scene change. + * + * <p>An AutoTransition can be described in a resource file by using the + * tag <code>autoTransition</code>, along with the other standard + * attributes of {@link android.R.styleable#Transition}.</p> */ -public class AutoTransition extends TransitionGroup { +public class AutoTransition extends TransitionSet { /** - * Constructs an AutoTransition object, which is a TransitionGroup which + * Constructs an AutoTransition object, which is a TransitionSet which * first fades out disappearing targets, then moves and resizes existing * targets, and finally fades in appearing targets. * */ public AutoTransition() { - setOrdering(SEQUENTIALLY); - addTransitions(new Fade(Fade.OUT), new Move(), new Fade(Fade.IN)); + setOrdering(ORDERING_SEQUENTIAL); + addTransition(new Fade(Fade.OUT)). + addTransition(new ChangeBounds()). + addTransition(new Fade(Fade.IN)); } } diff --git a/core/java/android/view/transition/Move.java b/core/java/android/transition/ChangeBounds.java index fda0cd248f9c..8053bffa808c 100644 --- a/core/java/android/view/transition/Move.java +++ b/core/java/android/transition/ChangeBounds.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -33,13 +33,17 @@ import java.util.Map; /** * This transition captures the layout bounds of target views before and after * the scene change and animates those changes during the transition. + * + * <p>A ChangeBounds transition can be described in a resource file by using the + * tag <code>changeBounds</code>, along with the other standard + * attributes of {@link android.R.styleable#Transition}.</p> */ -public class Move extends Transition { +public class ChangeBounds extends Transition { - private static final String PROPNAME_BOUNDS = "android:move:bounds"; - private static final String PROPNAME_PARENT = "android:move:parent"; - private static final String PROPNAME_WINDOW_X = "android:move:windowX"; - private static final String PROPNAME_WINDOW_Y = "android:move:windowY"; + private static final String PROPNAME_BOUNDS = "android:changeBounds:bounds"; + private static final String PROPNAME_PARENT = "android:changeBounds:parent"; + private static final String PROPNAME_WINDOW_X = "android:changeBounds:windowX"; + private static final String PROPNAME_WINDOW_Y = "android:changeBounds:windowY"; private static final String[] sTransitionProperties = { PROPNAME_BOUNDS, PROPNAME_PARENT, @@ -50,7 +54,7 @@ public class Move extends Transition { int[] tempLocation = new int[2]; boolean mResizeClip = false; boolean mReparent = false; - private static final String LOG_TAG = "Move"; + private static final String LOG_TAG = "ChangeBounds"; private static RectEvaluator sRectEvaluator = new RectEvaluator(); @@ -64,7 +68,7 @@ public class Move extends Transition { } /** - * Setting this flag tells Move to track the before/after parent + * Setting this flag tells ChangeBounds to track the before/after parent * of every view using this transition. The flag is not enabled by * default because it requires the parent instances to be the same * in the two scenes or else all parents must use ids to allow @@ -77,8 +81,7 @@ public class Move extends Transition { mReparent = reparent; } - @Override - protected void captureValues(TransitionValues values, boolean start) { + private void captureValues(TransitionValues values) { View view = values.view; values.values.put(PROPNAME_BOUNDS, new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom())); @@ -89,7 +92,17 @@ public class Move extends Transition { } @Override - protected Animator play(final ViewGroup sceneRoot, TransitionValues startValues, + public void captureStartValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public Animator createAnimator(final ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null) { return null; @@ -105,7 +118,7 @@ public class Move extends Transition { boolean parentsEqual = (startParent == endParent) || (startParent.getId() == endParent.getId()); // TODO: Might want reparenting to be separate/subclass transition, or at least - // triggered by a property on Move. Otherwise, we're forcing the requirement that + // triggered by a property on ChangeBounds. Otherwise, we're forcing the requirement that // all parents in layouts have IDs to avoid layout-inflation resulting in a side-effect // of reparenting the views. if (!mReparent || parentsEqual) { diff --git a/core/java/android/view/transition/Crossfade.java b/core/java/android/transition/Crossfade.java index 18bb57fb4dd0..69ce872a24fb 100644 --- a/core/java/android/view/transition/Crossfade.java +++ b/core/java/android/transition/Crossfade.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -24,10 +24,8 @@ import android.animation.RectEvaluator; import android.animation.ValueAnimator; import android.graphics.Bitmap; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.util.Log; import android.view.SurfaceView; import android.view.TextureView; @@ -43,6 +41,8 @@ import java.util.Map; * * <p>Note: This transition is not compatible with {@link TextureView} * or {@link SurfaceView}.</p> + * + * @hide */ public class Crossfade extends Transition { // TODO: Add a hook that lets a Transition call user code to query whether it should run on @@ -121,12 +121,19 @@ public class Crossfade extends Transition { * @param fadeBehavior The type of fading animation to use when this * transition is run. */ - public void setFadeBehavior(int fadeBehavior) { + public Crossfade setFadeBehavior(int fadeBehavior) { if (fadeBehavior >= FADE_BEHAVIOR_CROSSFADE && fadeBehavior <= FADE_BEHAVIOR_OUT_IN) { mFadeBehavior = fadeBehavior; } + return this; } + /** + * Returns the fading behavior of the animation. + * + * @return This crossfade object. + * @see #setFadeBehavior(int) + */ public int getFadeBehavior() { return mFadeBehavior; } @@ -139,18 +146,25 @@ public class Crossfade extends Transition { * @param resizeBehavior The type of resizing behavior to use when this * transition is run. */ - public void setResizeBehavior(int resizeBehavior) { + public Crossfade setResizeBehavior(int resizeBehavior) { if (resizeBehavior >= RESIZE_BEHAVIOR_NONE && resizeBehavior <= RESIZE_BEHAVIOR_SCALE) { mResizeBehavior = resizeBehavior; } + return this; } + /** + * Returns the resizing behavior of the animation. + * + * @return This crossfade object. + * @see #setResizeBehavior(int) + */ public int getResizeBehavior() { return mResizeBehavior; } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null) { return null; @@ -243,18 +257,16 @@ public class Crossfade extends Transition { } } - @Override - protected void captureValues(TransitionValues values, boolean start) { - View view = values.view; + private void captureValues(TransitionValues transitionValues) { + View view = transitionValues.view; Rect bounds = new Rect(0, 0, view.getWidth(), view.getHeight()); if (mFadeBehavior != FADE_BEHAVIOR_REVEAL) { bounds.offset(view.getLeft(), view.getTop()); } - values.values.put(PROPNAME_BOUNDS, bounds); + transitionValues.values.put(PROPNAME_BOUNDS, bounds); if (Transition.DBG) { - Log.d(LOG_TAG, "Captured bounds " + values.values.get(PROPNAME_BOUNDS) + ": start = " + - start); + Log.d(LOG_TAG, "Captured bounds " + transitionValues.values.get(PROPNAME_BOUNDS)); } Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); @@ -264,12 +276,21 @@ public class Crossfade extends Transition { Canvas c = new Canvas(bitmap); view.draw(c); } - values.values.put(PROPNAME_BITMAP, bitmap); + transitionValues.values.put(PROPNAME_BITMAP, bitmap); // TODO: I don't have resources, can't call the non-deprecated method? BitmapDrawable drawable = new BitmapDrawable(bitmap); // TODO: lrtb will be wrong if the view has transXY set drawable.setBounds(bounds); - values.values.put(PROPNAME_DRAWABLE, drawable); + transitionValues.values.put(PROPNAME_DRAWABLE, drawable); } + @Override + public void captureStartValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } } diff --git a/core/java/android/view/transition/Fade.java b/core/java/android/transition/Fade.java index 45c21d888ac5..12e0d73db389 100644 --- a/core/java/android/view/transition/Fade.java +++ b/core/java/android/transition/Fade.java @@ -14,12 +14,11 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -30,6 +29,12 @@ import android.view.ViewGroup; * or non-visible. Visibility is determined by both the * {@link View#setVisibility(int)} state of the view as well as whether it * is parented in the current view hierarchy. + * + * <p>A Fade transition can be described in a resource file by using the + * tag <code>fade</code>, along with the standard + * attributes of {@link android.R.styleable#Fade} and + * {@link android.R.styleable#Transition}.</p> + */ public class Fade extends Visibility { @@ -93,21 +98,31 @@ public class Fade extends Visibility { return anim; } - @Override - protected void captureValues(TransitionValues values, boolean start) { - super.captureValues(values, start); - float alpha = values.view.getAlpha(); - values.values.put(PROPNAME_ALPHA, alpha); + private void captureValues(TransitionValues transitionValues) { + float alpha = transitionValues.view.getAlpha(); + transitionValues.values.put(PROPNAME_ALPHA, alpha); int[] loc = new int[2]; - values.view.getLocationOnScreen(loc); - values.values.put(PROPNAME_SCREEN_X, loc[0]); - values.values.put(PROPNAME_SCREEN_Y, loc[1]); + transitionValues.view.getLocationOnScreen(loc); + transitionValues.values.put(PROPNAME_SCREEN_X, loc[0]); + transitionValues.values.put(PROPNAME_SCREEN_Y, loc[1]); + } + + @Override + public void captureStartValues(TransitionValues transitionValues) { + super.captureStartValues(transitionValues); + captureValues(transitionValues); + } + + + @Override + public void captureEndValues(TransitionValues transitionValues) { + super.captureEndValues(transitionValues); } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { - Animator animator = super.play(sceneRoot, startValues, endValues); + Animator animator = super.createAnimator(sceneRoot, startValues, endValues); if (animator == null && startValues != null && endValues != null) { boolean endVisible = isVisible(endValues); final View endView = endValues.view; @@ -122,13 +137,18 @@ public class Fade extends Visibility { } @Override - protected Animator appear(ViewGroup sceneRoot, + public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { if ((mFadingMode & IN) != IN || endValues == null) { return null; } final View endView = endValues.view; + if (DBG) { + View startView = (startValues != null) ? startValues.view : null; + Log.d(LOG_TAG, "Fade.onDisappear: startView, startVis, endView, endVis = " + + startView + ", " + startVisibility + ", " + endView + ", " + endVisibility); + } // if alpha < 1, just fade it in from the current value if (endView.getAlpha() == 1.0f) { endView.setAlpha(0); @@ -137,7 +157,7 @@ public class Fade extends Visibility { } @Override - protected Animator disappear(ViewGroup sceneRoot, + public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { if ((mFadingMode & OUT) != OUT) { @@ -147,7 +167,7 @@ public class Fade extends Visibility { View startView = (startValues != null) ? startValues.view : null; View endView = (endValues != null) ? endValues.view : null; if (DBG) { - Log.d(LOG_TAG, "Fade.predisappear: startView, startVis, endView, endVis = " + + Log.d(LOG_TAG, "Fade.onDisappear: startView, startVis, endView, endVis = " + startView + ", " + startVisibility + ", " + endView + ", " + endVisibility); } View overlayView = null; diff --git a/core/java/android/view/transition/Recolor.java b/core/java/android/transition/Recolor.java index e4858c4d0a11..70111d12fdee 100644 --- a/core/java/android/view/transition/Recolor.java +++ b/core/java/android/transition/Recolor.java @@ -14,20 +14,17 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.ArgbEvaluator; import android.animation.ObjectAnimator; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; -import android.util.ArrayMap; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import java.util.Map; - /** * This transition tracks changes during scene changes to the * {@link View#setBackground(android.graphics.drawable.Drawable) background} @@ -36,22 +33,34 @@ import java.util.Map; * {@link TextView#setTextColor(android.content.res.ColorStateList) * color} of the text for target TextViews. If the color changes between * scenes, the color change is animated. + * + * @hide */ public class Recolor extends Transition { private static final String PROPNAME_BACKGROUND = "android:recolor:background"; private static final String PROPNAME_TEXT_COLOR = "android:recolor:textColor"; - @Override - protected void captureValues(TransitionValues values, boolean start) { - values.values.put(PROPNAME_BACKGROUND, values.view.getBackground()); - if (values.view instanceof TextView) { - values.values.put(PROPNAME_TEXT_COLOR, ((TextView)values.view).getCurrentTextColor()); + private void captureValues(TransitionValues transitionValues) { + transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground()); + if (transitionValues.view instanceof TextView) { + transitionValues.values.put(PROPNAME_TEXT_COLOR, + ((TextView)transitionValues.view).getCurrentTextColor()); } } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public void captureStartValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null) { return null; diff --git a/core/java/android/view/transition/Rotate.java b/core/java/android/transition/Rotate.java index d35a6dc745e5..ad1720ca78b7 100644 --- a/core/java/android/view/transition/Rotate.java +++ b/core/java/android/transition/Rotate.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.ObjectAnimator; @@ -24,18 +24,25 @@ import android.view.ViewGroup; /** * This transition captures the rotation property of targets before and after * the scene change and animates any changes. + * + * @hide */ public class Rotate extends Transition { private static final String PROPNAME_ROTATION = "android:rotate:rotation"; @Override - protected void captureValues(TransitionValues values, boolean start) { - values.values.put(PROPNAME_ROTATION, values.view.getRotation()); + public void captureStartValues(TransitionValues transitionValues) { + transitionValues.values.put(PROPNAME_ROTATION, transitionValues.view.getRotation()); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + transitionValues.values.put(PROPNAME_ROTATION, transitionValues.view.getRotation()); } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null) { return null; diff --git a/core/java/android/view/transition/Scene.java b/core/java/android/transition/Scene.java index cf3eadb584e4..f81eeef153b5 100644 --- a/core/java/android/view/transition/Scene.java +++ b/core/java/android/transition/Scene.java @@ -14,10 +14,12 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.content.Context; +import android.util.SparseArray; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; /** @@ -34,6 +36,37 @@ public final class Scene { private ViewGroup mSceneRoot; private ViewGroup mLayout; // alternative to layoutId Runnable mEnterAction, mExitAction; + private static ThreadLocal<SparseArray<Scene>> sScenes = new ThreadLocal<SparseArray<Scene>>(); + + /** + * Returns a Scene described by the resource file associated with the given + * <code>layoutId</code> parameter. If such a Scene has already been created, + * that same Scene will be returned. This caching of layoutId-based scenes enables + * sharing of common scenes between those created in code and those referenced + * by {@link TransitionManager} XML resource files. + * + * @param sceneRoot The root of the hierarchy in which scene changes + * and transitions will take place. + * @param layoutId The id of a standard layout resource file. + * @param context The context used in the process of inflating + * the layout resource. + * @return + */ + public static Scene getSceneForLayout(ViewGroup sceneRoot, int layoutId, Context context) { + SparseArray<Scene> scenes = sScenes.get(); + if (scenes == null) { + scenes = new SparseArray<Scene>(); + sScenes.set(scenes); + } + Scene scene = scenes.get(layoutId); + if (scene != null) { + return scene; + } else { + scene = new Scene(sceneRoot, layoutId, context); + scenes.put(layoutId, scene); + return scene; + } + } /** * Constructs a Scene with no information about how values will change @@ -54,6 +87,9 @@ public final class Scene { * children from the sceneRoot container and will inflate and add * the hierarchy specified by the layoutId resource file. * + * <p>This method is hidden because layoutId-based scenes should be + * created by the caching factory method {@link Scene#getCurrentScene(View)}.</p> + * * @param sceneRoot The root of the hierarchy in which scene changes * and transitions will take place. * @param layoutId The id of a resource file that defines the view @@ -61,7 +97,7 @@ public final class Scene { * @param context The context used in the process of inflating * the layout resource. */ - public Scene(ViewGroup sceneRoot, int layoutId, Context context) { + private Scene(ViewGroup sceneRoot, int layoutId, Context context) { mContext = context; mSceneRoot = sceneRoot; mLayoutId = layoutId; @@ -74,7 +110,7 @@ public final class Scene { * * @param sceneRoot The root of the hierarchy in which scene changes * and transitions will take place. - * @param layout The view hiearrchy of this scene, added as a child + * @param layout The view hierarchy of this scene, added as a child * of sceneRoot when this scene is entered. */ public Scene(ViewGroup sceneRoot, ViewGroup layout) { @@ -94,19 +130,14 @@ public final class Scene { } /** - * Exits this scene, if it is the {@link ViewGroup#getCurrentScene() - * currentScene} on the scene's {@link #getSceneRoot() scene root}. - * Exiting a scene involves removing the layout added if the scene - * has either a layoutId or layout view group (set at construction - * time) and running the {@link #setExitAction(Runnable) exit action} + * Exits this scene, if it is the current scene + * on the scene's {@link #getSceneRoot() scene root}. The current scene is + * set when {@link #enter() entering} a scene. + * Exiting a scene runs the {@link #setExitAction(Runnable) exit action} * if there is one. */ public void exit() { - if (mSceneRoot.getCurrentScene() == this) { - if (mLayoutId >= 0 || mLayout != null) { - // Undo layout change caused by entering this scene - getSceneRoot().removeAllViews(); - } + if (getCurrentScene(mSceneRoot) == this) { if (mExitAction != null) { mExitAction.run(); } @@ -127,8 +158,7 @@ public final class Scene { // Apply layout change, if any if (mLayoutId >= 0 || mLayout != null) { - // redundant with exit() action of previous scene, but must - // empty out that parent container before adding to it + // empty out parent container before adding to it getSceneRoot().removeAllViews(); if (mLayoutId >= 0) { @@ -143,7 +173,30 @@ public final class Scene { mEnterAction.run(); } - mSceneRoot.setCurrentScene(this ); + setCurrentScene(mSceneRoot, this); + } + + /** + * Set the scene that the given view is in. The current scene is set only + * on the root view of a scene, not for every view in that hierarchy. This + * information is used by Scene to determine whether there is a previous + * scene which should be exited before the new scene is entered. + * + * @param view The view on which the current scene is being set + */ + static void setCurrentScene(View view, Scene scene) { + view.setTagInternal(com.android.internal.R.id.current_scene, scene); + } + + /** + * Gets the current {@link Scene} set on the given view. A scene is set on a view + * only if that view is the scene root. + * + * @return The current Scene set on this view. A value of null indicates that + * no Scene is currently set. + */ + static Scene getCurrentScene(View view) { + return (Scene) view.getTag(com.android.internal.R.id.current_scene); } /** diff --git a/core/java/android/view/transition/Slide.java b/core/java/android/transition/Slide.java index b2f5db5ea522..b38973ce122d 100644 --- a/core/java/android/view/transition/Slide.java +++ b/core/java/android/transition/Slide.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.ObjectAnimator; @@ -28,6 +28,8 @@ import android.view.animation.DecelerateInterpolator; * This transition captures the visibility of target objects before and * after a scene change and animates any changes by sliding the target * objects into or out of place. + * + * @hide */ public class Slide extends Visibility { @@ -37,7 +39,7 @@ public class Slide extends Visibility { private static final TimeInterpolator sDecelerator = new DecelerateInterpolator(); @Override - protected Animator appear(ViewGroup sceneRoot, + public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { View endView = (endValues != null) ? endValues.view : null; @@ -49,7 +51,7 @@ public class Slide extends Visibility { } @Override - protected Animator disappear(ViewGroup sceneRoot, + public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { View startView = (startValues != null) ? startValues.view : null; diff --git a/core/java/android/view/transition/TextChange.java b/core/java/android/transition/TextChange.java index 7973c97eda25..1b26942fe152 100644 --- a/core/java/android/view/transition/TextChange.java +++ b/core/java/android/transition/TextChange.java @@ -14,14 +14,13 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.graphics.Color; -import android.util.ArrayMap; import android.view.ViewGroup; import android.widget.TextView; @@ -33,6 +32,8 @@ import java.util.Map; * starting text stays until the transition ends, at which point it changes * to the end text. This is useful in situations where you want to resize a * text view to its new size before displaying the text that goes there. + * + * @hide */ public class TextChange extends Transition { private static final String PROPNAME_TEXT = "android:textchange:text"; @@ -84,15 +85,18 @@ public class TextChange extends Transition { /** * Sets the type of changing animation that will be run, one of - * {@link #CHANGE_BEHAVIOR_KEEP} and {@link #CHANGE_BEHAVIOR_OUT_IN}. + * {@link #CHANGE_BEHAVIOR_KEEP}, {@link #CHANGE_BEHAVIOR_OUT}, + * {@link #CHANGE_BEHAVIOR_IN}, and {@link #CHANGE_BEHAVIOR_OUT_IN}. * * @param changeBehavior The type of fading animation to use when this * transition is run. + * @return this textChange object. */ - public void setChangeBehavior(int changeBehavior) { + public TextChange setChangeBehavior(int changeBehavior) { if (changeBehavior >= CHANGE_BEHAVIOR_KEEP && changeBehavior <= CHANGE_BEHAVIOR_OUT_IN) { mChangeBehavior = changeBehavior; } + return this; } @Override @@ -100,19 +104,38 @@ public class TextChange extends Transition { return sTransitionProperties; } - @Override - protected void captureValues(TransitionValues values, boolean start) { - if (values.view instanceof TextView) { - TextView textview = (TextView) values.view; - values.values.put(PROPNAME_TEXT, textview.getText()); + /** + * Returns the type of changing animation that will be run. + * + * @return either {@link #CHANGE_BEHAVIOR_KEEP}, {@link #CHANGE_BEHAVIOR_OUT}, + * {@link #CHANGE_BEHAVIOR_IN}, or {@link #CHANGE_BEHAVIOR_OUT_IN}. + */ + public int getChangeBehavior() { + return mChangeBehavior; + } + + private void captureValues(TransitionValues transitionValues) { + if (transitionValues.view instanceof TextView) { + TextView textview = (TextView) transitionValues.view; + transitionValues.values.put(PROPNAME_TEXT, textview.getText()); if (mChangeBehavior > CHANGE_BEHAVIOR_KEEP) { - values.values.put(PROPNAME_TEXT_COLOR, textview.getCurrentTextColor()); + transitionValues.values.put(PROPNAME_TEXT_COLOR, textview.getCurrentTextColor()); } } } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public void captureStartValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + + @Override + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { if (startValues == null || endValues == null || !(endValues.view instanceof TextView)) { return null; diff --git a/core/java/android/view/transition/Transition.java b/core/java/android/transition/Transition.java index a66fa52cd33e..59df183c0528 100644 --- a/core/java/android/view/transition/Transition.java +++ b/core/java/android/transition/Transition.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; @@ -31,11 +31,12 @@ import android.view.ViewOverlay; import android.widget.ListView; import java.util.ArrayList; +import java.util.List; /** * A Transition holds information about animations that will be run on its * targets during a scene change. Subclasses of this abstract class may - * choreograph several child transitions ({@link TransitionGroup} or they may + * choreograph several child transitions ({@link TransitionSet} or they may * perform custom animations themselves. Any Transition has two main jobs: * (1) capture property values, and (2) play animations based on changes to * captured property values. A custom transition knows what property values @@ -50,9 +51,42 @@ import java.util.ArrayList; * a non-UI thread, so changes to the view due to transitions (such as moving * and resizing the view) may be out of sync with the display inside those bounds. * TextureView is more compatible with transitions in general, but some - * specific transitions (such as {@link Crossfade}) may not be compatible + * specific transitions (such as {@link Fade}) may not be compatible * with TextureView because they rely on {@link ViewOverlay} functionality, * which does not currently work with TextureView.</p> + * + * <p>Transitions can be declared in XML resource files inside the <code>res/transition</code> + * directory. Transition resources consist of a tag name for one of the Transition + * subclasses along with attributes to define some of the attributes of that transition. + * For example, here is a minimal resource file that declares a {@link ChangeBounds} transition:</p> + * + * {@sample development/samples/ApiDemos/res/transition/changebounds.xml ChangeBounds} + * + * <p>Note that attributes for the transition are not required, just as they are + * optional when declared in code; Transitions created from XML resources will use + * the same defaults as their code-created equivalents. Here is a slightly more + * elaborate example which declares a {@link TransitionSet} transition with + * {@link ChangeBounds} and {@link Fade} child transitions:</p> + * + * {@sample + * development/samples/ApiDemos/res/transition/changebounds_fadeout_sequential.xml TransitionSet} + * + * <p>In this example, the transitionOrdering attribute is used on the TransitionSet + * object to change from the default {@link TransitionSet#ORDERING_TOGETHER} behavior + * to be {@link TransitionSet#ORDERING_SEQUENTIAL} instead. Also, the {@link Fade} + * transition uses a fadingMode of {@link Fade#OUT} instead of the default + * out-in behavior. Finally, note the use of the <code>targets</code> sub-tag, which + * takes a set of {@link android.R.styleable#TransitionTarget target} tags, each + * of which lists a specific <code>targetId</code> which this transition acts upon. + * Use of targets is optional, but can be used to either limit the time spent checking + * attributes on unchanging views, or limiting the types of animations run on specific views. + * In this case, we know that only the <code>grayscaleContainer</code> will be + * disappearing, so we choose to limit the {@link Fade} transition to only that view.</p> + * + * Further information on XML resource descriptions for transitions can be found for + * {@link android.R.styleable#Transition}, {@link android.R.styleable#TransitionSet}, + * {@link android.R.styleable#TransitionTarget}, and {@link android.R.styleable#Fade}. + * */ public abstract class Transition implements Cloneable { @@ -64,17 +98,17 @@ public abstract class Transition implements Cloneable { long mStartDelay = -1; long mDuration = -1; TimeInterpolator mInterpolator = null; - int[] mTargetIds; - View[] mTargets; + ArrayList<Integer> mTargetIds = new ArrayList<Integer>(); + ArrayList<View> mTargets = new ArrayList<View>(); private TransitionValuesMaps mStartValues = new TransitionValuesMaps(); private TransitionValuesMaps mEndValues = new TransitionValuesMaps(); - TransitionGroup mParent = null; + TransitionSet mParent = null; // Per-animator information used for later canceling when future transitions overlap private static ThreadLocal<ArrayMap<Animator, AnimationInfo>> sRunningAnimators = new ThreadLocal<ArrayMap<Animator, AnimationInfo>>(); - // Scene Root is set at play() time in the cloned Transition + // Scene Root is set at createAnimator() time in the cloned Transition ViewGroup mSceneRoot = null; // Track all animators in use in case the transition gets canceled and needs to @@ -91,14 +125,15 @@ public abstract class Transition implements Cloneable { // The set of listeners to be sent transition lifecycle events. ArrayList<TransitionListener> mListeners = null; - // The set of animators collected from calls to play(), to be run in runAnimations() + // The set of animators collected from calls to createAnimator(), + // to be run in runAnimators() ArrayList<Animator> mAnimators = new ArrayList<Animator>(); /** * Constructs a Transition object with no target objects. A transition with * no targets defaults to running on all target objects in the scene hierarchy - * (if the transition is not contained in a TransitionGroup), or all target - * objects passed down from its parent (if it is in a TransitionGroup). + * (if the transition is not contained in a TransitionSet), or all target + * objects passed down from its parent (if it is in a TransitionSet). */ public Transition() {} @@ -110,6 +145,7 @@ public abstract class Transition implements Cloneable { * * @param duration The length of the animation, in milliseconds. * @return This transition object. + * @attr ref android.R.styleable#Transition_duration */ public Transition setDuration(long duration) { mDuration = duration; @@ -121,8 +157,8 @@ public abstract class Transition implements Cloneable { * the returned value will be negative, indicating that resulting animators will * retain their own durations. * - * @return The duration set on this transition, if one has been set, otherwise - * returns a negative number. + * @return The duration set on this transition, in milliseconds, if one has been + * set, otherwise returns a negative number. */ public long getDuration() { return mDuration; @@ -135,9 +171,12 @@ public abstract class Transition implements Cloneable { * Transition is set, that delay will override the Animator delay. * * @param startDelay The length of the delay, in milliseconds. + * @return This transition object. + * @attr ref android.R.styleable#Transition_startDelay */ - public void setStartDelay(long startDelay) { + public Transition setStartDelay(long startDelay) { mStartDelay = startDelay; + return this; } /** @@ -145,8 +184,8 @@ public abstract class Transition implements Cloneable { * the returned value will be negative, indicating that resulting animators will * retain their own startDelays. * - * @return The startDealy set on this transition, if one has been set, otherwise - * returns a negative number. + * @return The startDelay set on this transition, in milliseconds, if one has + * been set, otherwise returns a negative number. */ public long getStartDelay() { return mStartDelay; @@ -159,9 +198,12 @@ public abstract class Transition implements Cloneable { * Transition is set, that interpolator will override the Animator interpolator. * * @param interpolator The time interpolator used by the transition + * @return This transition object. + * @attr ref android.R.styleable#Transition_interpolator */ - public void setInterpolator(TimeInterpolator interpolator) { + public Transition setInterpolator(TimeInterpolator interpolator) { mInterpolator = interpolator; + return this; } /** @@ -178,7 +220,7 @@ public abstract class Transition implements Cloneable { /** * Returns the set of property names used stored in the {@link TransitionValues} - * object passed into {@link #captureValues(TransitionValues, boolean)} that + * object passed into {@link #captureStartValues(TransitionValues)} that * this transition cares about for the purposes of canceling overlapping animations. * When any transition is started on a given scene root, all transitions * currently running on that same scene root are checked to see whether the @@ -202,11 +244,17 @@ public abstract class Transition implements Cloneable { } /** - * This method is called by the transition's parent (all the way up to the + * This method creates an animation that will be run for this transition + * given the information in the startValues and endValues structures captured + * earlier for the start and end scenes. Subclasses of Transition should override + * this method. The method should only be called by the transition system; it is + * not intended to be called from external classes. + * + * <p>This method is called by the transition's parent (all the way up to the * topmost Transition in the hierarchy) with the sceneRoot and start/end * values that the transition may need to set up initial target values * and construct an appropriate animation. For example, if an overall - * Transition is a {@link TransitionGroup} consisting of several + * Transition is a {@link TransitionSet} consisting of several * child transitions in sequence, then some of the child transitions may * want to set initial values on target views prior to the overall * Transition commencing, to put them in an appropriate state for the @@ -216,14 +264,13 @@ public abstract class Transition implements Cloneable { * actually starting the animation. This is necessary because the scene * change that triggers the Transition will automatically set the end-scene * on all target views, so a Transition that wants to animate from a - * different value should set that value prior to returning from this method. + * different value should set that value prior to returning from this method.</p> * * <p>Additionally, a Transition can perform logic to determine whether * the transition needs to run on the given target and start/end values. * For example, a transition that resizes objects on the screen may wish * to avoid running for views which are not present in either the start - * or end scenes. A return value of <code>null</code> indicates that - * no animation should run. The default implementation returns null.</p> + * or end scenes.</p> * * <p>If there is an animator created and returned from this method, the * transition mechanism will apply any applicable duration, startDelay, @@ -234,31 +281,34 @@ public abstract class Transition implements Cloneable { * <p>The method is called for every applicable target object, which is * stored in the {@link TransitionValues#view} field.</p> * - * @param sceneRoot - * @param startValues - * @param endValues - * @return A non-null Animator to be started at the appropriate time in the - * overall transition for this scene change, null otherwise. + * + * @param sceneRoot The root of the transition hierarchy. + * @param startValues The values for a specific target in the start scene. + * @param endValues The values for the target in the end scene. + * @return A Animator to be started at the appropriate time in the + * overall transition for this scene change. A null value means no animation + * should be run. */ - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { return null; } /** - * This version of play() is called with the entire set of start/end + * This method, essentially a wrapper around all calls to createAnimator for all + * possible target views, is called with the entire set of start/end * values. The implementation in Transition iterates through these lists - * and calls {@link #play(ViewGroup, TransitionValues, TransitionValues)} + * and calls {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)} * with each set of start/end values on this transition. The - * TransitionGroup subclass overrides this method and delegates it to + * TransitionSet subclass overrides this method and delegates it to * each of its children in succession. * * @hide */ - protected void play(ViewGroup sceneRoot, TransitionValuesMaps startValues, + protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, TransitionValuesMaps endValues) { if (DBG) { - Log.d(LOG_TAG, "play() for " + this); + Log.d(LOG_TAG, "createAnimators() for " + this); } ArrayMap<View, TransitionValues> endCopy = new ArrayMap<View, TransitionValues>(endValues.viewValues); @@ -392,7 +442,7 @@ public abstract class Transition implements Cloneable { } } // TODO: what to do about targetIds and itemIds? - Animator animator = play(sceneRoot, start, end); + Animator animator = createAnimator(sceneRoot, start, end); if (animator != null) { // Save animation info for future cancellation purposes View view = null; @@ -450,19 +500,19 @@ public abstract class Transition implements Cloneable { * views are ignored and only the ids are used). */ boolean isValidTarget(View target, long targetId) { - if (mTargetIds == null && mTargets == null) { + if (mTargetIds.size() == 0 && mTargets.size() == 0) { return true; } - if (mTargetIds != null) { - for (int i = 0; i < mTargetIds.length; ++i) { - if (mTargetIds[i] == targetId) { + if (mTargetIds.size() > 0) { + for (int i = 0; i < mTargetIds.size(); ++i) { + if (mTargetIds.get(i) == targetId) { return true; } } } - if (target != null && mTargets != null) { - for (int i = 0; i < mTargets.length; ++i) { - if (mTargets[i] == target) { + if (target != null && mTargets.size() > 0) { + for (int i = 0; i < mTargets.size(); ++i) { + if (mTargets.get(i) == target) { return true; } } @@ -485,13 +535,13 @@ public abstract class Transition implements Cloneable { * * @hide */ - protected void runAnimations() { + protected void runAnimators() { if (DBG) { - Log.d(LOG_TAG, "runAnimations() on " + this); + Log.d(LOG_TAG, "runAnimators() on " + this); } start(); ArrayMap<Animator, AnimationInfo> runningAnimators = getRunningAnimators(); - // Now start every Animator that was previously created for this transition in play() + // Now start every Animator that was previously created for this transition for (Animator anim : mAnimators) { if (DBG) { Log.d(LOG_TAG, " anim: " + anim); @@ -525,17 +575,49 @@ public abstract class Transition implements Cloneable { } /** - * Captures the current scene of values for the properties that this - * transition monitors. These values can be either the start or end - * values used in a subsequent call to - * {@link #play(ViewGroup, TransitionValues, TransitionValues)}, as indicated by - * <code>start</code>. The main concern for an implementation is what the + * Captures the values in the start scene for the properties that this + * transition monitors. These values are then passed as the startValues + * structure in a later call to + * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}. + * The main concern for an implementation is what the + * properties are that the transition cares about and what the values are + * for all of those properties. The start and end values will be compared + * later during the + * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues)} + * method to determine what, if any, animations, should be run. + * + * <p>Subclasses must implement this method. The method should only be called by the + * transition system; it is not intended to be called from external classes.</p> + * + * @param transitionValues The holder for any values that the Transition + * wishes to store. Values are stored in the <code>values</code> field + * of this TransitionValues object and are keyed from + * a String value. For example, to store a view's rotation value, + * a transition might call + * <code>transitionValues.values.put("appname:transitionname:rotation", + * view.getRotation())</code>. The target view will already be stored in + * the transitionValues structure when this method is called. + * + * @see #captureEndValues(TransitionValues) + * @see #createAnimator(ViewGroup, TransitionValues, TransitionValues) + */ + public abstract void captureStartValues(TransitionValues transitionValues); + + /** + * Captures the values in the end scene for the properties that this + * transition monitors. These values are then passed as the endValues + * structure in a later call to + * {@link #createAnimator(ViewGroup, TransitionValues, TransitionValues)}. + * The main concern for an implementation is what the * properties are that the transition cares about and what the values are * for all of those properties. The start and end values will be compared * later during the - * {@link #play(android.view.ViewGroup, TransitionValues, TransitionValues)} + * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues)} * method to determine what, if any, animations, should be run. * + * <p>Subclasses must implement this method. The method should only be called by the + * transition system; it is not intended to be called from external classes.</p> + * * @param transitionValues The holder for any values that the Transition * wishes to store. Values are stored in the <code>values</code> field * of this TransitionValues object and are keyed from @@ -544,29 +626,51 @@ public abstract class Transition implements Cloneable { * <code>transitionValues.values.put("appname:transitionname:rotation", * view.getRotation())</code>. The target view will already be stored in * the transitionValues structure when this method is called. + * + * @see #captureStartValues(TransitionValues) + * @see #createAnimator(ViewGroup, TransitionValues, TransitionValues) */ - protected abstract void captureValues(TransitionValues transitionValues, boolean start); + public abstract void captureEndValues(TransitionValues transitionValues); /** - * Sets the ids of target views that this Transition is interested in + * Adds the id of a target view that this Transition is interested in * animating. By default, there are no targetIds, and a Transition will * listen for changes on every view in the hierarchy below the sceneRoot - * of the Scene being transitioned into. Setting targetIDs constrains + * of the Scene being transitioned into. Setting targetIds constrains * the Transition to only listen for, and act on, views with these IDs. * Views with different IDs, or no IDs whatsoever, will be ignored. * + * <p>Note that using ids to specify targets implies that ids should be unique + * within the view hierarchy underneat the scene root.</p> + * * @see View#getId() - * @param targetIds A list of IDs which specify the set of Views on which - * the Transition will act. - * @return Transition The Transition on which the targetIds have been set. + * @param targetId The id of a target view, must be a positive number. + * @return The Transition to which the targetId is added. + * Returning the same object makes it easier to chain calls during + * construction, such as + * <code>transitionSet.addTransitions(new Fade()).addTargetId(someId);</code> + */ + public Transition addTargetId(int targetId) { + if (targetId > 0) { + mTargetIds.add(targetId); + } + return this; + } + + /** + * Removes the given targetId from the list of ids that this Transition + * is interested in animating. + * + * @param targetId The id of a target view, must be a positive number. + * @return The Transition from which the targetId is removed. * Returning the same object makes it easier to chain calls during * construction, such as - * <code>transitionGroup.addTransitions(new Fade()).setTargetIds(someId);</code> + * <code>transitionSet.addTransitions(new Fade()).removeTargetId(someId);</code> */ - public Transition setTargetIds(int... targetIds) { - int numTargets = targetIds.length; - mTargetIds = new int[numTargets]; - System.arraycopy(targetIds, 0, mTargetIds, 0, numTargets); + public Transition removeTargetId(int targetId) { + if (targetId > 0) { + mTargetIds.remove(targetId); + } return this; } @@ -578,28 +682,43 @@ public abstract class Transition implements Cloneable { * the Transition to only listen for, and act on, these views. * All other views will be ignored. * - * <p>The target list is like the {@link #setTargetIds(int...) targetId} + * <p>The target list is like the {@link #addTargetId(int) targetId} * list except this list specifies the actual View instances, not the ids * of the views. This is an important distinction when scene changes involve * view hierarchies which have been inflated separately; different views may * share the same id but not actually be the same instance. If the transition - * should treat those views as the same, then seTargetIds() should be used - * instead of setTargets(). If, on the other hand, scene changes involve + * should treat those views as the same, then {@link #addTargetId(int)} should be used + * instead of {@link #addTarget(View)}. If, on the other hand, scene changes involve * changes all within the same view hierarchy, among views which do not - * necessary have ids set on them, then the target list may be more + * necessarily have ids set on them, then the target list of views may be more * convenient.</p> * - * @see #setTargetIds(int...) - * @param targets A list of Views on which the Transition will act. - * @return Transition The Transition on which the targets have been set. + * @see #addTargetId(int) + * @param target A View on which the Transition will act, must be non-null. + * @return The Transition to which the target is added. + * Returning the same object makes it easier to chain calls during + * construction, such as + * <code>transitionSet.addTransitions(new Fade()).addTarget(someView);</code> + */ + public Transition addTarget(View target) { + mTargets.add(target); + return this; + } + + /** + * Removes the given target from the list of targets that this Transition + * is interested in animating. + * + * @param target The target view, must be non-null. + * @return Transition The Transition from which the target is removed. * Returning the same object makes it easier to chain calls during * construction, such as - * <code>transitionGroup.addTransitions(new Fade()).setTargets(someView);</code> + * <code>transitionSet.addTransitions(new Fade()).removeTarget(someView);</code> */ - public Transition setTargets(View... targets) { - int numTargets = targets.length; - mTargets = new View[numTargets]; - System.arraycopy(targets, 0, mTargets, 0, numTargets); + public Transition removeTarget(View target) { + if (target != null) { + mTargets.remove(target); + } return this; } @@ -612,7 +731,7 @@ public abstract class Transition implements Cloneable { * * @return the list of target IDs */ - public int[] getTargetIds() { + public List<Integer> getTargetIds() { return mTargetIds; } @@ -625,7 +744,7 @@ public abstract class Transition implements Cloneable { * * @return the list of target views */ - public View[] getTargets() { + public List<View> getTargets() { return mTargets; } @@ -646,16 +765,19 @@ public abstract class Transition implements Cloneable { mEndValues.idValues.clear(); mEndValues.itemIdValues.clear(); } - if (mTargetIds != null && mTargetIds.length > 0 || - mTargets != null && mTargets.length > 0) { - if (mTargetIds != null) { - for (int i = 0; i < mTargetIds.length; ++i) { - int id = mTargetIds[i]; + if (mTargetIds.size() > 0 || mTargets.size() > 0) { + if (mTargetIds.size() > 0) { + for (int i = 0; i < mTargetIds.size(); ++i) { + int id = mTargetIds.get(i); View view = sceneRoot.findViewById(id); if (view != null) { TransitionValues values = new TransitionValues(); values.view = view; - captureValues(values, start); + if (start) { + captureStartValues(values); + } else { + captureEndValues(values); + } if (start) { mStartValues.viewValues.put(view, values); if (id >= 0) { @@ -670,13 +792,17 @@ public abstract class Transition implements Cloneable { } } } - if (mTargets != null) { - for (int i = 0; i < mTargets.length; ++i) { - View view = mTargets[i]; + if (mTargets.size() > 0) { + for (int i = 0; i < mTargets.size(); ++i) { + View view = mTargets.get(i); if (view != null) { TransitionValues values = new TransitionValues(); values.view = view; - captureValues(values, start); + if (start) { + captureStartValues(values); + } else { + captureEndValues(values); + } if (start) { mStartValues.viewValues.put(view, values); } else { @@ -723,7 +849,7 @@ public abstract class Transition implements Cloneable { } TransitionValues values = new TransitionValues(); values.view = view; - captureValues(values, start); + captureStartValues(values); if (start) { if (!isListViewItem) { mStartValues.viewValues.put(view, values); @@ -757,7 +883,7 @@ public abstract class Transition implements Cloneable { * necessary, for example, to query the before/after state of related views * for a given transition. */ - protected TransitionValues getTransitionValues(View view, boolean start) { + public TransitionValues getTransitionValues(View view, boolean start) { if (mParent != null) { return mParent.getTransitionValues(view, start); } @@ -834,7 +960,7 @@ public abstract class Transition implements Cloneable { /** * Called by TransitionManager to play the transition. This calls - * play() to set things up and create all of the animations and then + * createAnimators() to set things up and create all of the animations and then * runAnimations() to actually start the animations. */ void playTransition(ViewGroup sceneRoot) { @@ -889,11 +1015,8 @@ public abstract class Transition implements Cloneable { } } - // setup() must be called on entire transition hierarchy and set of views - // before calling play() on anything; every transition needs a chance to set up - // target views appropriately before transitions begin running - play(sceneRoot, mStartValues, mEndValues); - runAnimations(); + createAnimators(sceneRoot, mStartValues, mEndValues); + runAnimators(); } /** @@ -933,7 +1056,7 @@ public abstract class Transition implements Cloneable { /** * This method is called automatically by the transition and - * TransitionGroup classes prior to a Transition subclass starting; + * TransitionSet classes prior to a Transition subclass starting; * subclasses should not need to call it directly. * * @hide @@ -954,9 +1077,9 @@ public abstract class Transition implements Cloneable { /** * This method is called automatically by the Transition and - * TransitionGroup classes when a transition finishes, either because + * TransitionSet classes when a transition finishes, either because * a transition did nothing (returned a null Animator from - * {@link Transition#play(ViewGroup, TransitionValues, + * {@link Transition#createAnimator(ViewGroup, TransitionValues, * TransitionValues)}) or because the transition returned a valid * Animator and end() was called in the onAnimationEnd() * callback of the AnimatorListener. @@ -993,11 +1116,10 @@ public abstract class Transition implements Cloneable { /** * This method cancels a transition that is currently running. - * Implementation TBD. + * + * @hide */ protected void cancel() { - // TODO: how does this work with instances? - // TODO: this doesn't actually do *anything* yet int numAnimators = mCurrentAnimators.size(); for (int i = numAnimators - 1; i >= 0; i--) { Animator animator = mCurrentAnimators.get(i); @@ -1019,12 +1141,14 @@ public abstract class Transition implements Cloneable { * * @param listener the listener to be added to the current set of listeners * for this animation. + * @return This transition object. */ - public void addListener(TransitionListener listener) { + public Transition addListener(TransitionListener listener) { if (mListeners == null) { mListeners = new ArrayList<TransitionListener>(); } mListeners.add(listener); + return this; } /** @@ -1032,29 +1156,22 @@ public abstract class Transition implements Cloneable { * * @param listener the listener to be removed from the current set of * listeners for this transition. + * @return This transition object. */ - public void removeListener(TransitionListener listener) { + public Transition removeListener(TransitionListener listener) { if (mListeners == null) { - return; + return this; } mListeners.remove(listener); if (mListeners.size() == 0) { mListeners = null; } + return this; } - /** - * Gets the set of {@link TransitionListener} objects that are currently - * listening for events on this <code>Transition</code> object. - * - * @return ArrayList<TransitionListener> The set of listeners. - */ - public ArrayList<TransitionListener> getListeners() { - return mListeners; - } - - void setSceneRoot(ViewGroup sceneRoot) { + Transition setSceneRoot(ViewGroup sceneRoot) { mSceneRoot = sceneRoot; + return this; } @Override @@ -1076,9 +1193,9 @@ public abstract class Transition implements Cloneable { /** * Returns the name of this Transition. This name is used internally to distinguish * between different transitions to determine when interrupting transitions overlap. - * For example, a Move running on the same target view as another Move should determine - * whether the old transition is animating to different end values and should be - * canceled in favor of the new transition. + * For example, a ChangeBounds running on the same target view as another ChangeBounds + * should determine whether the old transition is animating to different end values + * and should be canceled in favor of the new transition. * * <p>By default, a Transition's name is simply the value of {@link Class#getName()}, * but subclasses are free to override and return something different.</p> @@ -1101,22 +1218,22 @@ public abstract class Transition implements Cloneable { if (mInterpolator != null) { result += "interp(" + mInterpolator + ") "; } - if (mTargetIds != null || mTargets != null) { + if (mTargetIds.size() > 0 || mTargets.size() > 0) { result += "tgts("; - if (mTargetIds != null) { - for (int i = 0; i < mTargetIds.length; ++i) { + if (mTargetIds.size() > 0) { + for (int i = 0; i < mTargetIds.size(); ++i) { if (i > 0) { result += ", "; } - result += mTargetIds[i]; + result += mTargetIds.get(i); } } - if (mTargets != null) { - for (int i = 0; i < mTargets.length; ++i) { + if (mTargets.size() > 0) { + for (int i = 0; i < mTargets.size(); ++i) { if (i > 0) { result += ", "; } - result += mTargets[i]; + result += mTargets.get(i); } } result += ")"; @@ -1149,11 +1266,11 @@ public abstract class Transition implements Cloneable { /** * Notification about the cancellation of the transition. - * Note that cancel() may be called by a parent {@link TransitionGroup} on + * Note that cancel may be called by a parent {@link TransitionSet} on * a child transition which has not yet started. This allows the child * transition to restore state on target objects which was set at - * {@link #play(android.view.ViewGroup, TransitionValues, TransitionValues) - * play()} time. + * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues) + * createAnimator()} time. * * @param transition The transition which was canceled. */ @@ -1161,11 +1278,11 @@ public abstract class Transition implements Cloneable { /** * Notification when a transition is paused. - * Note that play() may be called by a parent {@link TransitionGroup} on + * Note that createAnimator() may be called by a parent {@link TransitionSet} on * a child transition which has not yet started. This allows the child * transition to restore state on target objects which was set at - * {@link #play(android.view.ViewGroup, TransitionValues, TransitionValues) - * play()} time. + * {@link #createAnimator(android.view.ViewGroup, TransitionValues, TransitionValues) + * createAnimator()} time. * * @param transition The transition which was paused. */ @@ -1173,7 +1290,7 @@ public abstract class Transition implements Cloneable { /** * Notification when a transition is resumed. - * Note that resume() may be called by a parent {@link TransitionGroup} on + * Note that resume() may be called by a parent {@link TransitionSet} on * a child transition which has not yet started. This allows the child * transition to restore state which may have changed in an earlier call * to {@link #onTransitionPause(Transition)}. diff --git a/core/java/android/view/transition/TransitionInflater.java b/core/java/android/transition/TransitionInflater.java index be658af0c86f..ebedeeb4fa73 100644 --- a/core/java/android/view/transition/TransitionInflater.java +++ b/core/java/android/transition/TransitionInflater.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.content.Context; import android.content.res.Resources; @@ -35,6 +35,11 @@ import java.util.ArrayList; /** * This class inflates scenes and transitions from resource files. + * + * Information on XML resource descriptions for transitions can be found for + * {@link android.R.styleable#Transition}, {@link android.R.styleable#TransitionSet}, + * {@link android.R.styleable#TransitionTarget}, {@link android.R.styleable#Fade}, + * and {@link android.R.styleable#TransitionManager}. */ public class TransitionInflater { @@ -121,46 +126,12 @@ public class TransitionInflater { } } - /** - * Loads a {@link Scene} object from a resource - * - * @param resource The resource id of the scene to load - * @return The loaded Scene object - * @throws android.content.res.Resources.NotFoundException when the scene - * cannot be loaded - */ - public Scene inflateScene(int resource, ViewGroup parent) { - Scene scene = mScenes.get(resource); - if (scene != null) { - return scene; - } - XmlResourceParser parser = mContext.getResources().getXml(resource); - try { - scene = createSceneFromXml(parser, Xml.asAttributeSet(parser), parent); - mScenes.put(resource, scene); - return scene; - } catch (XmlPullParserException e) { - InflateException ex = new InflateException(e.getMessage()); - ex.initCause(e); - throw ex; - } catch (IOException e) { - InflateException ex = new InflateException( - parser.getPositionDescription() - + ": " + e.getMessage()); - ex.initCause(e); - throw ex; - } finally { - parser.close(); - } - } - - // // Transition loading // private Transition createTransitionFromXml(XmlPullParser parser, - AttributeSet attrs, TransitionGroup transitionGroup) + AttributeSet attrs, TransitionSet transitionSet) throws XmlPullParserException, IOException { Transition transition = null; @@ -180,10 +151,14 @@ public class TransitionInflater { String name = parser.getName(); if ("fade".equals(name)) { - transition = new Fade(); + TypedArray a = mContext.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.Fade); + int fadingMode = a.getInt(com.android.internal.R.styleable.Fade_fadingMode, + Fade.IN | Fade.OUT); + transition = new Fade(fadingMode); newTransition = true; - } else if ("move".equals(name)) { - transition = new Move(); + } else if ("changeBounds".equals(name)) { + transition = new ChangeBounds(); newTransition = true; } else if ("slide".equals(name)) { transition = new Slide(); @@ -194,24 +169,31 @@ public class TransitionInflater { } else if ("recolor".equals(name)) { transition = new Recolor(); newTransition = true; - } else if ("transitionGroup".equals(name)) { - transition = new TransitionGroup(); - createTransitionFromXml(parser, attrs, ((TransitionGroup) transition)); + } else if ("set".equals(name)) { + transition = new TransitionSet(); + TypedArray a = mContext.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.TransitionSet); + int ordering = a.getInt( + com.android.internal.R.styleable.TransitionSet_transitionOrdering, + TransitionSet.ORDERING_TOGETHER); + ((TransitionSet) transition).setOrdering(ordering); + createTransitionFromXml(parser, attrs, ((TransitionSet) transition)); + a.recycle(); newTransition = true; } else if ("targets".equals(name)) { if (parser.getDepth() - 1 > depth && transition != null) { // We're inside the child tag - add targets to the child - getTargetIDs(parser, attrs, transition); - } else if (parser.getDepth() - 1 == depth && transitionGroup != null) { - // add targets to the group - getTargetIDs(parser, attrs, transitionGroup); + getTargetIds(parser, attrs, transition); + } else if (parser.getDepth() - 1 == depth && transitionSet != null) { + // add targets to the set + getTargetIds(parser, attrs, transitionSet); } } if (transition != null || "targets".equals(name)) { if (newTransition) { loadTransition(transition, attrs); - if (transitionGroup != null) { - transitionGroup.addTransitions(transition); + if (transitionSet != null) { + transitionSet.addTransition(transition); } } } else { @@ -222,7 +204,7 @@ public class TransitionInflater { return transition; } - private void getTargetIDs(XmlPullParser parser, + private void getTargetIds(XmlPullParser parser, AttributeSet attrs, Transition transition) throws XmlPullParserException, IOException { // Make sure we are on a start tag. @@ -240,8 +222,9 @@ public class TransitionInflater { String name = parser.getName(); if (name.equals("target")) { TypedArray a = mContext.obtainStyledAttributes(attrs, - com.android.internal.R.styleable.Transition); - int id = a.getResourceId(com.android.internal.R.styleable.Transition_targetID, -1); + com.android.internal.R.styleable.TransitionTarget); + int id = a.getResourceId( + com.android.internal.R.styleable.TransitionTarget_targetId, -1); if (id >= 0) { targetIds.add(id); } @@ -251,11 +234,9 @@ public class TransitionInflater { } int numTargets = targetIds.size(); if (numTargets > 0) { - int[] targetsArray = new int[numTargets]; - for (int i = 0; i < targetIds.size(); ++i) { - targetsArray[i] = targetIds.get(i); + for (int i = 0; i < numTargets; ++i) { + transition.addTargetId(targetIds.get(i)); } - transition.setTargetIds(targetsArray); } } @@ -268,9 +249,9 @@ public class TransitionInflater { if (duration >= 0) { transition.setDuration(duration); } - long startOffset = a.getInt(com.android.internal.R.styleable.Transition_startOffset, -1); - if (startOffset > 0) { - transition.setStartDelay(startOffset); + long startDelay = a.getInt(com.android.internal.R.styleable.Transition_startDelay, -1); + if (startDelay > 0) { + transition.setStartDelay(startDelay); } final int resID = a.getResourceId(com.android.internal.R.styleable.Animator_interpolator, 0); @@ -313,20 +294,19 @@ public class TransitionInflater { } private void loadTransition(AttributeSet attrs, ViewGroup sceneRoot, - TransitionManager transitionManager) - throws Resources.NotFoundException { + TransitionManager transitionManager) throws Resources.NotFoundException { TypedArray a = mContext.obtainStyledAttributes(attrs, com.android.internal.R.styleable.TransitionManager); - int transitionId = attrs.getAttributeResourceValue( + int transitionId = a.getResourceId( com.android.internal.R.styleable.TransitionManager_transition, -1); Scene fromScene = null, toScene = null; - int fromId = attrs.getAttributeResourceValue( + int fromId = a.getResourceId( com.android.internal.R.styleable.TransitionManager_fromScene, -1); - if (fromId >= 0) fromScene = inflateScene(fromId, sceneRoot); - int toId = attrs.getAttributeResourceValue( + if (fromId >= 0) fromScene = Scene.getSceneForLayout(sceneRoot, fromId, mContext); + int toId = a.getResourceId( com.android.internal.R.styleable.TransitionManager_toScene, -1); - if (toId >= 0) toScene = inflateScene(toId, sceneRoot); + if (toId >= 0) toScene = Scene.getSceneForLayout(sceneRoot, toId, mContext); if (transitionId >= 0) { Transition transition = inflateTransition(transitionId); if (transition != null) { @@ -344,50 +324,4 @@ public class TransitionInflater { } a.recycle(); } - - // - // Scene loading - // - - private Scene createSceneFromXml(XmlPullParser parser, AttributeSet attrs, ViewGroup parent) - throws XmlPullParserException, IOException { - Scene scene = null; - - // Make sure we are on a start tag. - int type; - int depth = parser.getDepth(); - - while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth) - && type != XmlPullParser.END_DOCUMENT) { - - if (type != XmlPullParser.START_TAG) { - continue; - } - - String name = parser.getName(); - if (name.equals("scene")) { - scene = loadScene(attrs, parent); - } else { - throw new RuntimeException("Unknown scene name: " + parser.getName()); - } - } - - return scene; - } - - private Scene loadScene(AttributeSet attrs, ViewGroup parent) - throws Resources.NotFoundException { - - Scene scene; - TypedArray a = mContext.obtainStyledAttributes(attrs, - com.android.internal.R.styleable.Scene); - int layoutId = a.getResourceId(com.android.internal.R.styleable.Scene_layout, -1); - if (layoutId >= 0) { - scene = new Scene(parent, layoutId, mContext); - } else { - scene = new Scene(parent); - } - a.recycle(); - return scene; - } } diff --git a/core/java/android/view/transition/TransitionManager.java b/core/java/android/transition/TransitionManager.java index bde891dc5489..99044130926c 100644 --- a/core/java/android/view/transition/TransitionManager.java +++ b/core/java/android/transition/TransitionManager.java @@ -14,11 +14,11 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; +import android.content.Context; import android.util.ArrayMap; import android.util.Log; -import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; @@ -34,14 +34,36 @@ import java.util.ArrayList; * situations. Specifying other transitions for particular scene changes is * only necessary if the application wants different transition behavior * in these situations. + * + * <p>TransitionManagers can be declared in XML resource files inside the + * <code>res/transition</code> directory. TransitionManager resources consist of + * the <code>transitionManager</code>tag name, containing one or more + * <code>transition</code> tags, each of which describe the relationship of + * that transition to the from/to scene information in that tag. + * For example, here is a resource file that declares several scene + * transitions:</p> + * + * {@sample development/samples/ApiDemos/res/transition/transitions_mgr.xml TransitionManager} + * + * <p>For each of the <code>fromScene</code> and <code>toScene</code> attributes, + * there is a reference to a standard XML layout file. This is equivalent to + * creating a scene from a layout in code by calling + * {@link Scene#getSceneForLayout(ViewGroup, int, Context)}. For the + * <code>transition</code> attribute, there is a reference to a resource + * file in the <code>res/transition</code> directory which describes that + * transition.</p> + * + * Information on XML resource descriptions for transitions can be found for + * {@link android.R.styleable#Transition}, {@link android.R.styleable#TransitionSet}, + * {@link android.R.styleable#TransitionTarget}, {@link android.R.styleable#Fade}, + * and {@link android.R.styleable#TransitionManager}. */ public class TransitionManager { // TODO: how to handle enter/exit? private static String LOG_TAG = "TransitionManager"; - private static final Transition sDefaultTransition = new AutoTransition(); - private Transition mDefaultTransition = new AutoTransition(); + private static Transition sDefaultTransition = new AutoTransition(); ArrayMap<Scene, Transition> mSceneTransitions = new ArrayMap<Scene, Transition>(); ArrayMap<Scene, ArrayMap<Scene, Transition>> mScenePairTransitions = @@ -59,7 +81,7 @@ public class TransitionManager { * @param transition The default transition to be used for scene changes. */ public void setDefaultTransition(Transition transition) { - mDefaultTransition = transition; + sDefaultTransition = transition; } /** @@ -69,8 +91,8 @@ public class TransitionManager { * @return The current default transition. * @see #setDefaultTransition(Transition) */ - public Transition getDefaultTransition() { - return mDefaultTransition; + public static Transition getDefaultTransition() { + return sDefaultTransition; } /** @@ -80,7 +102,7 @@ public class TransitionManager { * transition to run. * @param transition The transition that will play when the given scene is * entered. A value of null will result in the default behavior of - * using {@link AutoTransition}. + * using the {@link #getDefaultTransition() default transition} instead. */ public void setTransition(Scene scene, Transition transition) { mSceneTransitions.put(scene, transition); @@ -96,7 +118,7 @@ public class TransitionManager { * be run * @param transition The transition that will play when the given scene is * entered. A value of null will result in the default behavior of - * using {@link AutoTransition}. + * using the {@link #getDefaultTransition() default transition} instead. */ public void setTransition(Scene fromScene, Scene toScene, Transition transition) { ArrayMap<Scene, Transition> sceneTransitionMap = mScenePairTransitions.get(toScene); @@ -114,15 +136,15 @@ public class TransitionManager { * * @param scene The scene being entered * @return The Transition to be used for the given scene change. If no - * Transition was specified for this scene change, {@link AutoTransition} - * will be used instead. + * Transition was specified for this scene change, the {@link #getDefaultTransition() + * default transition} will be used instead. */ private Transition getTransition(Scene scene) { Transition transition = null; ViewGroup sceneRoot = scene.getSceneRoot(); if (sceneRoot != null) { // TODO: cached in Scene instead? long-term, cache in View itself - Scene currScene = sceneRoot.getCurrentScene(); + Scene currScene = Scene.getCurrentScene(sceneRoot); if (currScene != null) { ArrayMap<Scene, Transition> sceneTransitionMap = mScenePairTransitions.get(scene); if (sceneTransitionMap != null) { @@ -134,7 +156,7 @@ public class TransitionManager { } } transition = mSceneTransitions.get(scene); - return (transition != null) ? transition : new AutoTransition(); + return (transition != null) ? transition : sDefaultTransition; } /** @@ -234,7 +256,7 @@ public class TransitionManager { } // Notify previous scene that it is being exited - Scene previousScene = sceneRoot.getCurrentScene(); + Scene previousScene = Scene.getCurrentScene(sceneRoot); if (previousScene != null) { previousScene.exit(); } @@ -256,7 +278,7 @@ public class TransitionManager { } /** - * Static utility method to simply change to the given scene using + * Convenience method to simply change to the given scene using * the default transition for TransitionManager. * * @param scene The Scene to change to @@ -266,15 +288,14 @@ public class TransitionManager { } /** - * Static utility method to simply change to the given scene using + * Convenience method to simply change to the given scene using * the given transition. * * <p>Passing in <code>null</code> for the transition parameter will * result in the scene changing without any transition running, and is * equivalent to calling {@link Scene#exit()} on the scene root's - * {@link ViewGroup#getCurrentScene() current scene}, followed by - * {@link Scene#enter()} on the scene specified by the <code>scene</code> - * parameter.</p> + * current scene, followed by {@link Scene#enter()} on the scene + * specified by the <code>scene</code> parameter.</p> * * @param scene The Scene to change to * @param transition The transition to use for this scene change. A @@ -285,55 +306,20 @@ public class TransitionManager { } /** - * Static utility method to simply change to a scene defined by the - * code in the given runnable, which will be executed after - * the current values have been captured for the transition. - * This is equivalent to creating a Scene and calling {@link - * Scene#setEnterAction(Runnable)} with the runnable, then calling - * {@link #go(Scene, Transition)}. The transition used will be the - * default provided by TransitionManager. - * - * @param sceneRoot The root of the View hierarchy used when this scene - * runs a transition automatically. - * @param action The runnable whose {@link Runnable#run() run()} method will - * be called. - */ - public static void go(ViewGroup sceneRoot, Runnable action) { - Scene scene = new Scene(sceneRoot); - scene.setEnterAction(action); - changeScene(scene, sDefaultTransition); - } - - /** - * Static utility method to simply change to a scene defined by the - * code in the given runnable, which will be executed after - * the current values have been captured for the transition. - * This is equivalent to creating a Scene and calling {@link - * Scene#setEnterAction(Runnable)} with the runnable, then calling - * {@link #go(Scene, Transition)}. The given transition will be - * used to animate the changes. - * - * <p>Passing in <code>null</code> for the transition parameter will - * result in the scene changing without any transition running, and is - * equivalent to calling {@link Scene#exit()} on the scene root's - * {@link ViewGroup#getCurrentScene() current scene}, followed by - * {@link Scene#enter()} on a new scene specified by the - * <code>action</code> parameter.</p> + * Convenience method to animate, using the default transition, + * to a new scene defined by all changes within the given scene root between + * calling this method and the next rendering frame. + * Equivalent to calling {@link #beginDelayedTransition(ViewGroup, Transition)} + * with a value of <code>null</code> for the <code>transition</code> parameter. * * @param sceneRoot The root of the View hierarchy to run the transition on. - * @param action The runnable whose {@link Runnable#run() run()} method will - * be called. - * @param transition The transition to use for this change. A - * value of null causes the change to happen with no transition. */ - public static void go(ViewGroup sceneRoot, Runnable action, Transition transition) { - Scene scene = new Scene(sceneRoot); - scene.setEnterAction(action); - changeScene(scene, transition); + public static void beginDelayedTransition(final ViewGroup sceneRoot) { + beginDelayedTransition(sceneRoot, null); } /** - * Static utility method to animate to a new scene defined by all changes within + * Convenience method to animate to a new scene defined by all changes within * the given scene root between calling this method and the next rendering frame. * Calling this method causes TransitionManager to capture current values in the * scene root and then post a request to run a transition on the next frame. @@ -367,7 +353,7 @@ public class TransitionManager { } final Transition finalTransition = transition.clone(); sceneChangeSetup(sceneRoot, transition); - sceneRoot.setCurrentScene(null); + Scene.setCurrentScene(sceneRoot, null); sceneChangeRunTransition(sceneRoot, finalTransition); } } diff --git a/core/java/android/view/transition/TransitionGroup.java b/core/java/android/transition/TransitionSet.java index b3bacde4987a..1972c2a56ae3 100644 --- a/core/java/android/view/transition/TransitionGroup.java +++ b/core/java/android/transition/TransitionSet.java @@ -14,22 +14,24 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; +import android.animation.TimeInterpolator; import android.util.AndroidRuntimeException; +import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; /** - * A TransitionGroup is a parent of child transitions (including other - * TransitionGroups). Using TransitionGroups enables more complex - * choreography of transitions, where some groups play {@link #TOGETHER} and - * others play {@link #SEQUENTIALLY}. For example, {@link AutoTransition} - * uses a TransitionGroup to sequentially play a Fade(Fade.OUT), followed by - * a {@link Move}, followed by a Fade(Fade.OUT) transition. + * A TransitionSet is a parent of child transitions (including other + * TransitionSets). Using TransitionSets enables more complex + * choreography of transitions, where some sets play {@link #ORDERING_TOGETHER} and + * 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. */ -public class TransitionGroup extends Transition { +public class TransitionSet extends Transition { ArrayList<Transition> mTransitions = new ArrayList<Transition>(); private boolean mPlayTogether = true; @@ -37,88 +39,96 @@ public class TransitionGroup extends Transition { boolean mStarted = false; /** - * A flag used to indicate that the child transitions of this group + * A flag used to indicate that the child transitions of this set * should all start at the same time. */ - public static final int TOGETHER = 0; + public static final int ORDERING_TOGETHER = 0; /** - * A flag used to indicate that the child transitions of this group should + * A flag used to indicate that the child transitions of this set should * play in sequence; when one child transition ends, the next child * transition begins. Note that a transition does not end until all * instances of it (which are playing on all applicable targets of the * transition) end. */ - public static final int SEQUENTIALLY = 1; + public static final int ORDERING_SEQUENTIAL = 1; /** - * Constructs an empty transition group. Add child transitions to the - * group by calling to {@link #addTransitions(Transition...)} )}. By default, - * child transitions will play {@link #TOGETHER}. + * Constructs an empty transition set. Add child transitions to the + * set by calling {@link #addTransition(Transition)} )}. By default, + * child transitions will play {@link #ORDERING_TOGETHER together}. */ - public TransitionGroup() { + public TransitionSet() { } /** - * Constructs an empty transition group with the specified ordering. + * Sets the play order of this set's child transitions. * - * @param ordering {@link #TOGETHER} to start this group's child - * transitions together, {@link #SEQUENTIALLY} to play the child - * transitions in sequence. - * @see #setOrdering(int) - */ - public TransitionGroup(int ordering) { - setOrdering(ordering); - } - - /** - * Sets the play order of this group's child transitions. - * - * @param ordering {@link #TOGETHER} to start this group's child - * transitions together, {@link #SEQUENTIALLY} to play the child + * @param ordering {@link #ORDERING_TOGETHER} to play this set's child + * transitions together, {@link #ORDERING_SEQUENTIAL} to play the child * transitions in sequence. + * @return This transitionSet object. */ - public void setOrdering(int ordering) { + public TransitionSet setOrdering(int ordering) { switch (ordering) { - case SEQUENTIALLY: + case ORDERING_SEQUENTIAL: mPlayTogether = false; break; - case TOGETHER: + case ORDERING_TOGETHER: mPlayTogether = true; break; default: - throw new AndroidRuntimeException("Invalid parameter for TransitionGroup " + + throw new AndroidRuntimeException("Invalid parameter for TransitionSet " + "ordering: " + ordering); } + return this; } /** - * Adds child transitions to this group. The order of the child transitions - * passed in determines the order in which they are started. + * Returns the ordering of this TransitionSet. By default, the value is + * {@link #ORDERING_TOGETHER}. + * + * @return {@link #ORDERING_TOGETHER} if child transitions will play at the same + * time, {@link #ORDERING_SEQUENTIAL} if they will play in sequence. * - * @param transitions A list of child transition to be added to this group. + * @see #setOrdering(int) */ - public void addTransitions(Transition... transitions) { - if (transitions != null) { - int numTransitions = transitions.length; - for (int i = 0; i < numTransitions; ++i) { - mTransitions.add(transitions[i]); - transitions[i].mParent = this; - if (mDuration >= 0) { - transitions[i].setDuration(mDuration); - } + public int getOrdering() { + return mPlayTogether ? ORDERING_TOGETHER : ORDERING_SEQUENTIAL; + } + + /** + * Adds child transition to this set. The order in which this child transition + * is added relative to other child transitions that are added, in addition to + * the {@link #getOrdering() ordering} property, determines the + * order in which the transitions are started. + * + * <p>If this transitionSet has a {@link #getDuration() duration} set on it, the + * child transition will inherit that duration. Transitions are assumed to have + * a maximum of one transitionSet parent.</p> + * + * @param transition A non-null child transition to be added to this set. + * @return This transitionSet object. + */ + public TransitionSet addTransition(Transition transition) { + if (transition != null) { + mTransitions.add(transition); + transition.mParent = this; + if (mDuration >= 0) { + transition.setDuration(mDuration); } } + return this; } /** - * Setting a non-negative duration on a TransitionGroup causes all of the child + * Setting a non-negative duration on a TransitionSet causes all of the child * transitions (current and future) to inherit this duration. * * @param duration The length of the animation, in milliseconds. - * @return This transitionGroup object. + * @return This transitionSet object. */ @Override - public Transition setDuration(long duration) { + public TransitionSet setDuration(long duration) { super.setDuration(duration); if (mDuration >= 0) { int numTransitions = mTransitions.size(); @@ -129,23 +139,65 @@ public class TransitionGroup extends Transition { return this; } + @Override + public TransitionSet setStartDelay(long startDelay) { + return (TransitionSet) super.setStartDelay(startDelay); + } + + @Override + public TransitionSet setInterpolator(TimeInterpolator interpolator) { + return (TransitionSet) super.setInterpolator(interpolator); + } + + @Override + public TransitionSet addTarget(View target) { + return (TransitionSet) super.addTarget(target); + } + + @Override + public TransitionSet addTargetId(int targetId) { + return (TransitionSet) super.addTargetId(targetId); + } + + @Override + public TransitionSet addListener(TransitionListener listener) { + return (TransitionSet) super.addListener(listener); + } + + @Override + public TransitionSet removeTargetId(int targetId) { + return (TransitionSet) super.removeTargetId(targetId); + } + + @Override + public TransitionSet removeTarget(View target) { + return (TransitionSet) super.removeTarget(target); + } + + @Override + public TransitionSet removeListener(TransitionListener listener) { + return (TransitionSet) super.removeListener(listener); + } + /** - * Removes the specified child transition from this group. + * Removes the specified child transition from this set. * * @param transition The transition to be removed. + * @return This transitionSet object. */ - public void removeTransition(Transition transition) { + public TransitionSet removeTransition(Transition transition) { mTransitions.remove(transition); transition.mParent = null; + return this; } /** * Sets up listeners for each of the child transitions. This is used to - * determine when this transition group is finished (all child transitions + * determine when this transition set is finished (all child transitions * must finish first). */ private void setupStartEndListeners() { - TransitionGroupListener listener = new TransitionGroupListener(this); + TransitionSetListener listener = new TransitionSetListener(this); for (Transition childTransition : mTransitions) { childTransition.addListener(listener); } @@ -154,28 +206,28 @@ public class TransitionGroup extends Transition { /** * This listener is used to detect when all child transitions are done, at - * which point this transition group is also done. + * which point this transition set is also done. */ - static class TransitionGroupListener extends TransitionListenerAdapter { - TransitionGroup mTransitionGroup; - TransitionGroupListener(TransitionGroup transitionGroup) { - mTransitionGroup = transitionGroup; + static class TransitionSetListener extends TransitionListenerAdapter { + TransitionSet mTransitionSet; + TransitionSetListener(TransitionSet transitionSet) { + mTransitionSet = transitionSet; } @Override public void onTransitionStart(Transition transition) { - if (!mTransitionGroup.mStarted) { - mTransitionGroup.start(); - mTransitionGroup.mStarted = true; + if (!mTransitionSet.mStarted) { + mTransitionSet.start(); + mTransitionSet.mStarted = true; } } @Override public void onTransitionEnd(Transition transition) { - --mTransitionGroup.mCurrentListeners; - if (mTransitionGroup.mCurrentListeners == 0) { + --mTransitionSet.mCurrentListeners; + if (mTransitionSet.mCurrentListeners == 0) { // All child trans - mTransitionGroup.mStarted = false; - mTransitionGroup.end(); + mTransitionSet.mStarted = false; + mTransitionSet.end(); } transition.removeListener(this); } @@ -185,10 +237,10 @@ public class TransitionGroup extends Transition { * @hide */ @Override - protected void play(ViewGroup sceneRoot, TransitionValuesMaps startValues, + protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues, TransitionValuesMaps endValues) { for (Transition childTransition : mTransitions) { - childTransition.play(sceneRoot, startValues, endValues); + childTransition.createAnimators(sceneRoot, startValues, endValues); } } @@ -196,7 +248,7 @@ public class TransitionGroup extends Transition { * @hide */ @Override - protected void runAnimations() { + protected void runAnimators() { setupStartEndListeners(); if (!mPlayTogether) { // Setup sequence with listeners @@ -207,28 +259,38 @@ public class TransitionGroup extends Transition { previousTransition.addListener(new TransitionListenerAdapter() { @Override public void onTransitionEnd(Transition transition) { - nextTransition.runAnimations(); + nextTransition.runAnimators(); transition.removeListener(this); } }); } Transition firstTransition = mTransitions.get(0); if (firstTransition != null) { - firstTransition.runAnimations(); + firstTransition.runAnimators(); } } else { for (Transition childTransition : mTransitions) { - childTransition.runAnimations(); + childTransition.runAnimators(); } } } @Override - protected void captureValues(TransitionValues transitionValues, boolean start) { + public void captureStartValues(TransitionValues transitionValues) { int targetId = transitionValues.view.getId(); for (Transition childTransition : mTransitions) { if (childTransition.isValidTarget(transitionValues.view, targetId)) { - childTransition.captureValues(transitionValues, start); + childTransition.captureStartValues(transitionValues); + } + } + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + int targetId = transitionValues.view.getId(); + for (Transition childTransition : mTransitions) { + if (childTransition.isValidTarget(transitionValues.view, targetId)) { + childTransition.captureEndValues(transitionValues); } } } @@ -253,6 +315,7 @@ public class TransitionGroup extends Transition { } } + /** @hide */ @Override protected void cancel() { super.cancel(); @@ -263,12 +326,13 @@ public class TransitionGroup extends Transition { } @Override - void setSceneRoot(ViewGroup sceneRoot) { + TransitionSet setSceneRoot(ViewGroup sceneRoot) { super.setSceneRoot(sceneRoot); int numTransitions = mTransitions.size(); for (int i = 0; i < numTransitions; ++i) { mTransitions.get(i).setSceneRoot(sceneRoot); } + return (TransitionSet) this; } @Override @@ -281,8 +345,8 @@ public class TransitionGroup extends Transition { } @Override - public TransitionGroup clone() { - TransitionGroup clone = (TransitionGroup) super.clone(); + public TransitionSet clone() { + TransitionSet clone = (TransitionSet) super.clone(); clone.mTransitions = new ArrayList<Transition>(); int numTransitions = mTransitions.size(); for (int i = 0; i < numTransitions; ++i) { diff --git a/core/java/android/view/transition/TransitionValues.java b/core/java/android/transition/TransitionValues.java index 6e5d3d332d43..8989f89295f6 100644 --- a/core/java/android/view/transition/TransitionValues.java +++ b/core/java/android/transition/TransitionValues.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.util.ArrayMap; import android.view.View; @@ -33,11 +33,11 @@ import java.util.Map; * "Fader" as "android:fader:alpha". * * <p>These values are cached during the - * {@link Transition#captureValues(TransitionValues, boolean)} + * {@link Transition#captureStartValues(TransitionValues)} * capture} phases of a scene change, once when the start values are captured * and again when the end values are captured. These start/end values are then * passed into the transitions via the - * for {@link Transition#play(ViewGroup, TransitionValues, TransitionValues)} + * for {@link Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)} * method.</p> */ public class TransitionValues { diff --git a/core/java/android/view/transition/TransitionValuesMaps.java b/core/java/android/transition/TransitionValuesMaps.java index 4cfce4d2da86..131596b97a5a 100644 --- a/core/java/android/view/transition/TransitionValuesMaps.java +++ b/core/java/android/transition/TransitionValuesMaps.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.util.ArrayMap; import android.util.LongSparseArray; diff --git a/core/java/android/view/transition/Visibility.java b/core/java/android/transition/Visibility.java index 348dcfb16301..75d3e7c0b4e0 100644 --- a/core/java/android/view/transition/Visibility.java +++ b/core/java/android/transition/Visibility.java @@ -14,13 +14,11 @@ * limitations under the License. */ -package android.view.transition; +package android.transition; import android.animation.Animator; import android.view.View; import android.view.ViewGroup; -import android.view.ViewOverlay; -import android.view.ViewParent; /** * This transition tracks changes to the visibility of target views in the @@ -30,13 +28,13 @@ import android.view.ViewParent; * utility for subclasses such as {@link Fade}, which use this visibility * information to determine the specific animations to run when visibility * changes occur. Subclasses should implement one or both of the methods - * {@link #appear(ViewGroup, TransitionValues, int, TransitionValues, int), and - * {@link #disappear(ViewGroup, TransitionValues, int, TransitionValues, int)}. + * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)}, + * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)}, * * <p>Note that a view's visibility change is determined by both whether the view * itself is changing and whether its parent hierarchy's visibility is changing. * That is, a view that appears in the end scene will only trigger a call to - * {@link #appear(android.view.ViewGroup, TransitionValues, int, TransitionValues, int) + * {@link #onAppear(android.view.ViewGroup, TransitionValues, int, TransitionValues, int) * appear()} if its parent hierarchy was stable between the start and end scenes. * This is done to avoid causing a visibility transition on every node in a hierarchy * when only the top-most node is the one that should be transitioned in/out. @@ -75,11 +73,20 @@ public abstract class Visibility extends Transition { return sTransitionProperties; } + private void captureValues(TransitionValues transitionValues) { + int visibility = transitionValues.view.getVisibility(); + transitionValues.values.put(PROPNAME_VISIBILITY, visibility); + transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent()); + } + + @Override + public void captureStartValues(TransitionValues transitionValues) { + captureValues(transitionValues); + } + @Override - protected void captureValues(TransitionValues values, boolean start) { - int visibility = values.view.getVisibility(); - values.values.put(PROPNAME_VISIBILITY, visibility); - values.values.put(PROPNAME_PARENT, values.view.getParent()); + public void captureEndValues(TransitionValues transitionValues) { + captureValues(transitionValues); } /** @@ -87,7 +94,7 @@ public abstract class Visibility extends Transition { * object. This is determined by testing the same properties in the values * object that are used to determine whether the object is appearing or * disappearing in the {@link - * #play(android.view.ViewGroup, TransitionValues, TransitionValues)} + * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)} * method. This method can be called by, for example, subclasses that want * to know whether the object is visible in the same way that Visibility * determines it for the actual animation. @@ -207,14 +214,14 @@ public abstract class Visibility extends Transition { } @Override - protected Animator play(ViewGroup sceneRoot, TransitionValues startValues, + public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { VisibilityInfo visInfo = getVisibilityChangeInfo(startValues, endValues); if (visInfo.visibilityChange) { // Only transition views that are either targets of this transition // or whose parent hierarchies remain stable between scenes boolean isTarget = false; - if (mTargets != null || mTargetIds != null) { + if (mTargets.size() > 0 || mTargetIds.size() > 0) { View startView = startValues != null ? startValues.view : null; View endView = endValues != null ? endValues.view : null; int startId = startView != null ? startView.getId() : -1; @@ -225,10 +232,10 @@ public abstract class Visibility extends Transition { !isHierarchyVisibilityChanging(sceneRoot, visInfo.startParent, visInfo.endParent))) { if (visInfo.fadeIn) { - return appear(sceneRoot, startValues, visInfo.startVisibility, + return onAppear(sceneRoot, startValues, visInfo.startVisibility, endValues, visInfo.endVisibility); } else { - return disappear(sceneRoot, startValues, visInfo.startVisibility, + return onDisappear(sceneRoot, startValues, visInfo.startVisibility, endValues, visInfo.endVisibility ); } @@ -239,17 +246,20 @@ public abstract class Visibility extends Transition { /** * The default implementation of this method does nothing. Subclasses - * should override if they need to set up anything prior to the - * transition starting. + * should override if they need to create an Animator when targets appear. + * The method should only be called by the Visibility class; it is + * not intended to be called from external classes. * - * @param sceneRoot - * @param startValues - * @param startVisibility - * @param endValues - * @param endVisibility - * @return + * @param sceneRoot The root of the transition hierarchy + * @param startValues The target values in the start scene + * @param startVisibility The target visibility in the start scene + * @param endValues The target values in the end scene + * @param endVisibility The target visibility in the end scene + * @return An Animator to be started at the appropriate time in the + * overall transition for this scene change. A null value means no animation + * should be run. */ - protected Animator appear(ViewGroup sceneRoot, + public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { return null; @@ -257,17 +267,21 @@ public abstract class Visibility extends Transition { /** * The default implementation of this method does nothing. Subclasses - * should override if they need to set up anything prior to the - * transition starting. + * should override if they need to create an Animator when targets disappear. + * The method should only be called by the Visibility class; it is + * not intended to be called from external classes. + * * - * @param sceneRoot - * @param startValues - * @param startVisibility - * @param endValues - * @param endVisibility - * @return + * @param sceneRoot The root of the transition hierarchy + * @param startValues The target values in the start scene + * @param startVisibility The target visibility in the start scene + * @param endValues The target values in the end scene + * @param endVisibility The target visibility in the end scene + * @return An Animator to be started at the appropriate time in the + * overall transition for this scene change. A null value means no animation + * should be run. */ - protected Animator disappear(ViewGroup sceneRoot, + public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility, TransitionValues endValues, int endVisibility) { return null; diff --git a/core/java/android/view/transition/package.html b/core/java/android/transition/package.html index 37dc0ec3f4bf..f357d3457a46 100644 --- a/core/java/android/view/transition/package.html +++ b/core/java/android/transition/package.html @@ -3,15 +3,15 @@ <p>The classes in this package enable "scenes & transitions" functionality for view hiearchies.</p> -<p>A <b>Scene</b> is an encapsulation of the state of a view hiearchy, +<p>A <b>Scene</b> is an encapsulation of the state of a view hierarchy, including the views in that hierarchy and the various values (layout-related -and otherwise) that those views have. A scene be defined by a layout hierarchy -directly or some code which sets up the scene dynamically as it is entered.</p> +and otherwise) that those views have. A scene can be defined by a layout hierarchy +directly or by code which sets up the scene dynamically as it is entered.</p> <p>A <b>Transition</b> is a mechanism to automatically animate changes that occur when a new scene is entered. Some transition capabilities are automatic. That is, entering a scene may cause animations to run which fade out views that -go away, move and resize existing views that change, and fade in views that +go away, changeBounds and resize existing views that change, and fade in views that become visible. There are additional transitions that can animate other attributes, such as color changes, and which can optionally be specified to take place during particular scene changes. Finally, developers can @@ -19,7 +19,8 @@ define their own Transition subclasses which monitor particular property changes and which run custom animations when those properties change values.</p> <p><b>TransitionManager</b> is used to specify custom transitions for particular -scene changes, and to cause scene changes with transitions to take place.</p> +scene changes, and to cause scene changes with specific transitions to +take place.</p> </body> </html> diff --git a/core/java/android/util/MapCollections.java b/core/java/android/util/MapCollections.java index 09f1f8e97bd6..f4a9b0bbb73e 100644 --- a/core/java/android/util/MapCollections.java +++ b/core/java/android/util/MapCollections.java @@ -328,12 +328,12 @@ abstract class MapCollections<K, V> { @Override public Object[] toArray() { - return toArrayHelper(1); + return toArrayHelper(0); } @Override public <T> T[] toArray(T[] array) { - return toArrayHelper(array, 1); + return toArrayHelper(array, 0); } @Override diff --git a/core/java/android/util/SuperNotCalledException.java b/core/java/android/util/SuperNotCalledException.java new file mode 100644 index 000000000000..18361420b813 --- /dev/null +++ b/core/java/android/util/SuperNotCalledException.java @@ -0,0 +1,27 @@ +/* + * 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.util; + +/** + * @hide + */ +public final class SuperNotCalledException extends AndroidRuntimeException { + public SuperNotCalledException(String msg) { + super(msg); + } +} diff --git a/core/java/android/view/GestureDetector.java b/core/java/android/view/GestureDetector.java index 6bbfe0f160b5..2351548df75a 100644 --- a/core/java/android/view/GestureDetector.java +++ b/core/java/android/view/GestureDetector.java @@ -17,7 +17,6 @@ package android.view; import android.content.Context; -import android.os.Build; import android.os.Handler; import android.os.Message; @@ -202,6 +201,7 @@ public class GestureDetector { private static final int LONGPRESS_TIMEOUT = ViewConfiguration.getLongPressTimeout(); private static final int TAP_TIMEOUT = ViewConfiguration.getTapTimeout(); private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout(); + private static final int DOUBLE_TAP_MIN_TIME = ViewConfiguration.getDoubleTapMinTime(); // constants for Message.what used by GestureHandler below private static final int SHOW_PRESS = 1; @@ -673,7 +673,8 @@ public class GestureDetector { return false; } - if (secondDown.getEventTime() - firstUp.getEventTime() > DOUBLE_TAP_TIMEOUT) { + final long deltaTime = secondDown.getEventTime() - firstUp.getEventTime(); + if (deltaTime > DOUBLE_TAP_TIMEOUT || deltaTime < DOUBLE_TAP_MIN_TIME) { return false; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 7b69a81aae6c..8616aba39f71 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -57,6 +57,7 @@ import android.util.LongSparseLongArray; import android.util.Pools.SynchronizedPool; import android.util.Property; import android.util.SparseArray; +import android.util.SuperNotCalledException; import android.util.TypedValue; import android.view.ContextMenu.ContextMenuInfo; import android.view.AccessibilityIterators.TextSegmentIterator; @@ -74,7 +75,6 @@ import android.view.animation.Transformation; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; -import android.view.transition.Scene; import android.widget.ScrollBarDrawable; import static android.os.Build.VERSION_CODES.*; @@ -1575,8 +1575,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ protected Object mTag; - private Scene mCurrentScene = null; - // for mPrivateFlags: /** {@hide} */ static final int PFLAG_WANTS_FOCUS = 0x00000001; @@ -2207,6 +2205,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static final int PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT = 0x8; + /** + * Flag indicating that an overridden method correctly called down to + * the superclass implementation as required by the API spec. + */ + static final int PFLAG3_CALLED_SUPER = 0x10; + /* End of masks for mPrivateFlags3 */ @@ -5958,6 +5962,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // Invalidate too, since the default behavior for views is to be // be drawn at 50% alpha rather than to change the drawable. invalidate(true); + + if (!enabled) { + cancelPendingInputEvents(); + } } /** @@ -8837,7 +8845,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * Change the view's z order in the tree, so it's on top of other sibling * views. This ordering change may affect layout, if the parent container * uses an order-dependent layout scheme (e.g., LinearLayout). Prior - * to {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} this + * to {@link android.os.Build.VERSION_CODES#KITKAT} this * method should be followed by calls to {@link #requestLayout()} and * {@link View#invalidate()} on the view's parent to force the parent to redraw * with the new child ordering. @@ -12189,7 +12197,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, cleanupDraw(); mCurrentAnimation = null; - mCurrentScene = null; } private void cleanupDraw() { @@ -12368,6 +12375,61 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Cancel any deferred high-level input events that were previously posted to the event queue. + * + * <p>Many views post high-level events such as click handlers to the event queue + * to run deferred in order to preserve a desired user experience - clearing visible + * pressed states before executing, etc. This method will abort any events of this nature + * that are currently in flight.</p> + * + * <p>Custom views that generate their own high-level deferred input events should override + * {@link #onCancelPendingInputEvents()} and remove those pending events from the queue.</p> + * + * <p>This will also cancel pending input events for any child views.</p> + * + * <p>Note that this may not be sufficient as a debouncing strategy for clicks in all cases. + * This will not impact newer events posted after this call that may occur as a result of + * lower-level input events still waiting in the queue. If you are trying to prevent + * double-submitted events for the duration of some sort of asynchronous transaction + * you should also take other steps to protect against unexpected double inputs e.g. calling + * {@link #setEnabled(boolean) setEnabled(false)} and re-enabling the view when + * the transaction completes, tracking already submitted transaction IDs, etc.</p> + */ + public final void cancelPendingInputEvents() { + dispatchCancelPendingInputEvents(); + } + + /** + * Called by {@link #cancelPendingInputEvents()} to cancel input events in flight. + * Overridden by ViewGroup to dispatch. Package scoped to prevent app-side meddling. + */ + void dispatchCancelPendingInputEvents() { + mPrivateFlags3 &= ~PFLAG3_CALLED_SUPER; + onCancelPendingInputEvents(); + if ((mPrivateFlags3 & PFLAG3_CALLED_SUPER) != PFLAG3_CALLED_SUPER) { + throw new SuperNotCalledException("View " + getClass().getSimpleName() + + " did not call through to super.onCancelPendingInputEvents()"); + } + } + + /** + * Called as the result of a call to {@link #cancelPendingInputEvents()} on this view or + * a parent view. + * + * <p>This method is responsible for removing any pending high-level input events that were + * posted to the event queue to run later. Custom view classes that post their own deferred + * high-level events via {@link #post(Runnable)}, {@link #postDelayed(Runnable, long)} or + * {@link android.os.Handler} should override this method, call + * <code>super.onCancelPendingInputEvents()</code> and remove those callbacks as appropriate. + * </p> + */ + public void onCancelPendingInputEvents() { + removePerformClickCallback(); + cancelLongPress(); + mPrivateFlags3 |= PFLAG3_CALLED_SUPER; + } + + /** * Store this view hierarchy's frozen state into the given container. * * @param container The SparseArray in which to save the view's state. @@ -18102,31 +18164,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Set the current Scene that this view is in. The current scene is set only - * on the root view of a scene, not for every view in that hierarchy. This - * information is used by Scene to determine whether there is a previous - * scene which should be exited before the new scene is entered. - * - * @param scene The new scene being set on the view - * - * @hide - */ - public void setCurrentScene(Scene scene) { - mCurrentScene = scene; - } - - /** - * Gets the current {@link Scene} set on this view. A scene is set on a view - * only if that view is the scene root. - * - * @return The current Scene set on this view. A value of null indicates that - * no Scene is current set. - */ - public Scene getCurrentScene() { - return mCurrentScene; - } - - /** * Interface definition for a callback to be invoked when a hardware key event is * dispatched to this view. The callback will be invoked before the key event is * given to the view. This is only useful for hardware keyboards; a software input diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index f8cb9c068aa7..c3f064fdfd4a 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -97,6 +97,13 @@ public class ViewConfiguration { private static final int DOUBLE_TAP_TIMEOUT = 300; /** + * Defines the minimum duration in milliseconds between the first tap's up event and + * the second tap's down event for an interaction to be considered a + * double-tap. + */ + private static final int DOUBLE_TAP_MIN_TIME = 40; + + /** * Defines the maximum duration in milliseconds between a touch pad * touch and release for a given touch to be considered a tap (click) as * opposed to a hover movement gesture. @@ -436,6 +443,17 @@ public class ViewConfiguration { } /** + * @return the minimum duration in milliseconds between the first tap's + * up event and the second tap's down event for an interaction to be considered a + * double-tap. + * + * @hide + */ + public static int getDoubleTapMinTime() { + return DOUBLE_TAP_MIN_TIME; + } + + /** * @return the maximum duration in milliseconds between a touch pad * touch and release for a given touch to be considered a tap (click) as * opposed to a hover movement gesture. diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 2d75b063ca74..faeee3fa5ce7 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -3182,6 +3182,17 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } } + @Override + void dispatchCancelPendingInputEvents() { + super.dispatchCancelPendingInputEvents(); + + final View[] children = mChildren; + final int count = mChildrenCount; + for (int i = 0; i < count; i++) { + children[i].dispatchCancelPendingInputEvents(); + } + } + /** * When this property is set to true, this ViewGroup supports static transformations on * children; this causes diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index 656d7565df16..35113db607e8 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -149,7 +149,7 @@ public interface ViewParent { * Change the z order of the child so it's on top of all other children. * This ordering change may affect layout, if this container * uses an order-dependent layout scheme (e.g., LinearLayout). Prior - * to {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} this + * to {@link android.os.Build.VERSION_CODES#KITKAT} this * method should be followed by calls to {@link #requestLayout()} and * {@link View#invalidate()} on this parent to force the parent to redraw * with the new child ordering. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 0f9a2ac98a38..c7d61eb0f683 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -81,6 +81,7 @@ import java.io.OutputStream; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashSet; +import java.util.Locale; /** * The top of a view hierarchy, implementing the needed protocol between View @@ -228,7 +229,8 @@ public final class ViewRootImpl implements ViewParent, InputStage mFirstInputStage; InputStage mFirstPostImeInputStage; - SyntheticInputStage mSyntheticInputStage; + + boolean mFlipControllerFallbackKeys; boolean mWindowAttributesChanged = false; int mWindowAttributesChangesFlag = 0; @@ -366,6 +368,8 @@ public final class ViewRootImpl implements ViewParent, mNoncompatDensity = context.getResources().getDisplayMetrics().noncompatDensityDpi; mFallbackEventHandler = PolicyManager.makeNewFallbackEventHandler(context); mChoreographer = Choreographer.getInstance(); + mFlipControllerFallbackKeys = + context.getResources().getBoolean(R.bool.flip_controller_fallback_keys); PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mAttachInfo.mScreenOn = powerManager.isScreenOn(); @@ -590,8 +594,8 @@ public final class ViewRootImpl implements ViewParent, // Set up the input pipeline. CharSequence counterSuffix = attrs.getTitle(); - mSyntheticInputStage = new SyntheticInputStage(); - InputStage viewPostImeStage = new ViewPostImeInputStage(mSyntheticInputStage); + InputStage syntheticInputStage = new SyntheticInputStage(); + InputStage viewPostImeStage = new ViewPostImeInputStage(syntheticInputStage); InputStage nativePostImeStage = new NativePostImeInputStage(viewPostImeStage, "aq:native-post-ime:" + counterSuffix); InputStage earlyPostImeStage = new EarlyPostImeInputStage(nativePostImeStage); @@ -2873,8 +2877,11 @@ public final class ViewRootImpl implements ViewParent, mView.dispatchConfigurationChanged(config); } } + + mFlipControllerFallbackKeys = + mContext.getResources().getBoolean(R.bool.flip_controller_fallback_keys); } - + /** * Return true if child is an ancestor of parent, (or equal to the parent). */ @@ -3774,9 +3781,6 @@ public final class ViewRootImpl implements ViewParent, private int processKeyEvent(QueuedInputEvent q) { final KeyEvent event = (KeyEvent)q.mEvent; - // The synthetic stage occasionally needs to know about keys in order to debounce taps - mSyntheticInputStage.notifyKeyEvent(event); - // Deliver the key to the view hierarchy. if (mView.dispatchKeyEvent(event)) { return FINISH_HANDLED; @@ -3904,6 +3908,7 @@ public final class ViewRootImpl implements ViewParent, private final SyntheticJoystickHandler mJoystick = new SyntheticJoystickHandler(); private final SyntheticTouchNavigationHandler mTouchNavigation = new SyntheticTouchNavigationHandler(); + private final SyntheticKeyHandler mKeys = new SyntheticKeyHandler(); public SyntheticInputStage() { super(null); @@ -3926,7 +3931,12 @@ public final class ViewRootImpl implements ViewParent, mTouchNavigation.process(event); return FINISH_HANDLED; } + } else if (q.mEvent instanceof KeyEvent) { + if (mKeys.process((KeyEvent) q.mEvent)) { + return FINISH_HANDLED; + } } + return FORWARD; } @@ -3949,10 +3959,6 @@ public final class ViewRootImpl implements ViewParent, } super.onDeliverToNext(q); } - - public void notifyKeyEvent(KeyEvent e) { - mTouchNavigation.notifyKeyEvent(e); - } } /** @@ -4380,15 +4386,6 @@ public final class ViewRootImpl implements ViewParent, /* TODO: These constants should eventually be moved to ViewConfiguration. */ - // Tap timeout in milliseconds. - private static final int TAP_TIMEOUT = 250; - - // Debounce timeout for touch nav devices with a button under their pad, in milliseconds - private static final int DEBOUNCE_TIME = 250; - - // The maximum distance traveled for a gesture to be considered a tap in millimeters. - private static final int TAP_SLOP_MILLIMETERS = 5; - // The nominal distance traveled to move by one unit. private static final int TICK_DISTANCE_MILLIMETERS = 12; @@ -4416,13 +4413,6 @@ public final class ViewRootImpl implements ViewParent, /* Configuration for the current input device. */ - // The tap timeout and scaled slop. - private int mConfigTapTimeout; - private float mConfigTapSlop; - - // Amount of time to wait between button presses and tap generation for debouncing - private int mConfigDebounceTime; - // The scaled tick distance. A movement of this amount should generally translate // into a single dpad event in a given direction. private float mConfigTickDistance; @@ -4471,8 +4461,6 @@ public final class ViewRootImpl implements ViewParent, // The last time a confirm key was pressed on the touch nav device private long mLastConfirmKeyTime = Long.MAX_VALUE; - private boolean mHasButtonUnderPad; - public SyntheticTouchNavigationHandler() { super(true); } @@ -4509,21 +4497,15 @@ public final class ViewRootImpl implements ViewParent, float nominalRes = (xRes + yRes) * 0.5f; // Precompute all of the configuration thresholds we will need. - mConfigTapTimeout = TAP_TIMEOUT; - mConfigTapSlop = TAP_SLOP_MILLIMETERS * nominalRes; mConfigTickDistance = TICK_DISTANCE_MILLIMETERS * nominalRes; mConfigMinFlingVelocity = MIN_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance; mConfigMaxFlingVelocity = MAX_FLING_VELOCITY_TICKS_PER_SECOND * mConfigTickDistance; - mConfigDebounceTime = DEBOUNCE_TIME; - mHasButtonUnderPad = device.hasButtonUnderPad(); if (LOCAL_DEBUG) { Log.d(LOCAL_TAG, "Configured device " + mCurrentDeviceId + " (" + Integer.toHexString(mCurrentSource) + "): " - + "mConfigTapTimeout=" + mConfigTapTimeout - + ", mConfigTapSlop=" + mConfigTapSlop + ", mConfigTickDistance=" + mConfigTickDistance + ", mConfigMinFlingVelocity=" + mConfigMinFlingVelocity + ", mConfigMaxFlingVelocity=" + mConfigMaxFlingVelocity); @@ -4585,18 +4567,7 @@ public final class ViewRootImpl implements ViewParent, // Detect taps and flings. if (action == MotionEvent.ACTION_UP) { - if (!mConsumedMovement - && Math.hypot(mLastX - mStartX, mLastY - mStartY) < mConfigTapSlop - && time <= mStartTime + mConfigTapTimeout) { - if (!mHasButtonUnderPad || - time >= mLastConfirmKeyTime + mConfigDebounceTime) { - // It's a tap! - finishKeys(time); - sendKeyDownOrRepeat(time, KeyEvent.KEYCODE_DPAD_CENTER, metaState); - sendKeyUp(time); - } - } else if (mConsumedMovement - && mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) { + if (mConsumedMovement && mPendingKeyCode != KeyEvent.KEYCODE_UNKNOWN) { // It might be a fling. mVelocityTracker.computeCurrentVelocity(1000, mConfigMaxFlingVelocity); final float vx = mVelocityTracker.getXVelocity(mActivePointerId); @@ -4627,13 +4598,6 @@ public final class ViewRootImpl implements ViewParent, } } - public void notifyKeyEvent(KeyEvent e) { - final int keyCode = e.getKeyCode(); - if (KeyEvent.isConfirmKey(e.getKeyCode())) { - mLastConfirmKeyTime = e.getDownTime(); - } - } - private void finishKeys(long time) { cancelFling(); sendKeyUp(time); @@ -4802,6 +4766,63 @@ public final class ViewRootImpl implements ViewParent, }; } + final class SyntheticKeyHandler { + + public boolean process(KeyEvent event) { + // In some locales (like Japan) controllers use B for confirm and A for back, rather + // than vice versa, so we need to special case this here since the input system itself + // is not locale-aware. + int keyCode; + switch(event.getKeyCode()) { + case KeyEvent.KEYCODE_BUTTON_A: + case KeyEvent.KEYCODE_BUTTON_C: + case KeyEvent.KEYCODE_BUTTON_X: + case KeyEvent.KEYCODE_BUTTON_Z: + keyCode = mFlipControllerFallbackKeys ? + KeyEvent.KEYCODE_BACK : KeyEvent.KEYCODE_DPAD_CENTER; + break; + case KeyEvent.KEYCODE_BUTTON_B: + case KeyEvent.KEYCODE_BUTTON_Y: + keyCode = mFlipControllerFallbackKeys ? + KeyEvent.KEYCODE_DPAD_CENTER : KeyEvent.KEYCODE_BACK; + break; + case KeyEvent.KEYCODE_BUTTON_THUMBL: + case KeyEvent.KEYCODE_BUTTON_THUMBR: + case KeyEvent.KEYCODE_BUTTON_START: + case KeyEvent.KEYCODE_BUTTON_1: + case KeyEvent.KEYCODE_BUTTON_2: + case KeyEvent.KEYCODE_BUTTON_3: + case KeyEvent.KEYCODE_BUTTON_4: + case KeyEvent.KEYCODE_BUTTON_5: + case KeyEvent.KEYCODE_BUTTON_6: + case KeyEvent.KEYCODE_BUTTON_7: + case KeyEvent.KEYCODE_BUTTON_8: + case KeyEvent.KEYCODE_BUTTON_9: + case KeyEvent.KEYCODE_BUTTON_10: + case KeyEvent.KEYCODE_BUTTON_11: + case KeyEvent.KEYCODE_BUTTON_12: + case KeyEvent.KEYCODE_BUTTON_13: + case KeyEvent.KEYCODE_BUTTON_14: + case KeyEvent.KEYCODE_BUTTON_15: + case KeyEvent.KEYCODE_BUTTON_16: + keyCode = KeyEvent.KEYCODE_DPAD_CENTER; + break; + case KeyEvent.KEYCODE_BUTTON_SELECT: + case KeyEvent.KEYCODE_BUTTON_MODE: + keyCode = KeyEvent.KEYCODE_MENU; + default: + return false; + } + + enqueueInputEvent(new KeyEvent(event.getDownTime(), event.getEventTime(), + event.getAction(), keyCode, event.getRepeatCount(), event.getMetaState(), + event.getScanCode(), event.getFlags() | KeyEvent.FLAG_FALLBACK, + event.getSource())); + return true; + } + + } + /** * Returns true if the key is used for keyboard navigation. * @param keyEvent The key event. diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index 19492c25ffc8..7a38a1641831 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -333,8 +333,11 @@ public abstract class WebSettings { } /** - * Sets whether the WebView loads pages in overview mode. The default is - * false. + * Sets whether the WebView loads pages in overview mode, that is, + * zooms out the content to fit on screen by width. This setting is + * taken into account when the content width is greater than the width + * of the WebView control, for example, when {@link #getUseWideViewPort} + * is enabled. The default is false. */ public void setLoadWithOverviewMode(boolean overview) { throw new MustOverrideException(); diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index f0e8c4ffe9d4..8fc3ce3de992 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1070,7 +1070,7 @@ public class WebView extends AbsoluteLayout /** * Exports the contents of this Webview as PDF. Only supported for API levels - * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} and above. + * {@link android.os.Build.VERSION_CODES#KITKAT} and above. * * TODO(sgurun) the parameter list is stale. Fix it before unhiding. * @@ -1123,10 +1123,18 @@ public class WebView extends AbsoluteLayout } /** - * Sets the initial scale for this WebView. 0 means default. If - * {@link WebSettings#getUseWideViewPort()} is true, it zooms out all the - * way. Otherwise it starts with 100%. If initial scale is greater than 0, - * WebView starts with this value as initial scale. + * Sets the initial scale for this WebView. 0 means default. + * The behavior for the default scale depends on the state of + * {@link WebSettings#getUseWideViewPort()} and + * {@link WebSettings#getLoadWithOverviewMode()}. + * If the content fits into the WebView control by width, then + * the zoom is set to 100%. For wide content, the behavor + * depends on the state of {@link WebSettings#getLoadWithOverviewMode()}. + * If its value is true, the content will be zoomed out to be fit + * by width into the WebView control, otherwise not. + * + * If initial scale is greater than 0, WebView starts with this value + * as initial scale. * Please note that unlike the scale properties in the viewport meta tag, * this method doesn't take the screen density into account. * diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c30802451099..29b7cf2095db 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -2843,6 +2843,23 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te return new AdapterContextMenuInfo(view, position, id); } + @Override + public void onCancelPendingInputEvents() { + super.onCancelPendingInputEvents(); + if (mPerformClick != null) { + removeCallbacks(mPerformClick); + } + if (mPendingCheckForTap != null) { + removeCallbacks(mPendingCheckForTap); + } + if (mPendingCheckForLongPress != null) { + removeCallbacks(mPendingCheckForLongPress); + } + if (mPendingCheckForKeyLongPress != null) { + removeCallbacks(mPendingCheckForKeyLongPress); + } + } + /** * A base class for Runnables that will check that their view is still attached to * the original window as when the Runnable was created. diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 941ddfce4682..389d9d64158e 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -248,7 +248,7 @@ public class ListView extends AbsListView { * <p> * Note: When first introduced, this method could only be called before * setting the adapter with {@link #setAdapter(ListAdapter)}. Starting with - * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, this method may be + * {@link android.os.Build.VERSION_CODES#KITKAT}, this method may be * called at any time. If the ListView's adapter does not extend * {@link HeaderViewListAdapter}, it will be wrapped with a supporting * instance of {@link WrapperListAdapter}. @@ -285,7 +285,7 @@ public class ListView extends AbsListView { * <p> * Note: When first introduced, this method could only be called before * setting the adapter with {@link #setAdapter(ListAdapter)}. Starting with - * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, this method may be + * {@link android.os.Build.VERSION_CODES#KITKAT}, this method may be * called at any time. If the ListView's adapter does not extend * {@link HeaderViewListAdapter}, it will be wrapped with a supporting * instance of {@link WrapperListAdapter}. @@ -341,7 +341,7 @@ public class ListView extends AbsListView { * <p> * Note: When first introduced, this method could only be called before * setting the adapter with {@link #setAdapter(ListAdapter)}. Starting with - * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, this method may be + * {@link android.os.Build.VERSION_CODES#KITKAT}, this method may be * called at any time. If the ListView's adapter does not extend * {@link HeaderViewListAdapter}, it will be wrapped with a supporting * instance of {@link WrapperListAdapter}. @@ -378,7 +378,7 @@ public class ListView extends AbsListView { * <p> * Note: When first introduced, this method could only be called before * setting the adapter with {@link #setAdapter(ListAdapter)}. Starting with - * {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, this method may be + * {@link android.os.Build.VERSION_CODES#KITKAT}, this method may be * called at any time. If the ListView's adapter does not extend * {@link HeaderViewListAdapter}, it will be wrapped with a supporting * instance of {@link WrapperListAdapter}. diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index b9b6b08f957e..92c9b935f0ac 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -477,13 +477,13 @@ public class RelativeLayout extends ViewGroup { if (isWrapContentWidth) { if (isLayoutRtl()) { - if (targetSdkVersion < Build.VERSION_CODES.KEY_LIME_PIE) { + if (targetSdkVersion < Build.VERSION_CODES.KITKAT) { width = Math.max(width, myWidth - params.mLeft); } else { width = Math.max(width, myWidth - params.mLeft - params.leftMargin); } } else { - if (targetSdkVersion < Build.VERSION_CODES.KEY_LIME_PIE) { + if (targetSdkVersion < Build.VERSION_CODES.KITKAT) { width = Math.max(width, params.mRight); } else { width = Math.max(width, params.mRight + params.rightMargin); @@ -492,7 +492,7 @@ public class RelativeLayout extends ViewGroup { } if (isWrapContentHeight) { - if (targetSdkVersion < Build.VERSION_CODES.KEY_LIME_PIE) { + if (targetSdkVersion < Build.VERSION_CODES.KITKAT) { height = Math.max(height, params.mBottom); } else { height = Math.max(height, params.mBottom + params.bottomMargin); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index a2d48a8cd89b..3c9cc987d5cd 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -1519,6 +1519,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * with this TextView. By default there is no associated UndoManager, so null * is returned. One can be associated with the TextView through * {@link #setUndoManager(android.content.UndoManager, String)} + * + * @hide */ public final UndoManager getUndoManager() { return mEditor == null ? null : mEditor.mUndoManager; @@ -1535,6 +1537,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @param tag String tag identifying this particular TextView owner in the * UndoManager. This is used to keep the correct association with the * {@link android.content.UndoOwner} of any operations inside of the UndoManager. + * + * @hide */ public final void setUndoManager(UndoManager undoManager, String tag) { if (undoManager != null) { diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index b798a1a55b34..16c41f3efdf4 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -31,6 +31,7 @@ interface IAppOpsService { IBinder getToken(IBinder clientToken); // Remaining methods are only used in Java. + int checkPackage(int uid, String packageName); List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops); void setMode(int code, int uid, String packageName, int mode); diff --git a/core/java/com/android/internal/app/RestrictionsPinActivity.java b/core/java/com/android/internal/app/RestrictionsPinActivity.java index 211247488ff3..66585c629099 100644 --- a/core/java/com/android/internal/app/RestrictionsPinActivity.java +++ b/core/java/com/android/internal/app/RestrictionsPinActivity.java @@ -52,7 +52,7 @@ public class RestrictionsPinActivity extends AlertActivity super.onCreate(icicle); mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); - mHasRestrictionsPin = mUserManager.hasRestrictionsPin(); + mHasRestrictionsPin = mUserManager.hasRestrictionsChallenge(); initUi(); setupAlert(); } @@ -83,7 +83,7 @@ public class RestrictionsPinActivity extends AlertActivity super.onResume(); setPositiveButtonState(false); - boolean hasPin = mUserManager.hasRestrictionsPin(); + boolean hasPin = mUserManager.hasRestrictionsChallenge(); if (hasPin) { mPinErrorMessage.setVisibility(View.INVISIBLE); mPinText.setOnEditorActionListener(this); @@ -100,7 +100,7 @@ public class RestrictionsPinActivity extends AlertActivity private boolean updatePinTimer(int pinTimerMs) { if (pinTimerMs < 0) { - pinTimerMs = mUserManager.checkRestrictionsPin(null); + pinTimerMs = mUserManager.checkRestrictionsChallenge(null); } boolean enableInput; if (pinTimerMs >= 200) { @@ -128,7 +128,7 @@ public class RestrictionsPinActivity extends AlertActivity } protected void performPositiveButtonAction() { - int result = mUserManager.checkRestrictionsPin(mPinText.getText().toString()); + int result = mUserManager.checkRestrictionsChallenge(mPinText.getText().toString()); if (result == UserManager.PIN_VERIFICATION_SUCCESS) { setResult(RESULT_OK); finish(); diff --git a/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java b/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java deleted file mode 100644 index f7fc6c67ed83..000000000000 --- a/core/java/com/android/internal/app/RestrictionsPinSetupActivity.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.internal.app; - -import android.content.Context; -import android.os.UserManager; -import android.text.Editable; -import android.text.TextUtils; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import android.widget.TextView; - -import com.android.internal.R; - -/** - * This activity is launched by Settings and other apps to either create a new PIN or - * change an existing PIN. The PIN is maintained by UserManager. - */ -public class RestrictionsPinSetupActivity extends RestrictionsPinActivity { - - private EditText mNewPinText; - private EditText mConfirmPinText; - - protected void initUi() { - AlertController.AlertParams ap = mAlertParams; - ap.mTitle = getString(R.string.restr_pin_enter_pin); - ap.mPositiveButtonText = getString(R.string.ok); - ap.mNegativeButtonText = getString(R.string.cancel); - LayoutInflater inflater = - (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - ap.mView = inflater.inflate(R.layout.restrictions_pin_setup, null); - - mPinText = (EditText) ap.mView.findViewById(R.id.pin_text); - mNewPinText = (EditText) ap.mView.findViewById(R.id.pin_new_text); - mConfirmPinText = (EditText) ap.mView.findViewById(R.id.pin_confirm_text); - mNewPinText.addTextChangedListener(this); - mConfirmPinText.addTextChangedListener(this); - - if (!mHasRestrictionsPin) { - mPinText.setVisibility(View.GONE); - } - } - - public void onResume() { - super.onResume(); - setPositiveButtonState(false); - } - - protected boolean verifyingPin() { - return false; - } - - @Override - protected void performPositiveButtonAction() { - if (mHasRestrictionsPin) { - int result = mUserManager.checkRestrictionsPin(mPinText.getText().toString()); - if (result != UserManager.PIN_VERIFICATION_SUCCESS) { - // TODO: Set message that existing pin doesn't match - return; - } - } - if (mUserManager.changeRestrictionsPin(mNewPinText.getText().toString())) { - // TODO: Send message to PIN recovery agent about the recovery email address - setResult(RESULT_OK); - finish(); - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - CharSequence pin = mPinText.getText(); - CharSequence pin1 = mNewPinText.getText(); - CharSequence pin2 = mConfirmPinText.getText(); - boolean match = pin1 != null && pin2 != null && pin1.length() >= 4 - && pin1.toString().equals(pin2.toString()) - && (!mHasRestrictionsPin || (pin != null && pin.length() >= 4)); - boolean showError = !TextUtils.isEmpty(pin1) && !TextUtils.isEmpty(pin2); - // TODO: Check recovery email address as well - setPositiveButtonState(match); - } - - @Override - public void afterTextChanged(Editable s) { - } - - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - performPositiveButtonAction(); - return true; - } -} diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java index f060efd98451..c1ae9c24ea4e 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java +++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java @@ -156,7 +156,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter } @Override - public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { + public View getItemView(final MenuItemImpl item, View convertView, ViewGroup parent) { View actionView = item.getActionView(); if (actionView == null || item.hasCollapsibleActionView()) { if (!(convertView instanceof ActionMenuItemView)) { @@ -166,6 +166,27 @@ public class ActionMenuPresenter extends BaseMenuPresenter } actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); + if (item.hasSubMenu()) { + actionView.setOnTouchListener(new ForwardingListener(actionView) { + @Override + public ListPopupWindow getPopup() { + return mActionButtonPopup != null ? mActionButtonPopup.getPopup() : null; + } + + @Override + protected boolean onForwardingStarted() { + return onSubMenuSelected((SubMenuBuilder) item.getSubMenu()); + } + + @Override + protected boolean onForwardingStopped() { + return dismissPopupMenus(); + } + }); + } else { + actionView.setOnTouchListener(null); + } + final ActionMenuView menuParent = (ActionMenuView) parent; final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); if (!menuParent.checkLayoutParams(lp)) { diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java index 88ff7e28d763..5469b635b5ae 100644 --- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java +++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java @@ -19,7 +19,6 @@ package com.android.internal.widget; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.os.Build; -import android.util.Log; import android.view.ViewGroup; import com.android.internal.app.ActionBarImpl; @@ -85,7 +84,7 @@ public class ActionBarOverlayLayout extends ViewGroup { ta.recycle(); mIgnoreWindowContentOverlay = context.getApplicationInfo().targetSdkVersion < - Build.VERSION_CODES.KEY_LIME_PIE; + Build.VERSION_CODES.KITKAT; } public void setActionBar(ActionBarImpl impl) { @@ -111,7 +110,7 @@ public class ActionBarOverlayLayout extends ViewGroup { */ mIgnoreWindowContentOverlay = overlayMode && getContext().getApplicationInfo().targetSdkVersion < - Build.VERSION_CODES.KEY_LIME_PIE; + Build.VERSION_CODES.KITKAT; } public void setShowingForActionMode(boolean showing) { diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 51ba52acddf3..225bf06654a2 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -742,6 +742,30 @@ static jint android_media_AudioTrack_get_latency(JNIEnv *env, jobject thiz) { // ---------------------------------------------------------------------------- +static jint android_media_AudioTrack_get_timestamp(JNIEnv *env, jobject thiz, jlongArray jTimestamp) { + sp<AudioTrack> lpTrack = getAudioTrack(env, thiz); + + if (lpTrack == NULL) { + ALOGE("Unable to retrieve AudioTrack pointer for getTimestamp()"); + return AUDIOTRACK_ERROR; + } + AudioTimestamp timestamp; + status_t status = lpTrack->getTimestamp(timestamp); + if (status == OK) { + jlong* nTimestamp = (jlong *) env->GetPrimitiveArrayCritical(jTimestamp, NULL); + if (nTimestamp == NULL) { + ALOGE("Unable to get array for getTimestamp()"); + return AUDIOTRACK_ERROR; + } + nTimestamp[0] = (jlong) timestamp.mPosition; + nTimestamp[1] = (jlong) ((timestamp.mTime.tv_sec * 1000000000LL) + timestamp.mTime.tv_nsec); + env->ReleasePrimitiveArrayCritical(jTimestamp, nTimestamp, 0); + } + return (jint) android_media_translateErrorCode(status); +} + + +// ---------------------------------------------------------------------------- static jint android_media_AudioTrack_set_loop(JNIEnv *env, jobject thiz, jint loopStart, jint loopEnd, jint loopCount) { sp<AudioTrack> lpTrack = getAudioTrack(env, thiz); @@ -869,6 +893,7 @@ static JNINativeMethod gMethods[] = { {"native_set_position", "(I)I", (void *)android_media_AudioTrack_set_position}, {"native_get_position", "()I", (void *)android_media_AudioTrack_get_position}, {"native_get_latency", "()I", (void *)android_media_AudioTrack_get_latency}, + {"native_get_timestamp", "([J)I", (void *)android_media_AudioTrack_get_timestamp}, {"native_set_loop", "(III)I", (void *)android_media_AudioTrack_set_loop}, {"native_reload_static", "()I", (void *)android_media_AudioTrack_reload}, {"native_get_output_sample_rate", diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index f5eb38988ef2..dd07c4f52144 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -56,6 +56,7 @@ enum { HEAP_OAT, HEAP_ART, HEAP_UNKNOWN_MAP, + HEAP_GPU, HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, @@ -64,7 +65,7 @@ enum { HEAP_DALVIK_CODE_CACHE, _NUM_HEAP, - _NUM_EXCLUSIVE_HEAP = HEAP_UNKNOWN_MAP+1, + _NUM_EXCLUSIVE_HEAP = HEAP_GPU+1, _NUM_CORE_HEAP = HEAP_NATIVE+1 }; @@ -137,6 +138,72 @@ static jlong android_os_Debug_getNativeHeapFreeSize(JNIEnv *env, jobject clazz) #endif } +// XXX Qualcom-specific! +static jlong read_gpu_mem(int pid) +{ + char line[1024]; + jlong uss = 0; + unsigned temp; + + char tmp[128]; + FILE *fp; + + sprintf(tmp, "/d/kgsl/proc/%d/mem", pid); + fp = fopen(tmp, "r"); + if (fp == 0) { + //ALOGI("Unable to open: %s", tmp); + return 0; + } + + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } + + //ALOGI("Read: %s", line); + + // Format is: + // gpuaddr useraddr size id flags type usage sglen + // 54676000 54676000 4096 1 ----p gpumem arraybuffer 1 + // + // If useraddr is 0, this is gpu mem not otherwise accounted + // against the process. + + // Make sure line is long enough. + int i = 0; + while (i < 9) { + if (line[i] == 0) { + break; + } + i++; + } + if (i < 9) { + //ALOGI("Early line term!"); + continue; + } + + // Look to see if useraddr is 00000000. + while (i < 17) { + if (line[i] != '0') { + break; + } + i++; + } + if (i < 17) { + //ALOGI("useraddr not 0!"); + continue; + } + + uss += atoi(line + i); + //ALOGI("Uss now: %ld", uss); + } + + fclose(fp); + + // Convert from bytes to KB. + return uss / 1024; +} + static void read_mapinfo(FILE *fp, stats_t* stats) { char line[1024]; @@ -340,6 +407,10 @@ static void android_os_Debug_getDirtyPagesPid(JNIEnv *env, jobject clazz, load_maps(pid, stats); + jlong gpu = read_gpu_mem(pid); + stats[HEAP_GPU].pss += gpu; + stats[HEAP_GPU].privateDirty += gpu; + for (int i=_NUM_CORE_HEAP; i<_NUM_EXCLUSIVE_HEAP; i++) { stats[HEAP_UNKNOWN].pss += stats[i].pss; stats[HEAP_UNKNOWN].swappablePss += stats[i].swappablePss; @@ -394,34 +465,37 @@ static jlong android_os_Debug_getPssPid(JNIEnv *env, jobject clazz, jint pid, jl char tmp[128]; FILE *fp; + pss = uss = read_gpu_mem(pid); + sprintf(tmp, "/proc/%d/smaps", pid); fp = fopen(tmp, "r"); - if (fp == 0) return 0; - while (true) { - if (fgets(line, 1024, fp) == NULL) { - break; - } + if (fp != 0) { + while (true) { + if (fgets(line, 1024, fp) == NULL) { + break; + } - if (line[0] == 'P') { - if (strncmp(line, "Pss:", 4) == 0) { - char* c = line + 4; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; - } - pss += atoi(c); - } else if (strncmp(line, "Private_Clean:", 14) - || strncmp(line, "Private_Dirty:", 14)) { - char* c = line + 14; - while (*c != 0 && (*c < '0' || *c > '9')) { - c++; + if (line[0] == 'P') { + if (strncmp(line, "Pss:", 4) == 0) { + char* c = line + 4; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + pss += atoi(c); + } else if (strncmp(line, "Private_Clean:", 14) + || strncmp(line, "Private_Dirty:", 14)) { + char* c = line + 14; + while (*c != 0 && (*c < '0' || *c > '9')) { + c++; + } + uss += atoi(c); } - uss += atoi(c); } } - } - fclose(fp); + fclose(fp); + } if (outUss != NULL) { if (env->GetArrayLength(outUss) >= 1) { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 49945f0d58f8..2e479283f147 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2444,6 +2444,13 @@ android:description="@string/permdesc_accessNetworkConditions" android:protectionLevel="signature|system" /> + <!-- Allows an application to request HotwordRecognition. + @hide This is not a third-party API (intended for system apps). --> + <permission android:name="android.permission.HOTWORD_RECOGNITION" + android:label="@string/permlab_hotwordRecognition" + android:description="@string/permdesc_hotwordRecognition" + android:protectionLevel="signature|system" /> + <!-- The system process is explicitly the only one allowed to launch the confirmation UI for full backup/restore --> <uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/> @@ -2546,25 +2553,13 @@ android:process=":ui"> </activity> - <activity android:name="com.android.internal.app.RestrictionsPinSetupActivity" - android:theme="@style/Theme.Holo.Dialog.Alert" - android:permission="android.permission.MANAGE_USERS" - android:excludeFromRecents="true" - android:windowSoftInputMode="adjustPan" - android:process=":ui"> - <intent-filter android:priority="100"> - <action android:name="android.intent.action.RESTRICTIONS_PIN_CREATE" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - </activity> - <activity android:name="com.android.internal.app.RestrictionsPinActivity" android:theme="@style/Theme.Holo.Dialog.Alert" android:excludeFromRecents="true" android:windowSoftInputMode="adjustPan" android:process=":ui"> <intent-filter android:priority="100"> - <action android:name="android.intent.action.RESTRICTIONS_PIN_CHALLENGE" /> + <action android:name="android.intent.action.RESTRICTIONS_CHALLENGE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> diff --git a/core/res/res/drawable-hdpi/stat_notify_call_mute.png b/core/res/res/drawable-hdpi/stat_notify_call_mute.png Binary files differindex 7f87ee734615..f8f950369a22 100644 --- a/core/res/res/drawable-hdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-hdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-hdpi/stat_sys_speakerphone.png b/core/res/res/drawable-hdpi/stat_sys_speakerphone.png Binary files differindex 765be617efb7..d5bb37f2ac6d 100644 --- a/core/res/res/drawable-hdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-hdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-mdpi/stat_notify_call_mute.png b/core/res/res/drawable-mdpi/stat_notify_call_mute.png Binary files differindex 58e0cbc33e14..79683c7222b4 100644 --- a/core/res/res/drawable-mdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-mdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-mdpi/stat_sys_speakerphone.png b/core/res/res/drawable-mdpi/stat_sys_speakerphone.png Binary files differindex d82704ed66a3..df0597fd171f 100644 --- a/core/res/res/drawable-mdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-mdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-sw600dp-hdpi/stat_notify_call_mute.png b/core/res/res/drawable-sw600dp-hdpi/stat_notify_call_mute.png Binary files differindex b7537642e417..5d4ad05378c4 100644 --- a/core/res/res/drawable-sw600dp-hdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-sw600dp-hdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-sw600dp-hdpi/stat_sys_speakerphone.png b/core/res/res/drawable-sw600dp-hdpi/stat_sys_speakerphone.png Binary files differindex b47a9f69006e..66895fae1130 100644 --- a/core/res/res/drawable-sw600dp-hdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-sw600dp-hdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-sw600dp-mdpi/stat_notify_call_mute.png b/core/res/res/drawable-sw600dp-mdpi/stat_notify_call_mute.png Binary files differindex 951197c69aa4..08017acf0e8b 100644 --- a/core/res/res/drawable-sw600dp-mdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-sw600dp-mdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-sw600dp-mdpi/stat_sys_speakerphone.png b/core/res/res/drawable-sw600dp-mdpi/stat_sys_speakerphone.png Binary files differindex 5893db92b126..276dea1e9af7 100644 --- a/core/res/res/drawable-sw600dp-mdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-sw600dp-mdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-sw600dp-xhdpi/stat_notify_call_mute.png b/core/res/res/drawable-sw600dp-xhdpi/stat_notify_call_mute.png Binary files differindex 1d72243f1cb4..cdef5d946d88 100644 --- a/core/res/res/drawable-sw600dp-xhdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-sw600dp-xhdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-sw600dp-xhdpi/stat_sys_speakerphone.png b/core/res/res/drawable-sw600dp-xhdpi/stat_sys_speakerphone.png Binary files differindex 76dee9e29f4f..262af383b71f 100644 --- a/core/res/res/drawable-sw600dp-xhdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-sw600dp-xhdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-sw600dp-xxhdpi/stat_notify_call_mute.png b/core/res/res/drawable-sw600dp-xxhdpi/stat_notify_call_mute.png Binary files differnew file mode 100644 index 000000000000..13ec34eb6723 --- /dev/null +++ b/core/res/res/drawable-sw600dp-xxhdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-sw600dp-xxhdpi/stat_sys_speakerphone.png b/core/res/res/drawable-sw600dp-xxhdpi/stat_sys_speakerphone.png Binary files differnew file mode 100644 index 000000000000..34a4c45ebfd3 --- /dev/null +++ b/core/res/res/drawable-sw600dp-xxhdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-xhdpi/stat_notify_call_mute.png b/core/res/res/drawable-xhdpi/stat_notify_call_mute.png Binary files differindex adbd7b15e206..e14336694886 100644 --- a/core/res/res/drawable-xhdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-xhdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-xhdpi/stat_sys_speakerphone.png b/core/res/res/drawable-xhdpi/stat_sys_speakerphone.png Binary files differindex 51e648cc1865..f7f787119130 100644 --- a/core/res/res/drawable-xhdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-xhdpi/stat_sys_speakerphone.png diff --git a/core/res/res/drawable-xxhdpi/stat_notify_call_mute.png b/core/res/res/drawable-xxhdpi/stat_notify_call_mute.png Binary files differindex 54fc740c14b9..8c6176cd24f2 100644 --- a/core/res/res/drawable-xxhdpi/stat_notify_call_mute.png +++ b/core/res/res/drawable-xxhdpi/stat_notify_call_mute.png diff --git a/core/res/res/drawable-xxhdpi/stat_sys_speakerphone.png b/core/res/res/drawable-xxhdpi/stat_sys_speakerphone.png Binary files differindex 40d1a3506d1d..a53913f55043 100644 --- a/core/res/res/drawable-xxhdpi/stat_sys_speakerphone.png +++ b/core/res/res/drawable-xxhdpi/stat_sys_speakerphone.png diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 575bf5560a57..59749d41830d 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Sien alle"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Kies aktiwiteit"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Deel met"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Toestel gesluit."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Stuur tans…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Gekanselleer"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kon nie inhoud skryf nie"</string> <string name="reason_unknown" msgid="6048913880184628119">"onbekend"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Voer administrateur-PIN in"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Voer PIN in"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Verkeerd"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Huidige PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nuwe PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Bevestig nuwe PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN\'e kom nie ooreen nie. Probeer weer."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN is te kort. Moet ten minste 4 syfers wees."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Verkeerde PIN. Probeer weer oor 1 sekonde."</item> - <item quantity="other" msgid="8030607343223287654">"Verkeerde PIN. Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes."</item> + <item quantity="one" msgid="311050995198548675">"Probeer weer oor 1 sekonde"</item> + <item quantity="other" msgid="4730868920742952817">"Probeer weer oor <xliff:g id="COUNT">%d</xliff:g> sekondes"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Probeer later weer"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Sleep rand van skerm om balk te wys"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sleep van rand van skerm af om stelselbalk te wys"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 042518019b3a..8e782a3c1fdf 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ሁሉንም ተመልከት"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"እንቅስቃሴ ምረጥ"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"ተጋራ ከ"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"መሣሪያ ተቆልፏል።"</string> <string name="list_delimeter" msgid="3975117572185494152">"፣ "</string> <string name="sending" msgid="3245653681008218030">"በመላክ ላይ…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ማሰሺያን አስነሳ?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ተትቷል"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ይዘት መጻፍ ላይ ስህተት"</string> <string name="reason_unknown" msgid="6048913880184628119">"አይታወቅም"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"አስተዳዳሪ ፒን ያስገቡ"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ፒን ያስገቡ"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"ትክክል አይደለም"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"የአሁኑ ፒን"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"አዲስ ፒን"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"አዲስ ፒን ያረጋግጡ"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"ፒኖች አይዛመዱም። እንደገና ይሞክሩ።"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"ፒን በጣም አጭር ነው። ቢያንስ 4 አኃዝ መሆን አለበት።"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"ትክክል ያልሆነ ፒን። በ1 ሰከንድ ውስጥ እንደገና ይሞክሩ።"</item> - <item quantity="other" msgid="8030607343223287654">"ትክክል ያልሆነ ፒን። በ<xliff:g id="COUNT">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ።"</item> + <item quantity="one" msgid="311050995198548675">"በ1 ሰከንድ ውስጥ እንደገና ይሞክሩ"</item> + <item quantity="other" msgid="4730868920742952817">"በ<xliff:g id="COUNT">%d</xliff:g> ሰከንዶች ውስጥ እንደገና ይሞክሩ"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"ቆይተው እንደገና ይሞክሩ"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"አሞሌውን ለማሳየት የማያ ገጹ ጠርዝ ላይ ያንሸራትቱ"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"አሞሌውን ለማሳየት ከማያ ገጹ ጠርዝ ጀምረው ያንሸራትቱ"</string> </resources> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index dbd270c0a905..8988e2eb52fd 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"عرض الكل"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"اختيار نشاط"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"مشاركة مع"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"تم تأمين الجهاز."</string> <string name="list_delimeter" msgid="3975117572185494152">"، "</string> <string name="sending" msgid="3245653681008218030">"جارٍ الإرسال..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ملغاة"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"حدث خطأ أثناء كتابة المحتوى"</string> <string name="reason_unknown" msgid="6048913880184628119">"غير معروف"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"أدخل رقم التعريف الشخصي للمشرف"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"إدخال رقم التعريف الشخصي"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"غير صحيح"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"رقم التعريف الشخصي الحالي"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"رقم التعريف الشخصي الجديد"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"تأكيد رقم التعريف الشخصي الجديد"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"أرقام التعريف الشخصية لا تتطابق، أعد المحاولة."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"رقم التعريف الشخصي أقصر مما يلزم، يجب ألا يقل عن 4 أرقام. "</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"رقم التعريف الشخصي غير صحيح، الرجاء إعادة المحاولة بعد ثانية واحدة."</item> - <item quantity="other" msgid="8030607343223287654">"رقم التعريف الشخصي غير صحيح، الرجاء إعادة المحاولة بعد <xliff:g id="COUNT">%d</xliff:g> من الثواني."</item> + <item quantity="one" msgid="311050995198548675">"أعد المحاولة خلال ثانية واحدة."</item> + <item quantity="other" msgid="4730868920742952817">"أعد المحاولة خلال <xliff:g id="COUNT">%d</xliff:g> ثانية"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"أعد المحاولة لاحقًا"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"مرر سريعًا لحافة الشاشة لإظهار الشريط"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"مرر سريعًا من حافة الشاشة لإظهار شريط النظام"</string> </resources> diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml index e6d8c9bbb494..839ac38a7377 100644 --- a/core/res/res/values-az-rAZ/strings.xml +++ b/core/res/res/values-az-rAZ/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Hamısını seçın"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Fəaliyyəti seçin"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Bununla paylaşın"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Cihaz kilidləndi."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Göndərilir..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Brauzer işə salınsın?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ləğv edildi"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Kontent yazmna xətası"</string> <string name="reason_unknown" msgid="6048913880184628119">"naməlum"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Administrator PIN kodunu daxil edin"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN daxil edin"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Səhv"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Cari PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yeni PIN\'i təsdiq edin"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PİN uyğun gəlmir. Yenidən cəhd edin."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PİN çox qısadır. Ən azı 4 rəqəm olmalıdır."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Yanlış PİN. 1 saniyə sonra təkrar sınayın."</item> - <item quantity="other" msgid="8030607343223287654">"Yanlış PİN. <xliff:g id="COUNT">%d</xliff:g> saniyə sonra təkrar sınayın."</item> + <item quantity="one" msgid="311050995198548675">"1 saniyə sonra təkrar yoxlayın"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> saniyə sonra təkrar yoxlayın"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra yenidən yoxlayın."</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Paneli göstərmək üçün ekranın küncünü sürüşdürün"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem panelini göstərmək üçün ekranın küncündən sürüşdürün"</string> </resources> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index d3782e00b94a..cc799dfd440f 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1475,7 +1475,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Прагледзець усё"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Выберыце працэс"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Апублікаваць з дапамогай"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Прылада заблакаваная."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Адпраўка..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Запусцiць браўзер?"</string> @@ -1639,8 +1638,12 @@ <skip /> <!-- no translation found for reason_unknown (6048913880184628119) --> <skip /> + <!-- no translation found for restr_pin_enter_admin_pin (783643731895143970) --> + <skip /> <!-- no translation found for restr_pin_enter_pin (3395953421368476103) --> <skip /> + <!-- no translation found for restr_pin_incorrect (8571512003955077924) --> + <skip /> <!-- no translation found for restr_pin_enter_old_pin (1462206225512910757) --> <skip /> <!-- no translation found for restr_pin_enter_new_pin (5959606691619959184) --> @@ -1653,8 +1656,10 @@ <skip /> <!-- no translation found for restr_pin_error_too_short (8173982756265777792) --> <skip /> - <!-- no translation found for restr_pin_countdown:one (4835639969503729874) --> - <!-- no translation found for restr_pin_countdown:other (8030607343223287654) --> + <!-- no translation found for restr_pin_countdown:one (311050995198548675) --> + <!-- no translation found for restr_pin_countdown:other (4730868920742952817) --> + <!-- no translation found for restr_pin_try_later (973144472490532377) --> + <skip /> <!-- no translation found for transient_navigation_confirmation (4907844043611123426) --> <skip /> <!-- no translation found for transient_navigation_confirmation_long (8061685920508086697) --> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 3bb818b3ea25..b9cb281c0d45 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Вижте всички"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Избор на активност"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Споделяне със:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Устройството е заключено."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Изпраща се..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Анулирано"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Грешка при записване на съдържанието"</string> <string name="reason_unknown" msgid="6048913880184628119">"неизвестно"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Въведете ПИН кода на администратор"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Въведете ПИН кода"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Неправилно"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Текущ ПИН код"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Нов ПИН код"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Потвърждаване на новия ПИН код"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"ПИН кодовете не са идентични. Опитайте отново."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"ПИН кодът е твърде кратък. Трябва да е поне 4 цифри."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Неправилен ПИН код. Опитайте отново след 1 секунда."</item> - <item quantity="other" msgid="8030607343223287654">"Неправилен ПИН код. Опитайте отново след <xliff:g id="COUNT">%d</xliff:g> секунди."</item> + <item quantity="one" msgid="311050995198548675">"Опитайте отново след 1 секунда"</item> + <item quantity="other" msgid="4730868920742952817">"Опитайте отново след <xliff:g id="COUNT">%d</xliff:g> секунди"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Опитайте отново по-късно"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"За показв. на лентата прек. пръст по ръба на екрана"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Прекарайте пръст от ръба на екрана, за да се покаже системната лента"</string> </resources> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 3d6315fee12b..4ed06643344f 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Mostra-les totes"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Selecció de l\'activitat"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Comparteix amb"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositiu bloquejat."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"S\'està enviant…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vols iniciar el navegador?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancel·lada"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error en escriure el contingut"</string> <string name="reason_unknown" msgid="6048913880184628119">"desconegut"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Introdueix el PIN d\'administrador"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introdueix el PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrecte"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nou"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirma el PIN nou"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Els PIN no coincideixen. Torna-ho a provar."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"El PIN és massa curt. Ha de tenir quatre dígits com a mínim."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorrecte. Torna-ho a provar d\'aquí a 1 segon."</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorrecte. Torna-ho a provar d\'aquí a <xliff:g id="COUNT">%d</xliff:g> segons."</item> + <item quantity="one" msgid="311050995198548675">"Torna-ho a provar d\'aquí a 1 segon"</item> + <item quantity="other" msgid="4730868920742952817">"Torna-ho a provar d\'aquí a <xliff:g id="COUNT">%d</xliff:g> segons"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Torna-ho a provar més tard"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Llisca des de vora per mostrar barra"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Fes lliscar el dit des de la vora de la pantalla perquè es mostri la barra del sistema"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 0d0e95cabff5..b71ff181bb67 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobrazit vše"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vybrat aktivitu"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Sdílet s"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Zařízení je uzamčeno."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Odesílání..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Zrušeno"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Při zápisu obsahu došlo k chybě"</string> <string name="reason_unknown" msgid="6048913880184628119">"neznámé"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Zadejte PIN administrátora"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Zadejte kód PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Nesprávné"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuální kód PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nový kód PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potvrďte nový PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Kódy PIN se neshodují. Zkuste to znovu."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Kód PIN je příliš krátký. Musí mít alespoň čtyři číslice."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Nesprávný kód PIN. Zkuste to znovu za jednu sekundu."</item> - <item quantity="other" msgid="8030607343223287654">"Nesprávný kód PIN. Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Zkuste to znovu za 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Zkuste to znovu za <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Zkuste to znovu později"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Panel zobrazíte přejetím kraje obr."</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Systémový panel zobrazíte přejetím přes okraj obrazovky"</string> </resources> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 36272ab7f99d..753625206173 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Se alle"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vælg aktivitet"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Del med"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Enhed låst."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Sender..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annulleret"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fejl ved skrivning af indhold"</string> <string name="reason_unknown" msgid="6048913880184628119">"ukendt"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Indtast administratorpinkoden"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Indtast pinkode"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Forkert"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuel pinkode:"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny pinkode"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Bekræft den nye pinkode"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Pinkoderne stemmer ikke overens. Prøv igen."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Pinkoden er for kort. Den skal være på mindst 4 tal."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Forkert pinkode. Prøv igen om 1 sekund."</item> - <item quantity="other" msgid="8030607343223287654">"Forkert pinkode. Prøv igen om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> + <item quantity="one" msgid="311050995198548675">"Prøv igen om 1 sekund"</item> + <item quantity="other" msgid="4730868920742952817">"Prøv igen om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Prøv igen senere"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Stryg fra skærmkanten for at se bjælken"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Stryg med fingeren fra skærmens kant for at se systembjælken"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 863c2c03340a..2185a4290ac1 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Alle anzeigen"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Aktivität wählen"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Teilen mit"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Gerät gesperrt"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Wird gesendet..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Abgebrochen"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fehler beim Schreiben von Inhalten"</string> <string name="reason_unknown" msgid="6048913880184628119">"Unbekannt"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Administrator-PIN eingeben"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN eingeben"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Falsch"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuelle PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Neue PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Neue PIN bestätigen"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Die PINs stimmen nicht überein. Bitte versuchen Sie es erneut."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Die PIN ist zu kurz. Sie muss mindestens 4 Ziffern umfassen."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Falsche PIN. In 1 Sek. erneut versuchen."</item> - <item quantity="other" msgid="8030607343223287654">"Falsche PIN. In <xliff:g id="COUNT">%d</xliff:g> Sek. erneut versuchen."</item> + <item quantity="one" msgid="311050995198548675">"In 1 Sek. wiederholen"</item> + <item quantity="other" msgid="4730868920742952817">"In <xliff:g id="COUNT">%d</xliff:g> Sek. wiederholen"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Später erneut versuchen"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Zum Einblenden der Leiste vom Rand weg wischen"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Zum Einblenden der Systemleiste vom Rand weg wischen"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index be12c7416810..9fb21e61490a 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Εμφάνιση όλων"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Επιλογή δραστηριότητας"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Κοινή χρήση με"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Η συσκευή κλειδώθηκε."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Γίνεται αποστολή…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Εκκίνηση προγράμματος περιήγησης;"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Ακυρώθηκε"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Σφάλμα κατά την εγγραφή περιεχομένου"</string> <string name="reason_unknown" msgid="6048913880184628119">"άγνωστο"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Εισαγάγετε κωδικό PIN διαχειριστή"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Εισαγωγή PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Εσφαλμένο"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Ισχύων κωδικός PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Νέος κωδικός PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Επιβεβαίωση νέου κωδικού PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Τα PIN δεν συμφωνούν. Προσπαθήστε ξανά."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Το PIN είναι υπερβολικά μικρό. Πρέπει να έχει μέγεθος τουλάχιστον 4 χαρακτήρων."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Λάθος PIN. Προσπαθήστε ξανά σε 1 δευτερόλεπτο."</item> - <item quantity="other" msgid="8030607343223287654">"Λάθος PIN. Προσπαθήστε ξανά σε <xliff:g id="COUNT">%d</xliff:g> δευτερόλεπτα."</item> + <item quantity="one" msgid="311050995198548675">"Επανάληψη σε 1 δευτ."</item> + <item quantity="other" msgid="4730868920742952817">"Επανάληψη σε <xliff:g id="COUNT">%d</xliff:g> δευτ."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Δοκιμάστε ξανά αργότερα"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Σύρετε την άκρη για εμφάν.γραμμής"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Σύρετε από την άκρη της οθόνης για να εμφανίσετε τη γραμμή συστήματος"</string> </resources> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 5b431fdc6b22..936062b81c5f 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Device locked."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Sending…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelled"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error writing content"</string> <string name="reason_unknown" msgid="6048913880184628119">"unknown"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Enter administrator PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Enter PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrect"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Current PIN:"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"New PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirm new PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PINs don\'t match. Try again."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN is too short. Must be at least 4 digits."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Incorrect PIN. Try again in 1 second."</item> - <item quantity="other" msgid="8030607343223287654">"Incorrect PIN. Try again in <xliff:g id="COUNT">%d</xliff:g> seconds."</item> + <item quantity="one" msgid="311050995198548675">"Try again in 1 second"</item> + <item quantity="other" msgid="4730868920742952817">"Try again in <xliff:g id="COUNT">%d</xliff:g> seconds"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swipe edge of screen to reveal bar"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swipe from edge of screen to reveal system bar"</string> </resources> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 5b431fdc6b22..936062b81c5f 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"See all"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Choose activity"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Share with"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Device locked."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Sending…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Launch Browser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelled"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error writing content"</string> <string name="reason_unknown" msgid="6048913880184628119">"unknown"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Enter administrator PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Enter PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrect"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Current PIN:"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"New PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirm new PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PINs don\'t match. Try again."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN is too short. Must be at least 4 digits."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Incorrect PIN. Try again in 1 second."</item> - <item quantity="other" msgid="8030607343223287654">"Incorrect PIN. Try again in <xliff:g id="COUNT">%d</xliff:g> seconds."</item> + <item quantity="one" msgid="311050995198548675">"Try again in 1 second"</item> + <item quantity="other" msgid="4730868920742952817">"Try again in <xliff:g id="COUNT">%d</xliff:g> seconds"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Try again later"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swipe edge of screen to reveal bar"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swipe from edge of screen to reveal system bar"</string> </resources> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index ee051db2c2fb..b91438d76a88 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -360,8 +360,8 @@ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de accesibilidad. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindPrintService" msgid="8462815179572748761">"vincular a un servicio de impresión"</string> <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Permite al propietario vincularse a la interfaz de nivel superior de un servicio de impresión. Las aplicaciones normales no deberían necesitar este permiso."</string> - <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"Vincular a un servicio de administrador de trabajos de impresión"</string> - <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite al propietario vincularse con la interfaz de nivel superior de un servicio de administrador de trabajos de impresión. Las aplicaciones normales no deberían necesitar este permiso."</string> + <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"Vincular a un servicio de administración de trabajos de impresión"</string> + <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Permite al propietario vincularse con la interfaz de nivel superior de un servicio de administración de trabajos de impresión. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindNfcService" msgid="2752731300419410724">"Vincular con servicio NFC"</string> <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Permite vincular con aplicaciones que emulen tarjetas NFC. Las aplicaciones normales no deberían necesitar este permiso."</string> <string name="permlab_bindTextService" msgid="7358378401915287938">"vincular a un servicio de texto"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver todas"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Elige actividad"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartir con"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositivo bloqueado"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelada"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error al escribir contenido"</string> <string name="reason_unknown" msgid="6048913880184628119">"desconocido"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Ingresar PIN de administrador"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ingresar PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrecto"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nuevo"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirmar PIN nuevo"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Los PIN no coinciden. Vuelve a intentarlo."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorrecto. Reintentar en 1 s"</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorrecto. Reintentar en <xliff:g id="COUNT">%d</xliff:g> s"</item> + <item quantity="one" msgid="311050995198548675">"Intentar en 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Intentar en <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Volver a intentar más tarde"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Desliza el borde para ver la barra."</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Desliza el dedo desde el borde de la pantalla para mostrar la barra del sistema."</string> </resources> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 844412d7cb7a..620410eeeea1 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver todo"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Seleccionar actividad"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartir con"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositivo bloqueado"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Iniciar el navegador?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelado"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Error al escribir contenido"</string> <string name="reason_unknown" msgid="6048913880184628119">"desconocido"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Introducir PIN de administrador"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introducir PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrecta"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN actual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN nuevo"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirma tu nuevo PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Los números PIN no coinciden. Inténtalo de nuevo."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"El PIN es demasiado corto. Debe tener al menos 4 dígitos."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorrecto. Inténtalo de nuevo dentro de 1 segundo."</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorrecto. Inténtalo de nuevo dentro de <xliff:g id="COUNT">%d</xliff:g> segundos."</item> + <item quantity="one" msgid="311050995198548675">"Inténtalo en 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Inténtalo en <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Volver a intentar más tarde"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Deslizar borde para mostrar barra"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Desliza el borde de la pantalla para mostrar la barra del sistema"</string> </resources> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index f99f77470a28..a74334da9cb1 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Kuva kõik"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Tegevuse valimine"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Jagamine rakendusega:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Seade lukustatud."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Saatmine ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Tühistatud"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Viga sisu kirjutamisel"</string> <string name="reason_unknown" msgid="6048913880184628119">"teadmata"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Administraatori PIN-koodi sisestamine"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Sisestage PIN-kood"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Vale"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Praegune PIN-kood"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Uus PIN-kood"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Kinnitage uus PIN-kood"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-kood ei sobi. Proovige uuesti."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-kood on liiga lühike. Peab olema vähemalt 4-kohaline."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Vale PIN-kood. Proovige 1 s pärast."</item> - <item quantity="other" msgid="8030607343223287654">"Vale PIN-kood. Proovige <xliff:g id="COUNT">%d</xliff:g> s pärast."</item> + <item quantity="one" msgid="311050995198548675">"Proovige uuesti 1 sekundi pärast"</item> + <item quantity="other" msgid="4730868920742952817">"Proovige uuesti <xliff:g id="COUNT">%d</xliff:g> sekundi pärast"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Proovige hiljem uuesti"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Riba kuvam. pühkige ekraani serva"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Süsteemiriba kuvamiseks pühkige ekraani servast"</string> </resources> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 0135830e9951..019347521ec7 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"مشاهدهٔ همه"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"انتخاب فعالیت"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"اشتراکگذاری با"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"دستگاه قفل است."</string> <string name="list_delimeter" msgid="3975117572185494152">"، "</string> <string name="sending" msgid="3245653681008218030">"در حال ارسال..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راهاندازی شود؟"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"لغو شد"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"خطا هنگام نوشتن محتوا"</string> <string name="reason_unknown" msgid="6048913880184628119">"نامعلوم"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"پین سرپرست را وارد کنید"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"پین را وارد کنید"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"نادرست"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"پین کنونی"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"پین جدید"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"تأیید پین جدید"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"پینها مطابقت ندارند. دوباره امتحان کنید."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"پین بیش از حد کوتاه است. باید حداقل ۴ رقم باشد."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"پین نادرست است. امتحان در ۱ ثانیه."</item> - <item quantity="other" msgid="8030607343223287654">"پین نادرست است. امتحان در <xliff:g id="COUNT">%d</xliff:g> ثانیه."</item> + <item quantity="one" msgid="311050995198548675">"امتحان پس از ۱ ثانیه"</item> + <item quantity="other" msgid="4730868920742952817">"امتحان پس از <xliff:g id="COUNT">%d</xliff:g> ثانیه"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"بعداً دوباره امتحان کنید"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"کشیدن از لبه صفحه برای نمایش نوار"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"برای نمایش نوار سیستم، انگشت خود را از لبه صفحه به داخل بکشید"</string> </resources> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index fd11b8861794..dbd77e0503fe 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Näytä kaikki"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Valitse toiminto"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Jaa seuraavien kanssa"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Laite lukittu."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Lähetetään…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Käynnistetäänkö selain?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Peruutettu"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Sisällön kirjoittamisessa tapahtui virhe"</string> <string name="reason_unknown" msgid="6048913880184628119">"tuntematon"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Anna järjestelmänvalvojan PIN-koodi"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Anna PIN-koodi"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Virheellinen"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Nykyinen PIN-koodi"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Uusi PIN-koodi"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Vahvista uusi PIN-koodi"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-koodit eivät vastaa toisiaan. Yritä uudelleen."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-koodi on liian lyhyt. Vähimmäispituus on neljä merkkiä."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Väärä PIN. Yritä uudelleen yhden sekunnin kuluttua."</item> - <item quantity="other" msgid="8030607343223287654">"Väärä PIN. Yritä uudelleen <xliff:g id="COUNT">%d</xliff:g> sekunnin kuluttua."</item> + <item quantity="one" msgid="311050995198548675">"Yritä uud. 1 s kul."</item> + <item quantity="other" msgid="4730868920742952817">"Yritä uud. <xliff:g id="COUNT">%d</xliff:g> s kul."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Yritä myöhemmin uudelleen"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Näytä palkki liu\'uttamalla reunasta"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Tuo järjestelmäpalkki näkyviin liu\'uttamalla ruudun reunasta"</string> </resources> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 051fea18f59d..47df2d0c1e66 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tout afficher"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Sélectionnez une activité"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Partagez avec"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Appareil verrouillé"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Envoi…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annulé"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erreur lors de l\'écriture du contenu"</string> <string name="reason_unknown" msgid="6048913880184628119">"inconnu"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Entrez le NIP d\'administrateur"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Saisissez le NIP"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrect"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"NIP actuel"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nouveau NIP"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirmer le nouveau NIP"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Les NIP ne correspondent pas. Essayez à nouveau."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"NIP erroné. Essayez à nouveau dans 1 seconde."</item> - <item quantity="other" msgid="8030607343223287654">"NIP erroné. Réessayez dans <xliff:g id="COUNT">%d</xliff:g> secondes."</item> + <item quantity="one" msgid="311050995198548675">"Dans 1 seconde"</item> + <item quantity="other" msgid="4730868920742952817">"Dans <xliff:g id="COUNT">%d</xliff:g> secondes"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Réessayez plus tard"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Gliss. doigt sur côté écr. aff. barre"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Faites glisser votre doigt à partir d\'un côté de l\'écran pour afficher la barre système"</string> </resources> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 379bc13c6fa1..d639f49cdb76 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tout afficher"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Sélectionnez une activité"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Partager avec"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Appareil verrouillé"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Envoi en cours…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur ?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Tâche annulée."</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erreur lors de la modification du contenu."</string> <string name="reason_unknown" msgid="6048913880184628119">"inconnu"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Saisir le code PIN d\'administrateur"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Saisir le code PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorrect."</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Code PIN actuel"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nouveau code PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirmer le nouveau code PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Les codes PIN ne correspondent pas. Veuillez réessayer."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN erroné. Réessayez dans 1 seconde."</item> - <item quantity="other" msgid="8030607343223287654">"PIN erroné. Réessayez dans <xliff:g id="COUNT">%d</xliff:g> secondes."</item> + <item quantity="one" msgid="311050995198548675">"Essay. dans 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Essay. dans <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Veuillez réessayer ultérieurement."</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Faire glisser côté pour voir barre."</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Faites glisser le doigt à partir d\'un côté de l\'écran pour afficher la barre système."</string> </resources> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index b88f663da023..9f4927b10a6d 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -288,7 +288,7 @@ <string name="permlab_setDebugApp" msgid="3022107198686584052">"एप्लिकेशन डीबग करना सक्षम करें"</string> <string name="permdesc_setDebugApp" msgid="4474512416299013256">"एप्लिकेशन को अन्य एप्लिकेशन के लिए डीबग किया जाना चालू करने देता है. दुर्भावनापूर्ण एप्लिकेशन इसका उपयोग अन्य एप्लिकेशन को समाप्त करने के लिए कर सकते हैं."</string> <string name="permlab_changeConfiguration" msgid="4162092185124234480">"सिस्टम प्रदर्शन सेटिंग बदलें"</string> - <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"एप्लिकेशन को वर्तमान कॉन्फ़िगरेशन, जैसे स्थान या समग्र फ़ॉन्ट आकार, बदलने देता है."</string> + <string name="permdesc_changeConfiguration" msgid="4372223873154296076">"एप्लिकेशन को वर्तमान कॉन्फ़िगरेशन, जैसे स्थान या समग्र अक्षरों का आकार, बदलने देता है."</string> <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सक्षम करें"</string> <string name="permdesc_enableCarMode" msgid="4853187425751419467">"एप्लिकेशन को कार मोड सक्षम करने देता है."</string> <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"अन्य एप्लिकेशन बंद करें"</string> @@ -502,16 +502,16 @@ <string name="permlab_mount_format_filesystems" product="nosdcard" msgid="6227819582624904972">"USB संग्रहण मिटाएं"</string> <string name="permlab_mount_format_filesystems" product="default" msgid="262582698639274056">"SD कार्ड मिटाएं"</string> <string name="permdesc_mount_format_filesystems" msgid="8784268246779198627">"एप्लिकेशन को निकालने योग्य संग्रहण फ़ॉर्मेट करने देता है."</string> - <string name="permlab_asec_access" msgid="3411338632002193846">"आंतरिक संग्रहण पर जानकारी प्राप्त करें"</string> - <string name="permdesc_asec_access" msgid="3094563844593878548">"एप्लिकेशन को आंतरिक संग्रहण की जानकारी प्राप्त करने देता है."</string> - <string name="permlab_asec_create" msgid="6414757234789336327">"आंतरिक संग्रहण बनाएं"</string> - <string name="permdesc_asec_create" msgid="4558869273585856876">"एप्लिकेशन को आंतरिक संग्रहण बनाने देता है."</string> - <string name="permlab_asec_destroy" msgid="526928328301618022">"आंतरिक संग्रहण नष्ट करें"</string> - <string name="permdesc_asec_destroy" msgid="7218749286145526537">"एप्लिकेशन को आंतरिक संग्रहण नष्ट करने देता है."</string> - <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"आंतरिक संग्रहण माउंट/अनमाउंट करें"</string> - <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"एप्लिकेशन को आंतरिक संग्रहण माउंट/अनमाउंट करने देता है."</string> - <string name="permlab_asec_rename" msgid="7496633954080472417">"आंतरिक संग्रहण का नाम बदलें"</string> - <string name="permdesc_asec_rename" msgid="1794757588472127675">"एप्लिकेशन को आंतरिक संग्रहण का नाम बदलने देता है."</string> + <string name="permlab_asec_access" msgid="3411338632002193846">"मोबाइल संग्रहण पर जानकारी प्राप्त करें"</string> + <string name="permdesc_asec_access" msgid="3094563844593878548">"एप्लिकेशन को मोबाइल संग्रहण की जानकारी प्राप्त करने देता है."</string> + <string name="permlab_asec_create" msgid="6414757234789336327">"मोबाइल संग्रहण बनाएं"</string> + <string name="permdesc_asec_create" msgid="4558869273585856876">"एप्लिकेशन को मोबाइल संग्रहण बनाने देता है."</string> + <string name="permlab_asec_destroy" msgid="526928328301618022">"मोबाइल संग्रहण नष्ट करें"</string> + <string name="permdesc_asec_destroy" msgid="7218749286145526537">"एप्लिकेशन को मोबाइल संग्रहण नष्ट करने देता है."</string> + <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"मोबाइल संग्रहण माउंट/अनमाउंट करें"</string> + <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"एप्लिकेशन को मोबाइल संग्रहण माउंट/अनमाउंट करने देता है."</string> + <string name="permlab_asec_rename" msgid="7496633954080472417">"मोबाइल संग्रहण का नाम बदलें"</string> + <string name="permdesc_asec_rename" msgid="1794757588472127675">"एप्लिकेशन को मोबाइल संग्रहण का नाम बदलने देता है."</string> <string name="permlab_vibrate" msgid="7696427026057705834">"कंपन नियंत्रित करें"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"एप्लिकेशन को कंपनकर्ता नियंत्रित करने देता है."</string> <string name="permlab_flashlight" msgid="2155920810121984215">"फ़्लैशलाइट नियंत्रित करें"</string> @@ -541,8 +541,8 @@ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"एप्लिकेशन को उपकरण की फ़ोन सुविधाओं तक पहुंचने देता है. यह अनुमति एप्लिकेशन को फ़ोन नंबर और उपकरण आईडी, कॉल सक्रिय है या नहीं, और कॉल द्वारा कनेक्ट किया गया दूरस्थ नंबर निर्धारित करने देती है."</string> <string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"टेबलेट को निष्क्रिय होने से रोकें"</string> <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"फ़ोन को निष्क्रिय होने से रोकें"</string> - <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"एप्लिकेशन को टेबलेट को निष्क्रिय हो जाने से रोकता है."</string> - <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"एप्लिकेशन को फ़ोन को निष्क्रिय होने से रोकता है."</string> + <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"एप्लिकेशन को टेबलेट को प्रयोग में नहीं हो जाने से रोकता है."</string> + <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"एप्लिकेशन को फ़ोन को प्रयोग में नहीं होने से रोकता है."</string> <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"टेबलेट चालू या बंद करें"</string> <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"फ़ोन चालू या बंद करें"</string> <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"एप्लिकेशन को टेबलेट चालू या बंद करने देता है."</string> @@ -1414,7 +1414,7 @@ <string name="action_menu_overflow_description" msgid="2295659037509008453">"अधिक विकल्प"</string> <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> - <string name="storage_internal" msgid="4891916833657929263">"आंतरिक संग्रहण"</string> + <string name="storage_internal" msgid="4891916833657929263">"मोबाइल संग्रहण"</string> <string name="storage_sd_card" msgid="3282948861378286745">"SD कार्ड"</string> <string name="storage_usb" msgid="3017954059538517278">"USB संग्रहण"</string> <string name="extract_edit_menu_button" msgid="8940478730496610137">"संपादित करें"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सभी देखें"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि चुनें"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"इसके साथ साझा करें:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"उपकरण लॉक कर दिया गया."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"भेजा जा रहा है…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउज़र लॉन्च करें?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द कर दी गई"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामग्री लिखने में त्रुटि"</string> <string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"व्यवस्थापक पिन डालें"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN डालें"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"गलत"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वर्तमान पिन"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नया पिन"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नए पिन की पुष्टि करें"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN मिलान नहीं करते हैं. पुनः प्रयास करें."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN बहुत छोटा है. कम से कम 4 अंकों का होना चाहिए."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"गलत PIN. 1 सेकंड में पुनः प्रयास करें."</item> - <item quantity="other" msgid="8030607343223287654">"गलत PIN. <xliff:g id="COUNT">%d</xliff:g> सेकंड में पुनः प्रयास करें."</item> + <item quantity="one" msgid="311050995198548675">"1 सेकंड में पुन: प्रयास करें"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> सेकंड में पुन: प्रयास करें"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"बाद में पुनः प्रयास करें"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"बार को प्रदर्शित करने के लिए स्क्रीन के किनारे को स्वाइप करें"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"सिस्टम बार को प्रदर्शित करने के लिए स्क्रीन के किनारे से स्वाइप करें"</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 136b70406955..cd43b8dac34b 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Prikaži sve"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Odabir aktivnosti"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Dijeljenje s"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Uređaj zaključan."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Slanje..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Otkazano"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Pogreška prilikom pisanja sadržaja"</string> <string name="reason_unknown" msgid="6048913880184628119">"nepoznato"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Unesite PIN administratora"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Unesite PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Netočno"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Trenutačni PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novi PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potvrdite novi PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ovi se ne podudaraju. Pokušajte ponovo."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN je prekratak. Mora imati barem 4 znamenke."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN nije točan. Ponovite za 1 s."</item> - <item quantity="other" msgid="8030607343223287654">"PIN nije točan. Ponovite za <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Ponovite za 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Ponovite za <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Pokušajte ponovo kasnije"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Prijeđite po rubu za prikaz trake"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Prijeđite prstom od ruba zaslona da bi se prikazala traka sustava"</string> </resources> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 8351c56271f6..437367f1b908 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Összes megtekintése"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Tevékenység kiválasztása"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Megosztás"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Az eszköz le van zárva."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Küldés…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Böngésző indítása?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Törölve"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Hiba történt a tartalomírás közben"</string> <string name="reason_unknown" msgid="6048913880184628119">"ismeretlen"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Rendszergazdai PIN kód megadása"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN kód megadása"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Helytelen"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Jelenlegi PIN kód"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Új PIN kód"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Új PIN kód megerősítése"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"A PIN kódok nem egyeznek. Próbálja újra."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"A PIN kód túl rövid. Legalább 4 számjegyből kell állnia."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Helytelen PIN kód. Próbálja újra 1 másodperc múlva."</item> - <item quantity="other" msgid="8030607343223287654">"Helytelen PIN kód. Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva."</item> + <item quantity="one" msgid="311050995198548675">"Próbálja újra 1 másodperc múlva"</item> + <item quantity="other" msgid="4730868920742952817">"Próbálja újra <xliff:g id="COUNT">%d</xliff:g> másodperc múlva"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Próbálkozzon később"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Csúsztatás a képernyő szélén a sávhoz"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Csúsztassa ujját a képernyő szélétől a rendszersáv megjelenítéséhez"</string> </resources> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 232add4c150d..b15ea4f2ed7b 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Տեսնել բոլորը"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Ընտրել գործունեությունը"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Տարածել"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Սարքը կողպված է:"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Ուղարկվում է..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Գործարկե՞լ զննարկիչը:"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Չեղարկված է"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Բովանդակության գրելու սխալ"</string> <string name="reason_unknown" msgid="6048913880184628119">"անհայտ"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Մուտքագրեք կառավարչի PIN-ը"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Մուտքագրեք PIN-ը"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Սխալ է"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Ընթացիկ PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Նոր PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Հաստատեք նոր PIN-ը"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-երը չեն համընկնում: Փորձեք կրկին:"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-ը չափազանց կարճ է: Պետք է ունենա առնվազն 4 թվանիշ:"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN-ը սխալ է: Փորձեք կրկին 1 վայրկյանից:"</item> - <item quantity="other" msgid="8030607343223287654">"PIN-ը սխալ է: Փորձեք կրկին <xliff:g id="COUNT">%d</xliff:g> վայրկյանից:"</item> + <item quantity="one" msgid="311050995198548675">"Կրկին փորձեք 1 վայրկյանից"</item> + <item quantity="other" msgid="4730868920742952817">"Կրկին փորձեք <xliff:g id="COUNT">%d</xliff:g> վայրկյանից"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Կրկին փորձեք մի փոքր ուշ"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Սահեցրեք էկրանի եզրով՝ գոտին բացելու համար"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Սահեցրեք էկրանի եզրով՝ համակարգային գոտին բացելու համար"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index d69e121c77a4..04110af846fe 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Lihat semua"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pilih kegiatan"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Berbagi dengan"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Perangkat tergembok."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Mengirim..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Dibatalkan"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Terjadi kesalahan saat menulis konten"</string> <string name="reason_unknown" msgid="6048913880184628119">"tak diketahui"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Masukkan PIN administrator"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Masukkan PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Tidak benar"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN Saat Ini"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN Baru"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Konfirmasi PIN baru"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN tidak cocok. Coba lagi."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN terlalu pendek. Minimal 4 digit."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN salah. Coba lagi dalam 1 detik."</item> - <item quantity="other" msgid="8030607343223287654">"PIN salah. Coba lagi dalam <xliff:g id="COUNT">%d</xliff:g> detik."</item> + <item quantity="one" msgid="311050995198548675">"Coba 1 dtk lagi"</item> + <item quantity="other" msgid="4730868920742952817">"Coba <xliff:g id="COUNT">%d</xliff:g> detik lagi"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Coba lagi nanti"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Gesek tepi layar untuk membuka bilah"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Gesek dari bagian tepi layar untuk membuka bilah sistem"</string> </resources> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 0a1dad13f560..fd864da0192b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Mostra tutto"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Scegli attività"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Condividi con"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositivo bloccato."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Invio..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Avviare l\'applicazione Browser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Annullato"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Errore nella scrittura dei contenuti"</string> <string name="reason_unknown" msgid="6048913880184628119">"sconosciuto"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Inserisci PIN amministratore"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Inserisci PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Non corretto"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN corrente"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nuovo PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Conferma il nuovo PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"I PIN non corrispondono. Riprova."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Il PIN è troppo corto. Deve avere almeno quattro cifre."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN errato. Riprova tra 1 s."</item> - <item quantity="other" msgid="8030607343223287654">"PIN errato. Riprova tra <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Riprova fra 1 s."</item> + <item quantity="other" msgid="4730868920742952817">"Riprova tra <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Riprova più tardi"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Scorri bordo schermo per visual. barra"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Fai scorrere il dito dal bordo dello schermo per visualizzare la barra di sistema"</string> </resources> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index ba52642069a2..18751229dfa7 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"הצג הכל"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"בחר פעילות"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"שתף עם"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"המכשיר נעול."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"שולח…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"להפעיל את הדפדפן?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"בוטלה"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"שגיאה בכתיבת תוכן"</string> <string name="reason_unknown" msgid="6048913880184628119">"לא ידוע"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"הזן את מספר ה-PIN של מנהל המערכת"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"הזן מספר PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"שגוי"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"מספר PIN נוכחי"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"מספר PIN חדש"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"אשר את מספר ה-PIN החדש"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"מספרי ה-PIN לא תואמים. נסה שוב."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"מספר ה-PIN קצר מדי. חייב להיות באורך 4 ספרות לפחות."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"מספר PIN שגוי. נסה שוב בעוד שניה."</item> - <item quantity="other" msgid="8030607343223287654">"מספר PIN שגוי. נסה שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות."</item> + <item quantity="one" msgid="311050995198548675">"נסה שוב בעוד שנייה"</item> + <item quantity="other" msgid="4730868920742952817">"נסה שוב בעוד <xliff:g id="COUNT">%d</xliff:g> שניות"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"נסה שוב מאוחר יותר"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"החלק מקצה המסך כדי להציג את הסרגל"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"החלק מקצה המסך כדי להציג את סרגל המערכת"</string> </resources> diff --git a/packages/DocumentsUI/res/xml/document_provider.xml b/core/res/res/values-ja/bools.xml index 77891cbccaa1..59cf744532eb 100644 --- a/packages/DocumentsUI/res/xml/document_provider.xml +++ b/core/res/res/values-ja/bools.xml @@ -14,6 +14,7 @@ limitations under the License. --> -<documents-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:customRoots="true"> -</documents-provider> +<resources> + <bool name="flip_controller_fallback_keys">true</bool> +</resources> + diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 7d38f88a6066..bf2dcac98910 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"すべて表示"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"操作の選択"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"共有"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"端末がロックされています。"</string> <string name="list_delimeter" msgid="3975117572185494152">"、 "</string> <string name="sending" msgid="3245653681008218030">"送信中..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ブラウザを起動しますか?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"キャンセルされました"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"コンテンツの書き込み中にエラーが発生しました"</string> <string name="reason_unknown" msgid="6048913880184628119">"不明"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"管理者PINを入力"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PINを入力"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"間違っています"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"現在のPIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新しいPIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"新しいPINの確認"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PINが一致しません。もう一度お試しください。"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PINが短すぎます。4桁以上にしてください。"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PINが正しくありません。1秒後にもう一度お試しください。"</item> - <item quantity="other" msgid="8030607343223287654">"PINが正しくありません。<xliff:g id="COUNT">%d</xliff:g>秒後にもう一度お試しください。"</item> + <item quantity="one" msgid="311050995198548675">"1秒後に再試行"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g>秒後に再試行"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"しばらくしてから再試行"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"画面の端からスワイプしてバーを表示"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"システムバーを表示するには、画面の端からスワイプします"</string> </resources> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index b2c1c3d327a3..745b4c7f7d63 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ყველას ნახვა"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"აქტივობის არჩევა"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"გაზიარება"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"მოწყობილობა ჩაკეტილია."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"იგზავნება..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"გსურთ ბრაუზერის გაშვება?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"გაუქმებული"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"შეცდომა კონტენტის ჩაწერისას"</string> <string name="reason_unknown" msgid="6048913880184628119">"უცნობი"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"შეიყვანეთ ადმინისტრატორის PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"შეიყვანეთ PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"არასწორია"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"ამჟამინდელი PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ახალი PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"გაიმეორეთ ახალი PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ები არ ემთხვევა. სცადეთ ხელახლა."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ძალიან მოკლეა. უნდა შედგებოდეს სულ ცოტა 4 ციფრისგან."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"არასწორი PIN. სცადეთ ისევ 1 წამში."</item> - <item quantity="other" msgid="8030607343223287654">"არასწორი PIN. სცადეთ ისევ <xliff:g id="COUNT">%d</xliff:g> წამში."</item> + <item quantity="one" msgid="311050995198548675">"კიდევ ერთხელ სცადეთ 1 წამში"</item> + <item quantity="other" msgid="4730868920742952817">"კიდევ ერთხელ სცადეთ <xliff:g id="COUNT">%d</xliff:g> წამში"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"სცადეთ მოგვიანებით"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"გაასრიალეთ ეკრანის კიდეზე ზოლის გამოსაჩენად"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"გაასრიალეთ ეკრანის კიდიდან სისტემის ზოლის გამოსაჩენად"</string> </resources> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 4feebe5f8862..a75c6a9d09d0 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"មើលទាំងអស់"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ជ្រើសសកម្មភាព"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"ចែករំលែកជាមួយ"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"ឧបករណ៍ជាប់សោ។"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"កំពុងផ្ញើ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ចាប់ផ្ដើមកម្មវិធីអ៊ីនធឺណិត?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"បានបោះបង់"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"កំហុសក្នុងការសរសេរមាតិកា"</string> <string name="reason_unknown" msgid="6048913880184628119">"មិនស្គាល់"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"បញ្ចូលលេខកូដសម្ងាត់អ្នកគ្រប់គ្រង"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"បញ្ចូលកូដ PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"មិនត្រឹមត្រូវ"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"កូដ PIN បច្ចុប្បន្ន"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"កូដ PIN ថ្មី"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"បញ្ជាក់កូដ PIN ថ្មី"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"កូដ PIN មិនដូចគ្នា។ ព្យាយាមម្ដងទៀត។"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"កូដ PIN ខ្លីពេក។ ត្រូវតែមានយ៉ាងហោចណាស់ ៤ តួ។"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"លេខកូដ PIN មិនត្រឹមត្រូវ។ ព្យាយាមម្ដងទៀតក្នុងរយៈពេល ១ វិនាទី។"</item> - <item quantity="other" msgid="8030607343223287654">"លេខកូដ PIN មិនត្រឹមត្រូវ។ ព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> វិនាទី។"</item> + <item quantity="one" msgid="311050995198548675">"ព្យាយាមម្ដងទៀតក្នុងរយៈពេល ១វិនាទី។"</item> + <item quantity="other" msgid="4730868920742952817">"សូមព្យាយាមម្ដងទៀតក្នុងរយៈពេល <xliff:g id="COUNT">%d</xliff:g> វិនាទី"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"សូមព្យាយាមម្ដងទៀតនៅពេលក្រោយ។"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"អូសគែមអេក្រង់ ដើម្បីបង្ហាញរបារ"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"អូសពីគែមអេក្រង់ ដើម្បីបង្ហាញរបារប្រព័ន្ធ"</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index cdbf2567e02b..9f6c84b41782 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"전체 보기"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"작업 선택"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"공유 대상"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"기기가 잠겼습니다."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"전송 중..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"취소됨"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"콘텐츠 작성 중 오류"</string> <string name="reason_unknown" msgid="6048913880184628119">"알 수 없음"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"관리자 PIN 입력"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN 입력"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"올바르지 않은 값이 입력됨"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"현재 PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"새 PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"새 PIN 확인"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN이 일치하지 않습니다. 다시 시도하세요."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN이 너무 짧습니다. 최소 4자 이상이어야 합니다."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"잘못된 PIN입니다. 1초 뒤에 다시 시도하세요."</item> - <item quantity="other" msgid="8030607343223287654">"잘못된 PIN입니다. <xliff:g id="COUNT">%d</xliff:g>초 뒤에 다시 시도하세요."</item> + <item quantity="one" msgid="311050995198548675">"1초 후에 다시 시도하세요."</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g>초 후에 다시 시도하세요."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"나중에 다시 시도"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"화면 가장자리에서 스와이프하여 표시줄 표시"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"화면 가장자리에서 스와이프하여 시스템 표시줄 표시"</string> </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index d55a2c83b849..0dddde73386a 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ເບິ່ງທັງຫມົດ"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ເລືອກກິດຈະກຳ"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"ແບ່ງປັນກັບ"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"ອຸປະກອນລັອກ."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"ກຳລັງສົ່ງ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ເປີດໂປຣແກຣມທ່ອງເວັບ?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ຍົກເລີກແລ້ວ"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ເນື້ອໃນການຂຽນຜິດພາດ"</string> <string name="reason_unknown" msgid="6048913880184628119">"ບໍ່ຮູ້ຈັກ"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"ໃສ່ PIN ຜູ່ເບິ່ງແຍງລະບົບ"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ໃສ່ລະຫັດ PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"ບໍ່ຖືກຕ້ອງ"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ປະຈຸບັນ"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"ລະຫັດ PIN ໃໝ່"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ຢືນຢັນລະຫັດ PIN ໃໝ່"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN ບໍ່ກົງກັນ. ລອງໃໝ່ອີກຄັ້ງ."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ສັ້ນເກີນໄປ. ຕ້ອງມີຢ່າງໜ້ອຍ 4 ຫຼັກ."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN ບໍ່ຖືກຕ້ອງ. ລອງໃໝ່ໃນອີກ 1 ວິນາທີ."</item> - <item quantity="other" msgid="8030607343223287654">"PIN ບໍ່ຖືກຕ້ອງ. ລອງໃໝ່ໃນອີກ <xliff:g id="COUNT">%d</xliff:g> ວິນາທີ."</item> + <item quantity="one" msgid="311050995198548675">"ລອງໃໝ່ໃນອີກ 1 ວິນາທີ"</item> + <item quantity="other" msgid="4730868920742952817">"ລອງໃໝ່ໃນອີກ <xliff:g id="COUNT">%d</xliff:g> ວິນາທີ"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"ລອງໃໝ່ອີກຄັ້ງໃນພາຍຫລັງ."</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"ປັດຢູ່ຂອບຂອງໜ້າຈໍເພື່ອສະແດງແຖບ"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"ປັດຢູ່ຂອບຂອງໜ້າຈໍເພື່ອສະແດງແຖບຂອງລະບົບ"</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index ca810ae629a8..9fa2070f06a7 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Žr. viską"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pasirinkti veiklą"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Bendrinti su"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Įrenginys užrakintas."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Siunčiama…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Atšaukta"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Klaida rašant turinį"</string> <string name="reason_unknown" msgid="6048913880184628119">"nežinoma"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Įveskite administratoriaus PIN kodą"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Įveskite PIN kodą"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Neteisingas"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Dabartinis PIN kodas"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Naujas PIN kodas"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Patvirtinti naują PIN kodą"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN kodas neatitinka. Bandykite dar kartą."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN kodas per trumpas. Jis turi būti bent 4 skaitmenų."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Netinkamas PIN kodas. Band. po 1 sek."</item> - <item quantity="other" msgid="8030607343223287654">"Netinkamas PIN kodas. Band. po <xliff:g id="COUNT">%d</xliff:g> sek."</item> + <item quantity="one" msgid="311050995198548675">"Band. dar po 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Band. dar po <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Vėliau bandykite dar kartą"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Perbr. ekr. kr., kad atsir. juost."</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Perbraukite iš ekrano krašto, kad atsirastų sistemos juosta"</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 529e76351687..5d81fc7663b1 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Skatīt visu"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Darbības izvēle"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Kopīgošana ar:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Ierīce ir bloķēta."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Notiek sūtīšana…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Atcelts"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Rakstot saturu, radās kļūda."</string> <string name="reason_unknown" msgid="6048913880184628119">"nezināms"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Administratora PIN ievadīšana"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ievadiet PIN."</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Nepareizs"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Pašreizējais PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Jaunais PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Apstipriniet jauno PIN."</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Ievadītie PIN neatbilst. Mēģiniet vēlreiz."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ir pārāk īss. Tam ir jābūt vismaz 4 ciparus garam."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN nav pareizs. Mēģiniet pēc 1 s."</item> - <item quantity="other" msgid="8030607343223287654">"PIN nav pareizs. Mēģiniet pēc <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Mēģ. vēl pēc 1 s"</item> + <item quantity="other" msgid="4730868920742952817">"Mēģ. vēl pēc <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Vēlāk mēģiniet vēlreiz."</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Velciet no malas, lai atvērtu joslu"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Velciet no ekrāna malas, lai atvērtu sistēmas joslu."</string> </resources> diff --git a/core/res/res/values-mcc204-mnc04/config.xml b/core/res/res/values-mcc204-mnc04/config.xml new file mode 100644 index 000000000000..7a483421a975 --- /dev/null +++ b/core/res/res/values-mcc204-mnc04/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + +</resources> diff --git a/core/res/res/values-mcc302-mnc370/config.xml b/core/res/res/values-mcc302-mnc370/config.xml index 3d2ea757ae4a..4fb223292661 100644 --- a/core/res/res/values-mcc302-mnc370/config.xml +++ b/core/res/res/values-mcc302-mnc370/config.xml @@ -36,4 +36,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Fido LTE Tethering,ltedata.apn,,,,,,,,,302,370,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1410</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc610/config.xml b/core/res/res/values-mcc302-mnc610/config.xml index 706570c0bd6b..638aa927fab7 100644 --- a/core/res/res/values-mcc302-mnc610/config.xml +++ b/core/res/res/values-mcc302-mnc610/config.xml @@ -22,4 +22,9 @@ <string-array translatable="false" name="config_operatorConsideredNonRoaming"> <item>302</item> </string-array> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc660/config.xml b/core/res/res/values-mcc302-mnc660/config.xml index 37853cf88f92..76f7968a620e 100644 --- a/core/res/res/values-mcc302-mnc660/config.xml +++ b/core/res/res/values-mcc302-mnc660/config.xml @@ -35,4 +35,9 @@ "name,apn,proxy,port,username,password,server,mmsc,mmsproxy,mmsport,mcc,mnc,auth,type" note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">MTS -Tethering,internet.mts,,,,,,,,,302,660,,DUN</string> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1430</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc720/config.xml b/core/res/res/values-mcc302-mnc720/config.xml index 680f1a38f5d1..4eceffcb5870 100644 --- a/core/res/res/values-mcc302-mnc720/config.xml +++ b/core/res/res/values-mcc302-mnc720/config.xml @@ -36,4 +36,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Rogers LTE Tethering,ltedata.apn,,,,,,,,,302,720,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1430</integer> + </resources> diff --git a/core/res/res/values-mcc302-mnc780/config.xml b/core/res/res/values-mcc302-mnc780/config.xml index b03d14e6b1b6..cd401912745d 100644 --- a/core/res/res/values-mcc302-mnc780/config.xml +++ b/core/res/res/values-mcc302-mnc780/config.xml @@ -41,4 +41,9 @@ <string-array translatable="false" name="config_operatorConsideredNonRoaming"> <item>302</item> </string-array> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1358</integer> + </resources> diff --git a/core/res/res/values-mcc310-mnc120/config.xml b/core/res/res/values-mcc310-mnc120/config.xml new file mode 100644 index 000000000000..62001d904482 --- /dev/null +++ b/core/res/res/values-mcc310-mnc120/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1422</integer> + +</resources> diff --git a/core/res/res/values-mcc310-mnc260/config.xml b/core/res/res/values-mcc310-mnc260/config.xml index 56a5d4effd8d..886ecbe5389c 100644 --- a/core/res/res/values-mcc310-mnc260/config.xml +++ b/core/res/res/values-mcc310-mnc260/config.xml @@ -37,4 +37,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">T-Mobile Tethering,pcweb.tmobile.com,,,,,,,,,310,260,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1440</integer> + </resources> diff --git a/core/res/res/values-mcc310-mnc410/config.xml b/core/res/res/values-mcc310-mnc410/config.xml new file mode 100644 index 000000000000..73aa1cef1a07 --- /dev/null +++ b/core/res/res/values-mcc310-mnc410/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1410</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc20/config.xml b/core/res/res/values-mcc440-mnc20/config.xml new file mode 100644 index 000000000000..ba709fa434dd --- /dev/null +++ b/core/res/res/values-mcc440-mnc20/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1340</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc50/config.xml b/core/res/res/values-mcc440-mnc50/config.xml new file mode 100644 index 000000000000..fa5cba43c3dc --- /dev/null +++ b/core/res/res/values-mcc440-mnc50/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1420</integer> + +</resources> diff --git a/core/res/res/values-mcc440-mnc54/config.xml b/core/res/res/values-mcc440-mnc54/config.xml new file mode 100644 index 000000000000..fa5cba43c3dc --- /dev/null +++ b/core/res/res/values-mcc440-mnc54/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1420</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc05/config.xml b/core/res/res/values-mcc450-mnc05/config.xml new file mode 100644 index 000000000000..d602c9fa634c --- /dev/null +++ b/core/res/res/values-mcc450-mnc05/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1440</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc06/config.xml b/core/res/res/values-mcc450-mnc06/config.xml new file mode 100644 index 000000000000..63f9823914ed --- /dev/null +++ b/core/res/res/values-mcc450-mnc06/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1428</integer> + +</resources> diff --git a/core/res/res/values-mcc450-mnc08/config.xml b/core/res/res/values-mcc450-mnc08/config.xml new file mode 100644 index 000000000000..950c62bd1798 --- /dev/null +++ b/core/res/res/values-mcc450-mnc08/config.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 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 my obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1450</integer> + +</resources> diff --git a/core/res/res/values-mcc505-mnc01/config.xml b/core/res/res/values-mcc505-mnc01/config.xml index f9d9ac7bf050..7331c5009b17 100644 --- a/core/res/res/values-mcc505-mnc01/config.xml +++ b/core/res/res/values-mcc505-mnc01/config.xml @@ -37,4 +37,8 @@ note that empty fields can be ommitted: "name,apn,,,,,,,,,310,260,,DUN" --> <string translatable="false" name="config_tether_apndata">Telstra Tethering,telstra.internet,,,,,,,,,505,01,,DUN</string> + <!-- Configure mobile network MTU. Carrier specific value is set here. + --> + <integer name="config_mobile_mtu">1400</integer> + </resources> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 25a4f1b23a46..3fe78995a39e 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Бүгдийг харах"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Активити сонгох"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Хуваалцах"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Төхөөрөмж түгжигдсэн."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Илгээж байна ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Хөтөч ажиллуулах уу?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Цуцлагдсан"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Контентыг бичих явцад алдаа гарсан"</string> <string name="reason_unknown" msgid="6048913880184628119">"тодорхойгүй"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Админ PIN оруулна уу"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN оруулна уу"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Буруу"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Одоогийн PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Шинэ PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Шинэ PIN-г баталгаажуулах"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN таарахгүй байна. Дахин оролдоно уу."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN хэт богино байна. Хамгийн багадаа 4 цифртэй байх ёстой."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Буруу PIN. 1 секундын дараа дахин оролдоно уу."</item> - <item quantity="other" msgid="8030607343223287654">"Буруу PIN. <xliff:g id="COUNT">%d</xliff:g> секундын дараа дахин оролдоно уу."</item> + <item quantity="one" msgid="311050995198548675">"1 секундын дараа дахин оролдоно уу"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> секундын дараа дахин оролдоно уу"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Дараа дахин оролдоно уу"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Баганыг харуулахын тулд дэлгэцийн ирмэгийг шудрана уу"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Системийн баганыг гаргахын тулд дэлгэцийн ирмэгээс шудрана уу"</string> </resources> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 0088f44298e4..748fc5a80161 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Lihat semua"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pilih aktiviti"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Kongsi dengan"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Peranti dikunci."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Menghantar…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Dibatalkan"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Ralat menulis kandungan"</string> <string name="reason_unknown" msgid="6048913880184628119">"tidak diketahui"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Masukkan PIN pentadbir"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Masukkan PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Salah"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN semasa"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN baharu"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Sahkan PIN baharu"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN tidak sepadan. Cuba lagi."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN terlalu pendek. Mesti sekurang-kurangnya 4 angka."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN salah. Cuba lagi dalam masa 1 saat."</item> - <item quantity="other" msgid="8030607343223287654">"PIN salah. Cuba lagi dalam masa <xliff:g id="COUNT">%d</xliff:g> saat."</item> + <item quantity="one" msgid="311050995198548675">"Cuba lg dlm 1 st"</item> + <item quantity="other" msgid="4730868920742952817">"Cuba lg dlm <xliff:g id="COUNT">%d</xliff:g> st"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Cuba sebentar lagi"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Leret bhg tepi skrin utk serlah bar"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Leret dari tepi skrin untuk menampakkan bar sistem"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index ba81a4614a81..f53f817d0ab9 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -360,8 +360,8 @@ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"Gir innehaveren tillatelse til å bindes til det øverste nivået av grensesnittet for en tilgjengelighetstjeneste. Skal aldri være nødvendig for vanlige apper."</string> <string name="permlab_bindPrintService" msgid="8462815179572748761">"binding til en utskriftstjeneste"</string> <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en utskriftstjeneste. Dette skal ikke være nødvendig for vanlige apper."</string> - <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"binde til en tjeneste for utskriftskø"</string> - <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en tjeneste for utskriftskø. Dette skal ikke være nødvendig for vanlige apper."</string> + <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"binde til en utskriftskøtjeneste"</string> + <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Gir innehaveren tillatelse til å binde til toppnivået av brukergrensesnittet for en utskriftskøtjeneste. Dette skal ikke være nødvendig for vanlige apper."</string> <string name="permlab_bindNfcService" msgid="2752731300419410724">"binding til NFC-tjenesten"</string> <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Tillater eieren å binde seg til apper som emulerer NFC-kort. Skal aldri være nødvendig for vanlige apper."</string> <string name="permlab_bindTextService" msgid="7358378401915287938">"binde til en teksttjeneste"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Se alle"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Velg aktivitet"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Deling med"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Enheten er låst."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Sender …"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kansellert"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Feil under skriving av innhold"</string> <string name="reason_unknown" msgid="6048913880184628119">"ukjent"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Skriv inn administrator-PIN-koden"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Skriv inn PIN-koden"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Feil"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Gjeldende PIN-kode:"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny PIN-kode"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Bekreft ny PIN-kode"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-kodene stemmer ikke overens. Prøv på nytt."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-koden er for kort. Den må bestå av minst fire sifre."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Feil PIN-kode. Prøv på nytt om 1 sekund."</item> - <item quantity="other" msgid="8030607343223287654">"Feil PIN-kode. Prøv på nytt om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> + <item quantity="one" msgid="311050995198548675">"Prøv på nytt om 1 sekund"</item> + <item quantity="other" msgid="4730868920742952817">"Prøv på nytt om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Prøv på nytt senere"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Sveip på kanten av skjermen for å få frem feltet"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sveip fra kanten på skjermen for å få frem systemfeltet"</string> </resources> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index e00d0af7df95..67775da5cef0 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -161,7 +161,7 @@ <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"आवाज बन्द छ"</string> <string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ध्वनि खुल्ला छ"</string> <string name="global_actions_toggle_airplane_mode" msgid="5884330306926307456">"हवाइजहाज मोड"</string> - <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"उडान मोड खुला छ"</string> + <string name="global_actions_airplane_mode_on_status" msgid="2719557982608919750">"हवाइजहाज मोड खुला छ"</string> <string name="global_actions_airplane_mode_off_status" msgid="5075070442854490296">"हवाइजहाज मोड बन्द छ"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string> <string name="safeMode" msgid="2788228061547930246">"सुरक्षित मोड"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"सबै हेर्नुहोस्"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"गतिविधि छनौट गर्नुहोस्"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"साझेदारी गर्नुहोस्..."</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"उपकरण लक छ।"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"पठाउँदै..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउजर सुरु गर्ने हो?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"रद्द गरियो"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"सामाग्री लेखनमा त्रुटि"</string> <string name="reason_unknown" msgid="6048913880184628119">"अज्ञात"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"प्रशासक PIN प्रविष्ट गर्नुहोस्"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN प्रविष्टि गर्नुहोस्"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"गलत"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"वर्तमान PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"नयाँ PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"नयाँ PIN निश्चित गर्नुहोस्"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN हरू मेल खाएनन्। पुनः प्रयास गर्नुहोस्।"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN अति छोटो भयो। कम्तीमा ४ अङ्क हुन आवश्यक छ।"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"गलत PIN । १ सेकेन्डमा पुनः प्रयास गर्नुहोस्।"</item> - <item quantity="other" msgid="8030607343223287654">"गलत PIN । <xliff:g id="COUNT">%d</xliff:g> सेकेन्डमा पुनः प्रयास गर्नुहोस्।"</item> + <item quantity="one" msgid="311050995198548675">"१ सेकेन्ड पछि पुन: प्रयास गर्नुहोला।"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> सेकेन्डमा पुन: प्रयास गर्नुहोस्"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"पछि पुन: प्रयास गर्नुहोस्"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"पट्टि देखिने बनाउन स्क्रिनको छेउमा स्वाइप गर्नुहोस्"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"प्रणाली पट्टि देखिने बनाउन स्क्रिनको छेउबाट स्वाइप गर्नुहोस्"</string> </resources> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 1ae4607757cd..db0c2183600d 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Alles weergeven"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Een activiteit kiezen"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Delen met"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Apparaat vergrendeld."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Verzenden..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Geannuleerd"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Fout bij schrijven van inhoud"</string> <string name="reason_unknown" msgid="6048913880184628119">"onbekend"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Pincode voor beheerder opgeven"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Geef de pincode op"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Onjuist"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Huidige pincode"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nieuwe pincode"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Nieuwe pincode bevestigen"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"De pincodes komen niet overeen. Probeer het opnieuw."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Pincode is te kort. Moet ten minste vier cijfers lang zijn."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Onjuiste pincode. Probeer het over één seconde opnieuw."</item> - <item quantity="other" msgid="8030607343223287654">"Onjuiste pincode. Probeer het over <xliff:g id="COUNT">%d</xliff:g> seconden opnieuw."</item> + <item quantity="one" msgid="311050995198548675">"Probeer het over één seconde opnieuw"</item> + <item quantity="other" msgid="4730868920742952817">"Probeer het over <xliff:g id="COUNT">%d</xliff:g> seconden opnieuw"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Probeer het later opnieuw"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Veeg vanaf de rand voor de balk"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Veeg vanaf de rand van het scherm om de systeembalk weer te geven"</string> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index ade7c405b450..d2cf5b8cc197 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobacz wszystkie"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Wybierz działanie"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Udostępnij przez"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Urządzenie zablokowane."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Wysyłanie..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Anulowane"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Błąd podczas zapisu treści"</string> <string name="reason_unknown" msgid="6048913880184628119">"brak informacji"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Podaj PIN administratora"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Podaj PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Nieprawidłowy"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Bieżący PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nowy PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potwierdź nowy PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Kody PIN nie są identyczne. Spróbuj ponownie."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN jest za krótki. Musi mieć co najmniej 4 cyfry."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Nieprawidłowy PIN. Spróbuj ponownie za 1 s."</item> - <item quantity="other" msgid="8030607343223287654">"Nieprawidłowy PIN. Spróbuj ponownie za <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Spróbuj za sekundę"</item> + <item quantity="other" msgid="4730868920742952817">"Spróbuj za <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Spróbuj ponownie później"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Przesuń palcem od krawędzi ekranu, by odkryć pasek"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Przesuń palcem od krawędzi ekranu, by odkryć pasek systemu"</string> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 810b5b3fd8e1..a21994b6c1fd 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver tudo"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Escolher atividade"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Partilhar com"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Aparelho bloqueado."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"A enviar..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelada"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erro ao escrever conteúdo"</string> <string name="reason_unknown" msgid="6048913880184628119">"desconhecido"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Introduza o PIN de administrador"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introduzir PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorreto"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN Atual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novo PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirme o novo PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não correspondem. Tente novamente."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorreto. Tente novamente em 1 seg."</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorreto. Tente novamente em <xliff:g id="COUNT">%d</xliff:g> seg."</item> + <item quantity="one" msgid="311050995198548675">"Tente em: 1 seg"</item> + <item quantity="other" msgid="4730868920742952817">"Tente em: <xliff:g id="COUNT">%d</xliff:g> seg"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Desliz. da extr. do ecrã p/ revelar barra"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Deslize da extremidade do ecrã para revelar a barra do sistema"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index f457e21911ae..1189c2aa9abc 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Ver tudo"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Selecione a atividade"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Compartilhar com"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispositivo bloqueado."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Cancelado"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Erro ao gravar o conteúdo"</string> <string name="reason_unknown" msgid="6048913880184628119">"desconhecido"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Inserir PIN do administrador"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Insira o PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorreto"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN atual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novo PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirme o novo PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não coincidem. Tente novamente."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é curto demais. Deve ter pelo menos 4 dígitos."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorreto. Tente novamente em 1 segundo."</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorreto. Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos."</item> + <item quantity="one" msgid="311050995198548675">"Tente novamente em 1 segundo"</item> + <item quantity="other" msgid="4730868920742952817">"Tente novamente em <xliff:g id="COUNT">%d</xliff:g> segundos"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Deslize a borda da tela para ver a barra"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Deslize a partir da borda da tela ver a barra do sistema"</string> </resources> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index 74830ef7bc3f..68f0e06f5fc6 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -2337,8 +2337,6 @@ <skip /> <!-- no translation found for share_action_provider_share_with (5247684435979149216) --> <skip /> - <!-- no translation found for status_bar_device_locked (3092703448690669768) --> - <skip /> <!-- no translation found for list_delimeter (3975117572185494152) --> <skip /> <!-- no translation found for sending (3245653681008218030) --> @@ -2578,8 +2576,12 @@ <skip /> <!-- no translation found for reason_unknown (6048913880184628119) --> <skip /> + <!-- no translation found for restr_pin_enter_admin_pin (783643731895143970) --> + <skip /> <!-- no translation found for restr_pin_enter_pin (3395953421368476103) --> <skip /> + <!-- no translation found for restr_pin_incorrect (8571512003955077924) --> + <skip /> <!-- no translation found for restr_pin_enter_old_pin (1462206225512910757) --> <skip /> <!-- no translation found for restr_pin_enter_new_pin (5959606691619959184) --> @@ -2592,8 +2594,10 @@ <skip /> <!-- no translation found for restr_pin_error_too_short (8173982756265777792) --> <skip /> - <!-- no translation found for restr_pin_countdown:one (4835639969503729874) --> - <!-- no translation found for restr_pin_countdown:other (8030607343223287654) --> + <!-- no translation found for restr_pin_countdown:one (311050995198548675) --> + <!-- no translation found for restr_pin_countdown:other (4730868920742952817) --> + <!-- no translation found for restr_pin_try_later (973144472490532377) --> + <skip /> <!-- no translation found for transient_navigation_confirmation (4907844043611123426) --> <skip /> <!-- no translation found for transient_navigation_confirmation_long (8061685920508086697) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 4ab2b432e850..0e7ba3aca53a 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Afişaţi-le pe toate"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Alegeţi activitatea"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Distribuiţi pentru"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Dispozitiv blocat."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Se trimite..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Anulat"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Eroare la scrierea conținutului"</string> <string name="reason_unknown" msgid="6048913880184628119">"necunoscut"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Introduceți codul PIN de administrator"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Introduceți codul PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Incorect"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Codul PIN actual"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Codul PIN nou"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Confirmați noul cod PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Codurile PIN nu se potrivesc. Încercați din nou."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Codul PIN este prea scurt. Trebuie să aibă cel puțin 4 cifre."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN incorect. Reîncercați în 1 sec."</item> - <item quantity="other" msgid="8030607343223287654">"PIN incorect. Reîncercați în <xliff:g id="COUNT">%d</xliff:g> sec."</item> + <item quantity="one" msgid="311050995198548675">"Reîncercați în 1 sec."</item> + <item quantity="other" msgid="4730868920742952817">"Reîncercați în <xliff:g id="COUNT">%d</xliff:g> sec."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Reîncercați mai târziu"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Glisați din margine pentru a afișa"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Glisați dinspre marginea ecranului pentru a afișa bara de sistem"</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 56353817f04b..80e806f93012 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Показать все"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Выберите"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Открыть доступ"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Устройство заблокировано."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Отправка..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Печать отменена"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Ошибка записи"</string> <string name="reason_unknown" msgid="6048913880184628119">"неизвестно"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Введите PIN-код администратора"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Введите PIN-код"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Ошибка"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Текущий PIN-код"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Новый PIN-код"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Введите новый PIN-код ещё раз"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-коды не совпадают. Повторите попытку."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-код должен содержать не менее 4 символов."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Неверный PIN-код. Повторите попытку через 1 сек."</item> - <item quantity="other" msgid="8030607343223287654">"Неверный PIN-код. Повторите попытку через <xliff:g id="COUNT">%d</xliff:g> сек."</item> + <item quantity="one" msgid="311050995198548675">"Повтор через 1 сек."</item> + <item quantity="other" msgid="4730868920742952817">"Повтор через <xliff:g id="COUNT">%d</xliff:g> сек."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Повторите попытку позже."</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Провести от края к центру – открыть панель"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Чтобы открыть панель навигации, проведите пальцем от края к центру экрана"</string> </resources> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 50aa81c60bb3..9b32bd9b178a 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -1452,7 +1452,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"සියල්ල බලන්න"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"ක්රියාකාරකම තෝරන්න"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"සමඟ බෙදාගන්න"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"උපාංගයට අගුළු වැටි ඇත."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"යවමින්..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"බ්රවුසරය දියත් කරන්නද?"</string> @@ -1572,7 +1571,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"අවලංගු කරන ලදි"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"අන්තර්ගතය ලිවීමේදී දෝෂයකි"</string> <string name="reason_unknown" msgid="6048913880184628119">"නොදනී"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"පරිපාලකයාගේ PIN එක ඇතුළ් කරන්න"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN එක ඇතුළු කරන්න"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"වැරදියි"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"වත්මන් PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"නව PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"නව PIN තහවුරු කරන්න"</string> @@ -1580,9 +1581,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN නොගැළපෙයි. නැවත උත්සහ කරන්න."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN කුඩා වැඩිය. ඉලක්කම් 4 වත් විය යුතුය."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"වැරදි PIN. තත්පරයකින් නැවත උත්සහ කරන්න."</item> - <item quantity="other" msgid="8030607343223287654">"වැරදි PIN. තත්පර <xliff:g id="COUNT">%d</xliff:g> කින් නැවත උත්සහ කරන්න."</item> + <item quantity="one" msgid="311050995198548675">"තවත් තත්පර ^1 කින් යළි උත්සාහ කරන්න"</item> + <item quantity="other" msgid="4730868920742952817">"තත්පර <xliff:g id="COUNT">%d</xliff:g> කින් නැවත උත්සහ කරන්න"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"පසුව නැවත උත්සාහ කරන්න"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"තීරුව අනාවරණයට තිරයේ කෙලවර අදින්න"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"පද්ධති තීරුව අනාවරණයට තිරයේ කෙලවරින් අදින්න"</string> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index b4ba202ff146..ea118ce2dd8a 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Zobraziť všetky"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Vybrať aktivitu"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Zdieľať s"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Zariadenie je zamknuté."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Odosielanie..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Zrušené"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Pri zapisovaní obsahu došlo ku chybe"</string> <string name="reason_unknown" msgid="6048913880184628119">"neznáme"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Zadajte kód PIN správcu"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Zadajte kód PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Nesprávny kód"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuálny kód PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Nový kód PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potvrďte nový kód PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Kódy PIN sa nezhodujú. Skúste to znova."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Kód PIN je príliš krátky. Musí mať minimálne 4 číslice."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Nespr. PIN. Skús. o 1 s"</item> - <item quantity="other" msgid="8030607343223287654">"Nespr. PIN. Skús. o <xliff:g id="COUNT">%d</xliff:g> s"</item> + <item quantity="one" msgid="311050995198548675">"Skúste to znova o 1 s."</item> + <item quantity="other" msgid="4730868920742952817">"Skúste to znova o <xliff:g id="COUNT">%d</xliff:g> s."</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Skúste to znova neskôr"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Panel zobraz. prejdením okraja obr."</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Systémový panel zobrazíte posunutím cez okraj obrazovky"</string> </resources> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 3336dab00391..a58e47418e7a 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Pokaži vse"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Izberite dejavnost"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Delite z"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Naprava zaklenjena."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Pošiljanje ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Ali želite odpreti brskalnik?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Preklicano"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Napaka pri pisanju vsebine"</string> <string name="reason_unknown" msgid="6048913880184628119">"neznano"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Vnesite skrbniški PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Vnesite PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Napačno"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Trenutni PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Novi PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Potrdite novi PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Kodi PIN se ne ujemata. Poskusite znova."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN je prekratek. Imeti mora vsaj 4 števke."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Napačen PIN. Poskusite znova čez eno sekundo."</item> - <item quantity="other" msgid="8030607343223287654">"Napačen PIN. Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> s."</item> + <item quantity="one" msgid="311050995198548675">"Poskusite znova čez sekundo"</item> + <item quantity="other" msgid="4730868920742952817">"Poskusite znova čez <xliff:g id="COUNT">%d</xliff:g> s"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Poskusite znova pozneje"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Povlecite z roba za prikaz vrstice"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistemsko vrstico prikažete tako, da povlečete z roba zaslona"</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index d66f18c00942..ce4e284fba1f 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Прикажи све"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Избор активности"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Дели са"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Уређај је закључан."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Слање..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Отказано је"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Грешка при исписивању садржаја"</string> <string name="reason_unknown" msgid="6048913880184628119">"непознато"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Унесите PIN администратора"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Унесите PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Нетачно"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Актуелни PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Нови PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Потврдите нови PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-ови се не подударају. Покушајте поново."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN је прекратак. Мора да садржи најмање 4 цифре."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Нетачан PIN. Покушајте опет за 1 сек."</item> - <item quantity="other" msgid="8030607343223287654">"Нетачан PIN. Покушајте опет за <xliff:g id="COUNT">%d</xliff:g> сек."</item> + <item quantity="one" msgid="311050995198548675">"Покушајте опет за 1 сек"</item> + <item quantity="other" msgid="4730868920742952817">"Покушајте опет за <xliff:g id="COUNT">%d</xliff:g> сек"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Покушајте поново касније"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Превуците по ивици екрана да би се приказала трака"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Превуците од ивице екрана да би се приказала системска трака"</string> </resources> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 00aa419d64f1..2ea2b0a2dccb 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Visa alla"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Välj aktivitet"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Dela med"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Enheten är låst."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Skickar ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vill du öppna webbläsaren?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Inställd"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Det gick inte att skriva innehållet"</string> <string name="reason_unknown" msgid="6048913880184628119">"okänt"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Ange administratörspinkod"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ange pinkod"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Felaktig"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Aktuell pinkod"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Ny pinkod"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Bekräfta din nya pinkod"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Pinkoderna stämmer inte överens. Försök igen."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Pinkoden är för kort. Måste vara minst fyra siffror."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Fel pinkod. Försök igenom en sekund."</item> - <item quantity="other" msgid="8030607343223287654">"Fel pinkod. Försök igenom om <xliff:g id="COUNT">%d</xliff:g> sekunder."</item> + <item quantity="one" msgid="311050995198548675">"Försök igen om en sekund"</item> + <item quantity="other" msgid="4730868920742952817">"Försök igen om <xliff:g id="COUNT">%d</xliff:g> sekunder"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Försök igen senare"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Dra från kanten av skärmen om du vill visa fältet"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Dra från kanten av skärmen om du vill visa systemfältet"</string> </resources> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b7b6506448d1..2d18ed78dc1a 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Angalia zote"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Chagua shughuli"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Shiriki na"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Kifaa kimefungwa."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Inatuma…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Zindua Kivinjari?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Imeghairiwa"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Hitilafu katika kuandika maudhui"</string> <string name="reason_unknown" msgid="6048913880184628119">"haijulikani"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Ingiza PIN ya msimamizi"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ingiza PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Sio sahihi"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ya sasa"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN mpya"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Thibitisha PIN mpya"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN hazilingani. Jaribu tena."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN ni fupi mno. Lazima iwe angalau tarakimu 4."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN sio sahihi. Jaribu tena baada ya sekunde 1."</item> - <item quantity="other" msgid="8030607343223287654">"PIN sio sahihi. Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g>."</item> + <item quantity="one" msgid="311050995198548675">"Jaribu tena baada ya sekunde 1"</item> + <item quantity="other" msgid="4730868920742952817">"Jaribu tena baada ya sekunde <xliff:g id="COUNT">%d</xliff:g>"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Jaribu tena baadaye"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Telezesha kidole kutoka ukingo wa skrini ili kuonyesha upau wa mfumo"</string> </resources> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 376ee26b423d..226b48dfbc9c 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -360,8 +360,8 @@ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"อนุญาตให้เจ้าของเชื่อมโยงกับส่วนติดต่อระดับบนสุดของบริการการเข้าถึง ซึ่งแอปพลิเคชันทั่วไปไม่จำเป็นต้องใช้"</string> <string name="permlab_bindPrintService" msgid="8462815179572748761">"เชื่อมโยงกับบริการการพิมพ์"</string> <string name="permdesc_bindPrintService" msgid="7960067623209111135">"อนุญาตให้ผู้ใช้เชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของบริการการพิมพ์ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string> - <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"เชื่อมโยงกับบริการจัิดคิวและจัดการการพิมพ์"</string> - <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"อนุญาตให้ผู้ใช้เชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของบริการจัดคิวและจัดการการพิมพ์ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string> + <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"เชื่อมโยงกับบริการจัดคิวและจัดการการพิมพ์"</string> + <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"อนุญาตให้เชื่อมโยงกับอินเทอร์เฟซระดับสูงสุดของบริการจัดคิวและจัดการการพิมพ์ ซึ่งแอปทั่วไปไม่จำเป็นต้องใช้"</string> <string name="permlab_bindNfcService" msgid="2752731300419410724">"เชื่อมโยงกับบริการ NFC"</string> <string name="permdesc_bindNfcService" msgid="6120647629174066862">"อนุญาตให้ผู้ถือเชื่อมโยงกับแอปพลิเคชันที่เลียนแบบการ์ด NFC ไม่จำเป็นสำหรับแอปทั่วไป"</string> <string name="permlab_bindTextService" msgid="7358378401915287938">"เชื่อมโยงกับบริการข้อความ"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"ดูทั้งหมด"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"เลือกกิจกรรม"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"แบ่งปันกับ"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"ล็อกอุปกรณ์อยู่"</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"กำลังส่ง…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"ยกเลิก"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"ข้อผิดพลาดในการเขียนเนื้อหา"</string> <string name="reason_unknown" msgid="6048913880184628119">"ไม่ทราบ"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"ป้อน PIN ของผู้ดูแลระบบ"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"ป้อน PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"ไม่ถูกต้อง"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"PIN ปัจจุบัน"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"PIN ใหม่"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"ยืนยัน PIN ใหม่"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN ไม่ตรงกัน โปรดลองอีกครั้ง"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN สั้นเกินไป ต้องมีอย่างน้อย 4 หลัก"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN ไม่ถูกต้อง โปรดลองอีกครั้งในอีก 1 วินาที"</item> - <item quantity="other" msgid="8030607343223287654">"PIN ไม่ถูกต้อง โปรดลองอีกครั้งในอีก <xliff:g id="COUNT">%d</xliff:g> วินาที"</item> + <item quantity="one" msgid="311050995198548675">"ลองอีกใน 1 วิ"</item> + <item quantity="other" msgid="4730868920742952817">"ลองอีกใน <xliff:g id="COUNT">%d</xliff:g> วินาที"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"ลองอีกครั้งในภายหลัง"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"กวาดขอบของหน้าจอเพื่อแสดงแถบ"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"กวาดจากขอบของหน้าจอเพื่อแสดงแถบระบบ"</string> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index b6bca5dfbfdf..36a3ffeb45aa 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -361,7 +361,7 @@ <string name="permlab_bindPrintService" msgid="8462815179572748761">"sumailalim sa isang serbisyo sa pag-print"</string> <string name="permdesc_bindPrintService" msgid="7960067623209111135">"Nagbibigay-daan sa may-ari na sumailalim sa interface sa nangungunang antas ng isang serbisyo sa pag-print. Hindi dapat kailanganin para sa normal na apps kahit kailan."</string> <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"mag-bind sa isang serbisyo ng print spooler"</string> - <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Nagbibigay-daan sa may-ari na mag-bind sa interface sa nangungunang antas ng isang serbisyo ng print spooler. Hindi dapat kailanganin para sa normal na apps."</string> + <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"Nagbibigay-daan sa may-ari na mag-bind sa top-level interface ng isang serbisyo ng print spooler. Hindi dapat kailanganin para sa normal na apps."</string> <string name="permlab_bindNfcService" msgid="2752731300419410724">"i-bind sa serbisyo ng NFC"</string> <string name="permdesc_bindNfcService" msgid="6120647629174066862">"Nagbibigay-daan sa may-ari na mag-bind sa mga application na nag-e-emulate ng mga NFC card. Hindi dapat kailanman kailanganin para sa normal na apps."</string> <string name="permlab_bindTextService" msgid="7358378401915287938">"sumailalim sa serbisyo ng teksto"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tingnan lahat"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Pumili ng aktibidad"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Ibahagi sa"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Naka-lock ang device."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Ipinapadala..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kinansela"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"May error sa pagsusulat ng nilalaman"</string> <string name="reason_unknown" msgid="6048913880184628119">"hindi alam"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Ilagay ang PIN ng administrator"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Ilagay ang PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Mali"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Kasalukuyang PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Bagong PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Kumpirmahin ang bagong PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Hindi nagtutugma ang mga PIN. Subukang muli."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Masyadong maikli ang PIN. Hindi dapat mas maikli sa 4 na digit."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Mali ang PIN. Subukang muli pagkalipas ng 1 segundo."</item> - <item quantity="other" msgid="8030607343223287654">"Mali ang PIN. Subukang muli pagkalipas ng <xliff:g id="COUNT">%d</xliff:g> (na) segundo."</item> + <item quantity="one" msgid="311050995198548675">"Subukan muli sa 1 seg"</item> + <item quantity="other" msgid="4730868920742952817">"Subukan muli sa <xliff:g id="COUNT">%d</xliff:g> seg"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Subukang muli sa ibang pagkakataon"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Mag-swipe sa dulo ng screen upang ipakita ang bar"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Mag-swipe mula sa dulo ng screen upang ipakita ang system bar"</string> </resources> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 44168d261266..8fb697ddf9c1 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Tümünü göster"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Etkinlik seçin"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Şununla paylaş:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Cihaz kilitli."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Gönderiliyor…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"İptal edildi"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"İçerik yazılırken hata oluştu"</string> <string name="reason_unknown" msgid="6048913880184628119">"bilinmiyor"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Yönetici PIN\'ini girin"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"PIN\'i girin"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Yanlış"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Mevcut PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yeni PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yeni PIN\'i doğrulayın"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN\'ler eşleşmiyor. Tekrar deneyin."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN çok kısa. En az 4 basamaklı olmalı."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Yanlış PIN. 1 saniye içinde tekrar deneyin."</item> - <item quantity="other" msgid="8030607343223287654">"Yanlış PIN. <xliff:g id="COUNT">%d</xliff:g> saniye içinde tekrar deneyin."</item> + <item quantity="one" msgid="311050995198548675">"1 saniye içinde tekrar deneyin"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> saniye içinde tekrar deneyin"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Daha sonra tekrar deneyin"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Çubuğu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Sistem çubuğunu görüntülemek için ekranın kenarından hızlıca kaydırın"</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 2dcb546b4f0b..94126293db6b 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Переглянути всі"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Вибрати дію"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Спільний доступ для:"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Пристрій заблоковано."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Надсилання…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Скасовано"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Помилка записування вмісту"</string> <string name="reason_unknown" msgid="6048913880184628119">"невідомо"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Введіть PIN-код адміністратора"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Введіть PIN-код"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Неправильно"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Поточний PIN-код"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Новий PIN-код"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Підтвердьте новий PIN-код"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN-коди не збігаються. Повторіть спробу."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN-код закороткий. Має бути принаймні 4 цифри."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Неправильний PIN. Повторіть через 1 с."</item> - <item quantity="other" msgid="8030607343223287654">"Неправильний PIN. Повторіть через <xliff:g id="COUNT">%d</xliff:g> с."</item> + <item quantity="one" msgid="311050995198548675">"Спробуйте за 1 с"</item> + <item quantity="other" msgid="4730868920742952817">"Спробуйте за <xliff:g id="COUNT">%d</xliff:g> с"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Спробуйте пізніше"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Гортайте від краю, щоб відкрити панель"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Проведіть пальцем від краю екрана, щоб з’явилась навігаційна панель"</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 0f417fee60d6..4e44cc4a7c24 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Xem tất cả"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Chọn hoạt động"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Chia sẻ với"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Thiết bị đã bị khóa."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Đang gửi…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Khởi chạy trình duyệt?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Đã hủy"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Lỗi ghi nội dung"</string> <string name="reason_unknown" msgid="6048913880184628119">"không xác định"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Nhập mã PIN của quản trị viên"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Nhập mã PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Không đúng"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"Mã PIN hiện tại"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Mã PIN mới"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Xác nhận mã PIN mới"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Mã PIN không khớp. Hãy thử lại."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"Mã PIN quá ngắn. Phải có ít nhất 4 chữ số."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"Mã PIN không đúng. Hãy thử lại sau 1 giây nữa."</item> - <item quantity="other" msgid="8030607343223287654">"Mã PIN không đúng. Hãy thử lại sau <xliff:g id="COUNT">%d</xliff:g> giây nữa."</item> + <item quantity="one" msgid="311050995198548675">"Hãy thử lại sau 1 giây"</item> + <item quantity="other" msgid="4730868920742952817">"Hãy thử lại sau <xliff:g id="COUNT">%d</xliff:g> giây"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Hãy thử lại sau"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Vuốt cạnh màn hình để hiện thanh"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Vuốt từ cạnh màn hình để hiển thị thanh hệ thống"</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 3bd2566ec2e6..895952af924d 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -360,8 +360,8 @@ <string name="permdesc_bindAccessibilityService" msgid="7034615928609331368">"允许应用绑定至辅助服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindPrintService" msgid="8462815179572748761">"绑定至打印服务"</string> <string name="permdesc_bindPrintService" msgid="7960067623209111135">"允许应用绑定至打印服务的顶级接口。普通应用绝不需要此权限。"</string> - <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"绑定至打印后台处理程序服务"</string> - <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"允许应用绑定至打印后台处理程序服务的顶级接口。普通应用绝不需要此权限。"</string> + <string name="permlab_bindPrintSpoolerService" msgid="6807762783744125954">"绑定至打印处理服务"</string> + <string name="permdesc_bindPrintSpoolerService" msgid="3680552285933318372">"允许应用绑定至打印处理服务的顶级接口。普通应用绝不需要此权限。"</string> <string name="permlab_bindNfcService" msgid="2752731300419410724">"绑定到 NFC 服务"</string> <string name="permdesc_bindNfcService" msgid="6120647629174066862">"允许应用绑定到模拟 NFC 卡的应用。普通应用绝不需要此权限。"</string> <string name="permlab_bindTextService" msgid="7358378401915287938">"绑定至文字服务"</string> @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"查看全部"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"选择活动"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"分享方式"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"设备已锁定。"</string> <string name="list_delimeter" msgid="3975117572185494152">"、 "</string> <string name="sending" msgid="3245653681008218030">"正在发送..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"写入内容时出错"</string> <string name="reason_unknown" msgid="6048913880184628119">"未知"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"输入管理员 PIN 码"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"输入 PIN 码"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"错误"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"当前 PIN 码"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新 PIN 码"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"确认新 PIN 码"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN 码不符,请重试。"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN 码太短,至少应包含 4 位数字。"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN 码错误。请在1秒钟后重试。"</item> - <item quantity="other" msgid="8030607343223287654">"PIN 码错误。请在<xliff:g id="COUNT">%d</xliff:g>秒钟后重试。"</item> + <item quantity="one" msgid="311050995198548675">"1秒后重试"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g>秒后重试"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"稍后重试"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"从边缘向里滑可显示系统栏"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"从屏幕边缘向里滑可显示系统栏"</string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index c27890fc23bc..7a2298fb8e5d 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"查看全部"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"選擇活動"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"分享活動"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"裝置已鎖定。"</string> <string name="list_delimeter" msgid="3975117572185494152">"、 "</string> <string name="sending" msgid="3245653681008218030">"正在傳送..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"要啟動「瀏覽器」嗎?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"寫入內容時發生錯誤"</string> <string name="reason_unknown" msgid="6048913880184628119">"不明"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"輸入管理員 PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"輸入 PIN 碼"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"不正確"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"目前的 PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新的 PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"確認新的 PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN 碼不符,請再試一次。"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN 碼太短,至少必須為 4 位數。"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN 碼不正確,請於 1 秒內再試一次。"</item> - <item quantity="other" msgid="8030607343223287654">"PIN 碼不正確,請於 <xliff:g id="COUNT">%d</xliff:g> 秒內再試一次。"</item> + <item quantity="one" msgid="311050995198548675">"1 秒後再試一次"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後再試一次"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"從螢幕邊緣快速滑動,即可顯示系統列"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"從螢幕邊緣快速滑動,即可顯示系統列"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 571e01cd3c46..df6da731ec1d 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"全部顯示"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"選擇活動"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"分享活動"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"裝置已鎖定。"</string> <string name="list_delimeter" msgid="3975117572185494152">"、 "</string> <string name="sending" msgid="3245653681008218030">"傳送中…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"啟動「瀏覽器」嗎?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"已取消"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"寫入內容時發生錯誤"</string> <string name="reason_unknown" msgid="6048913880184628119">"不明"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"輸入管理員 PIN"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"輸入 PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"不正確"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"目前的 PIN"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"新 PIN"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"確認新 PIN"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN 不符,請再試一次。"</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN 長度太短,至少必須為 4 位數。"</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"PIN 不正確,請於 1 秒後再試一次。"</item> - <item quantity="other" msgid="8030607343223287654">"PIN 不正確,請於 <xliff:g id="COUNT">%d</xliff:g> 秒後再試一次。"</item> + <item quantity="one" msgid="311050995198548675">"1 秒後再試一次"</item> + <item quantity="other" msgid="4730868920742952817">"<xliff:g id="COUNT">%d</xliff:g> 秒後再試一次"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"稍後再試"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"從螢幕邊緣向內滑動即可顯示導覽列"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"從螢幕邊緣向內滑動即可顯示導覽列"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index c0b5c8686342..dd8a7b96e531 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1449,7 +1449,6 @@ <string name="activity_chooser_view_see_all" msgid="4292569383976636200">"Buka konke"</string> <string name="activity_chooser_view_dialog_title_default" msgid="4710013864974040615">"Khetha okwenziwayo"</string> <string name="share_action_provider_share_with" msgid="5247684435979149216">"Yabelana no"</string> - <string name="status_bar_device_locked" msgid="3092703448690669768">"Idivayisi ivaliwe."</string> <string name="list_delimeter" msgid="3975117572185494152">", "</string> <string name="sending" msgid="3245653681008218030">"Iyathumela..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string> @@ -1569,7 +1568,9 @@ <string name="write_fail_reason_cancelled" msgid="7091258378121627624">"Kukhanseliwe"</string> <string name="write_fail_reason_cannot_write" msgid="8132505417935337724">"Iphutha ekubhaleni okuqukethwe"</string> <string name="reason_unknown" msgid="6048913880184628119">"akwaziwa"</string> + <string name="restr_pin_enter_admin_pin" msgid="783643731895143970">"Faka i-PIN yomlawuli"</string> <string name="restr_pin_enter_pin" msgid="3395953421368476103">"Faka i-PIN"</string> + <string name="restr_pin_incorrect" msgid="8571512003955077924">"Ayilungile"</string> <string name="restr_pin_enter_old_pin" msgid="1462206225512910757">"I-PIN yamanje"</string> <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"I-PIN entsha"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Qinisekisa i-PIN entsha"</string> @@ -1577,9 +1578,10 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Ama-PIN awafani. Zama futhi."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"I-PIN yimfushane kakhulu. Okungenani kumele ibe namadijithi angu-4."</string> <plurals name="restr_pin_countdown"> - <item quantity="one" msgid="4835639969503729874">"I-PIN engalungile. Zama futhi esekhondini elingu-1."</item> - <item quantity="other" msgid="8030607343223287654">"I-PIN engalungile. Zama futhi emasekhondini angu-<xliff:g id="COUNT">%d</xliff:g>."</item> + <item quantity="one" msgid="311050995198548675">"Zama futhi kusekhondi elingu-1"</item> + <item quantity="other" msgid="4730868920742952817">"Zama futhi kumasekhondi angu-<xliff:g id="COUNT">%d</xliff:g>"</item> </plurals> + <string name="restr_pin_try_later" msgid="973144472490532377">"Zama futhi emva kwesikhathi"</string> <string name="transient_navigation_confirmation" msgid="4907844043611123426">"Swayipha emaphethelweni wesikrini ukuze uveze ibha"</string> <string name="transient_navigation_confirmation_long" msgid="8061685920508086697">"Swayipha kusukela emaphethelweni wesikrini ukuze uveze ibha yesistimu"</string> </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index b6a425062f99..a47e518f2d04 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -4511,24 +4511,71 @@ </declare-styleable> <!-- ========================== --> - <!-- State class attributes --> + <!-- Transition attributes --> <!-- ========================== --> <eat-comment /> - <declare-styleable name="Scene"> - <attr name="layout" /> - </declare-styleable> - + <!-- Use specific transition subclass names as the root tag of the XML resource that + describes a {@link android.transition.Transition Transition}, + such as <code>move</code>, <code>fade</code>, and <code>set</code>. --> <declare-styleable name="Transition"> + <!-- Amount of time (in milliseconds) that the transition should run. --> <attr name="duration" /> - <attr name="startOffset" /> + <!-- Delay in milliseconds before the transition starts. --> + <attr name="startDelay" format="integer" /> + <!-- Interpolator to be used in the animations spawned by this transition. --> <attr name="interpolator" /> - <attr name="targetID" format="reference" /> </declare-styleable> + <!-- Use <code>fade</code>as the root tag of the XML resource that + describes a {@link android.transition.Fade Fade} transition. + The attributes of the {@link android.R.styleable#Transition Transition} + resource are available in addition to the specific attributes of Fade + described here. --> + <declare-styleable name="Fade"> + <attr name="fadingMode"> + <!-- Fade will only fade appearing items in. --> + <enum name="fade_in" value="1" /> + <!-- Fade will only fade disappearing items out. --> + <enum name="fade_out" value="2" /> + <!-- Fade will fade appearing items in and disappearing items out. --> + <enum name="fade_in_out" value="3" /> + </attr> + </declare-styleable> + + <!-- Use <code>target</code> as the root tag of the XML resource that + describes a {@link android.transition.Transition#addTargetId(int) + targetId} of a transition. There can be one or more targets inside + a <code>targets</code> tag, which is itself inside an appropriate + {@link android.R.styleable#Transition Transition} tag. + --> + <declare-styleable name="TransitionTarget"> + <!-- The id of a target on which this transition will animate changes. --> + <attr name="targetId" format="reference" /> + </declare-styleable> + + <!-- Use <code>set</code> as the root tag of the XML resource that + describes a {@link android.transition.TransitionSet + TransitionSet} transition. --> + <declare-styleable name="TransitionSet"> + <attr name="transitionOrdering"> + <!-- child transitions should be played together. --> + <enum name="together" value="0" /> + <!-- child transitions should be played sequentially, in the same order + as the xml. --> + <enum name="sequential" value="1" /> + </attr> + </declare-styleable> + + <!-- Use <code>transitionManager</code> as the root tag of the XML resource that + describes a {@link android.transition.TransitionManager + TransitionManager}. --> <declare-styleable name="TransitionManager"> + <!-- The id of a transition to be used in a particular scene change. --> <attr name="transition" format="reference" /> + <!-- The originating scene in this scene change. --> <attr name="fromScene" format="reference" /> + <!-- The destination scene in this scene change. --> <attr name="toScene" format="reference" /> </declare-styleable> diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml index 60ed0e5b515f..05ca12059547 100644 --- a/core/res/res/values/attrs_manifest.xml +++ b/core/res/res/values/attrs_manifest.xml @@ -1718,20 +1718,20 @@ <!-- Attributes that can be supplied in an AndroidManifest.xml <code>screen</code> tag, a child of <code>compatible-screens</code>, - which is itseld a child of the root + which is itself a child of the root {@link #AndroidManifest manifest} tag. --> <declare-styleable name="AndroidManifestCompatibleScreensScreen" parent="AndroidManifest.AndroidManifestCompatibleScreens"> <!-- Specifies a compatible screen size, as per the device configuration screen size bins. --> <attr name="screenSize"> - <!-- A small screen configuration, at least 240x320db. --> + <!-- A small screen configuration, at least 240x320dp. --> <enum name="small" value="200" /> - <!-- A normal screen configuration, at least 320x480db. --> + <!-- A normal screen configuration, at least 320x480dp. --> <enum name="normal" value="300" /> - <!-- A large screen configuration, at least 400x530db. --> + <!-- A large screen configuration, at least 400x530dp. --> <enum name="large" value="400" /> - <!-- An extra large screen configuration, at least 600x800db. --> + <!-- An extra large screen configuration, at least 600x800dp. --> <enum name="xlarge" value="500" /> </attr> <!-- Specifies a compatible screen density, as per the device @@ -1748,6 +1748,19 @@ </attr> </declare-styleable> + <!-- The <code>input-type</code> tag is a child of the <code>supports-input</code> tag, which + is itself a child of the root {@link #AndroidManifest manifest} tag. Each + <code>input-type</code> tag specifices the name of a specific input device type. When + grouped with the other elements of the parent <code>supports-input</code> tag it defines + a collection of input devices, which when all used together, are considered a supported + input mechanism for the application. There may be multiple <code>supports-input</code> + tags defined, each containing a different combination of input device types. --> + <declare-styleable name="AndroidManifestSupportsInputInputType" + parent="AndroidManifest.AndroidManifestSupportsInput"> + <!-- Specifices the name of the input device type --> + <attr name="name" /> + </declare-styleable> + <!-- The attribute that holds a Base64-encoded public key. --> <attr name="publicKey" format="string" /> diff --git a/core/res/res/values/bools.xml b/core/res/res/values/bools.xml index 18e4f2f9b3a8..10a5d851fac3 100644 --- a/core/res/res/values/bools.xml +++ b/core/res/res/values/bools.xml @@ -26,4 +26,5 @@ <bool name="show_ongoing_ime_switcher">true</bool> <bool name="action_bar_expanded_action_views_exclusive">true</bool> <bool name="target_honeycomb_needs_options_menu">true</bool> + <bool name="flip_controller_fallback_keys">false</bool> </resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index dd233c546234..ab95d4006bc0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1097,6 +1097,10 @@ players. --> <integer name="config_safe_media_volume_index">10</integer> + <!-- Configure mobile network MTU. The standard default is set here but each carrier + may have a specific value set in an overlay config.xml file. --> + <integer name="config_mobile_mtu">1500</integer> + <!-- Whether WiFi display is supported by this device. There are many prerequisites for this feature to work correctly. Here are a few of them: diff --git a/core/res/res/values/ids.xml b/core/res/res/values/ids.xml index 21bae040464a..15df295e5784 100644 --- a/core/res/res/values/ids.xml +++ b/core/res/res/values/ids.xml @@ -80,4 +80,5 @@ <item type="id" name="overflow_menu_presenter" /> <item type="id" name="popup_submenu_presenter" /> <item type="id" name="action_bar_spinner" /> + <item type="id" name="current_scene" /> </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index e6702b07ff7c..6c3856ec1e4b 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2059,10 +2059,13 @@ <eat-comment /> <public type="attr" name="keyset" /> - <public type="attr" name="targetID" /> + <public type="attr" name="targetId" /> <public type="attr" name="fromScene" /> <public type="attr" name="toScene" /> <public type="attr" name="transition" /> + <public type="attr" name="transitionOrdering" /> + <public type="attr" name="fadingMode" /> + <public type="attr" name="startDelay" /> <public type="attr" name="ssp" /> <public type="attr" name="sspPrefix" /> <public type="attr" name="sspPattern" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index aa04bf6e9bb8..68acd8c2dcd4 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1911,6 +1911,11 @@ <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_accessNetworkConditions">Allows an application to listen for observations on network conditions. Should never be needed for normal apps.</string> + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_hotwordRecognition">request hotword recognition</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_hotwordRecognition">Allows an application to request for hotword recognition. Should never be needed for normal apps.</string> + <!-- Policy administration --> <!-- Title of policy access to limiting the user's password choices --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 103505461584..39e712744f0b 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -54,6 +54,7 @@ <java-symbol type="id" name="characterPicker" /> <java-symbol type="id" name="clearDefaultHint" /> <java-symbol type="id" name="contentPanel" /> + <java-symbol type="id" name="current_scene" /> <java-symbol type="id" name="customPanel" /> <java-symbol type="id" name="datePicker" /> <java-symbol type="id" name="day" /> @@ -284,6 +285,7 @@ <java-symbol type="bool" name="config_useFixedVolume" /> <java-symbol type="bool" name="config_forceDefaultOrientation" /> <java-symbol type="bool" name="config_wifi_batched_scan_supported" /> + <java-symbol type="bool" name="flip_controller_fallback_keys" /> <java-symbol type="integer" name="config_cursorWindowSize" /> <java-symbol type="integer" name="config_extraFreeKbytesAdjust" /> @@ -310,6 +312,8 @@ <java-symbol type="integer" name="config_lockSoundVolumeDb" /> <java-symbol type="integer" name="config_multiuserMaximumUsers" /> <java-symbol type="integer" name="config_safe_media_volume_index" /> + <java-symbol type="integer" name="config_mobile_mtu" /> + <java-symbol type="color" name="tab_indicator_text_v4" /> <java-symbol type="dimen" name="accessibility_touch_slop" /> diff --git a/core/tests/coretests/src/android/net/LinkPropertiesTest.java b/core/tests/coretests/src/android/net/LinkPropertiesTest.java index a570802d295c..e63f6b08f6e3 100644 --- a/core/tests/coretests/src/android/net/LinkPropertiesTest.java +++ b/core/tests/coretests/src/android/net/LinkPropertiesTest.java @@ -33,6 +33,7 @@ public class LinkPropertiesTest extends TestCase { private static InetAddress GATEWAY1 = NetworkUtils.numericToInetAddress("75.208.8.1"); private static InetAddress GATEWAY2 = NetworkUtils.numericToInetAddress("69.78.8.1"); private static String NAME = "qmi0"; + private static int MTU = 1500; private static LinkAddress LINKADDRV4 = new LinkAddress(ADDRV4, 32); private static LinkAddress LINKADDRV6 = new LinkAddress(ADDRV6, 128); @@ -57,6 +58,9 @@ public class LinkPropertiesTest extends TestCase { assertTrue(source.isIdenticalStackedLinks(target)); assertTrue(target.isIdenticalStackedLinks(source)); + assertTrue(source.isIdenticalMtu(target)); + assertTrue(target.isIdenticalMtu(source)); + // Check result of equals(). assertTrue(source.equals(target)); assertTrue(target.equals(source)); @@ -88,6 +92,7 @@ public class LinkPropertiesTest extends TestCase { // set 2 gateways source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(GATEWAY2)); + source.setMtu(MTU); LinkProperties target = new LinkProperties(); @@ -99,6 +104,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertLinkPropertiesEqual(source, target); @@ -111,6 +117,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -123,6 +130,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -134,6 +142,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS2); target.addRoute(new RouteInfo(GATEWAY1)); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); assertFalse(source.equals(target)); target.clear(); @@ -145,6 +154,19 @@ public class LinkPropertiesTest extends TestCase { // change gateway target.addRoute(new RouteInfo(NetworkUtils.numericToInetAddress("75.208.8.2"))); target.addRoute(new RouteInfo(GATEWAY2)); + target.setMtu(MTU); + assertFalse(source.equals(target)); + + target.clear(); + target.setInterfaceName(NAME); + target.addLinkAddress(LINKADDRV4); + target.addLinkAddress(LINKADDRV6); + target.addDns(DNS1); + target.addDns(DNS2); + target.addRoute(new RouteInfo(GATEWAY1)); + target.addRoute(new RouteInfo(GATEWAY2)); + // change mtu + target.setMtu(1440); assertFalse(source.equals(target)); } catch (Exception e) { @@ -167,6 +189,7 @@ public class LinkPropertiesTest extends TestCase { // set 2 gateways source.addRoute(new RouteInfo(GATEWAY1)); source.addRoute(new RouteInfo(GATEWAY2)); + source.setMtu(MTU); LinkProperties target = new LinkProperties(); // Exchange order @@ -177,6 +200,7 @@ public class LinkPropertiesTest extends TestCase { target.addDns(DNS1); target.addRoute(new RouteInfo(GATEWAY2)); target.addRoute(new RouteInfo(GATEWAY1)); + target.setMtu(MTU); assertLinkPropertiesEqual(source, target); } catch (Exception e) { @@ -363,4 +387,19 @@ public class LinkPropertiesTest extends TestCase { assertFalse(lp.hasIPv4Address()); assertFalse(lp.removeLinkAddress(LINKADDRV4)); } + + @SmallTest + public void testSetLinkAddresses() { + LinkProperties lp = new LinkProperties(); + lp.addLinkAddress(LINKADDRV4); + lp.addLinkAddress(LINKADDRV6); + + LinkProperties lp2 = new LinkProperties(); + lp2.addLinkAddress(LINKADDRV6); + + assertFalse(lp.equals(lp2)); + + lp2.setLinkAddresses(lp.getLinkAddresses()); + assertTrue(lp.equals(lp)); + } } diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk index 7f8d5f003b97..0d9a3860ab40 100644 --- a/data/fonts/Android.mk +++ b/data/fonts/Android.mk @@ -53,22 +53,6 @@ LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts include $(BUILD_PREBUILT) include $(CLEAR_VARS) -LOCAL_MODULE := DroidSansTamil-Regular.ttf -LOCAL_SRC_FILES := $(LOCAL_MODULE) -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts -include $(BUILD_PREBUILT) - -include $(CLEAR_VARS) -LOCAL_MODULE := DroidSansTamil-Bold.ttf -LOCAL_SRC_FILES := $(LOCAL_MODULE) -LOCAL_MODULE_CLASS := ETC -LOCAL_MODULE_TAGS := optional -LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts -include $(BUILD_PREBUILT) - -include $(CLEAR_VARS) LOCAL_MODULE := MTLmr3m.ttf LOCAL_SRC_FILES := $(LOCAL_MODULE) LOCAL_MODULE_CLASS := ETC @@ -81,8 +65,6 @@ extra_font_files := \ DroidSans.ttf \ DroidSans-Bold.ttf \ DroidSansEthiopic-Regular.ttf \ - DroidSansTamil-Regular.ttf \ - DroidSansTamil-Bold.ttf \ MTLmr3m.ttf endif # SMALLER_FONT_FOOTPRINT @@ -153,10 +135,8 @@ font_src_files += \ RobotoCondensed-BoldItalic.ttf \ DroidNaskh-Regular.ttf \ DroidNaskhUI-Regular.ttf \ - DroidSansDevanagari-Regular.ttf \ DroidSansHebrew-Regular.ttf \ DroidSansHebrew-Bold.ttf \ - DroidSansThai.ttf \ DroidSansArmenian.ttf \ DroidSansGeorgian.ttf \ AndroidEmoji.ttf diff --git a/data/fonts/DroidSansDevanagari-Regular.ttf b/data/fonts/DroidSansDevanagari-Regular.ttf Binary files differdeleted file mode 100644 index a25e0e351765..000000000000 --- a/data/fonts/DroidSansDevanagari-Regular.ttf +++ /dev/null diff --git a/data/fonts/DroidSansTamil-Bold.ttf b/data/fonts/DroidSansTamil-Bold.ttf Binary files differdeleted file mode 100644 index 8ad008583d9b..000000000000 --- a/data/fonts/DroidSansTamil-Bold.ttf +++ /dev/null diff --git a/data/fonts/DroidSansTamil-Regular.ttf b/data/fonts/DroidSansTamil-Regular.ttf Binary files differdeleted file mode 100644 index 4b8f5364354e..000000000000 --- a/data/fonts/DroidSansTamil-Regular.ttf +++ /dev/null diff --git a/data/fonts/DroidSansThai.ttf b/data/fonts/DroidSansThai.ttf Binary files differdeleted file mode 100644 index 15b00c258c23..000000000000 --- a/data/fonts/DroidSansThai.ttf +++ /dev/null diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml index d11a3c7fe497..d9170c9e296d 100644 --- a/data/fonts/fallback_fonts.xml +++ b/data/fonts/fallback_fonts.xml @@ -52,7 +52,14 @@ </family> <family> <fileset> - <file>DroidSansThai.ttf</file> + <file variant="elegant">NotoSansThai-Regular.ttf</file> + <file variant="elegant">NotoSansThai-Bold.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file variant="compact">NotoSansThaiUI-Regular.ttf</file> + <file variant="compact">NotoSansThaiUI-Bold.ttf</file> </fileset> </family> <family> @@ -67,13 +74,26 @@ </family> <family> <fileset> - <file>DroidSansDevanagari-Regular.ttf</file> + <file variant="elegant">NotoSansDevanagari-Regular.ttf</file> + <file variant="elegant">NotoSansDevanagari-Bold.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file variant="compact">NotoSansDevanagariUI-Regular.ttf</file> + <file variant="compact">NotoSansDevanagariUI-Bold.ttf</file> </fileset> </family> <family> <fileset> - <file>DroidSansTamil-Regular.ttf</file> - <file>DroidSansTamil-Bold.ttf</file> + <file variant="elegant">NotoSansTamil-Regular.ttf</file> + <file variant="elegant">NotoSansTamil-Bold.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file variant="compact">NotoSansTamilUI-Regular.ttf</file> + <file variant="compact">NotoSansTamilUI-Bold.ttf</file> </fileset> </family> <family> @@ -155,6 +175,11 @@ </family> <family> <fileset> + <file>NotoSansSymbols-Regular.ttf</file> + </fileset> + </family> + <family> + <fileset> <file>AndroidEmoji.ttf</file> </fileset> </family> diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk index 7c2f95573c41..05cca13e08f7 100644 --- a/data/fonts/fonts.mk +++ b/data/fonts/fonts.mk @@ -34,10 +34,8 @@ PRODUCT_PACKAGES := \ RobotoCondensed-BoldItalic.ttf \ DroidNaskh-Regular.ttf \ DroidNaskhUI-Regular.ttf \ - DroidSansDevanagari-Regular.ttf \ DroidSansHebrew-Regular.ttf \ DroidSansHebrew-Bold.ttf \ - DroidSansThai.ttf \ DroidSerif-Regular.ttf \ DroidSerif-Bold.ttf \ DroidSerif-Italic.ttf \ diff --git a/data/keyboards/Android.mk b/data/keyboards/Android.mk index a66a884f6a63..898efe8f2dca 100644 --- a/data/keyboards/Android.mk +++ b/data/keyboards/Android.mk @@ -21,17 +21,21 @@ include $(LOCAL_PATH)/common.mk # Validate all key maps. include $(CLEAR_VARS) -validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX) -files := \ - $(foreach file,$(keylayouts),frameworks/base/data/keyboards/$(file)) \ - $(foreach file,$(keycharmaps),frameworks/base/data/keyboards/$(file)) \ - $(foreach file,$(keyconfigs),frameworks/base/data/keyboards/$(file)) - LOCAL_MODULE := validate_framework_keymaps -LOCAL_MODULE_TAGS := optional -LOCAL_REQUIRED_MODULES := validatekeymaps +intermediates := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE),,COMMON) +LOCAL_BUILT_MODULE := $(intermediates)/stamp -validate_framework_keymaps: $(files) - $(hide) $(validatekeymaps) $(files) - -include $(BUILD_PHONY_PACKAGE) +validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX) +$(LOCAL_BUILT_MODULE): PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps) +$(LOCAL_BUILT_MODULE) : $(framework_keylayouts) $(framework_keycharmaps) $(framework_keyconfigs) | $(validatekeymaps) + $(hide) $(PRIVATE_VALIDATEKEYMAPS) $^ + $(hide) mkdir -p $(dir $@) && touch $@ + +# Run validatekeymaps uncondionally for platform build. +droidcore all_modules : $(LOCAL_BUILT_MODULE) + +# Reset temp vars. +validatekeymaps := +framework_keylayouts := +framework_keycharmaps := +framework_keyconfigs := diff --git a/data/keyboards/Generic.kcm b/data/keyboards/Generic.kcm index 01d22ee69178..695a74f83810 100644 --- a/data/keyboards/Generic.kcm +++ b/data/keyboards/Generic.kcm @@ -477,128 +477,4 @@ key ESCAPE { ctrl: fallback MENU } -### Gamepad buttons ### - -key BUTTON_A { - base: fallback DPAD_CENTER -} - -key BUTTON_B { - base: fallback BACK -} - -key BUTTON_C { - base: fallback DPAD_CENTER -} - -key BUTTON_X { - base: fallback DPAD_CENTER -} - -key BUTTON_Y { - base: fallback BACK -} - -key BUTTON_Z { - base: fallback DPAD_CENTER -} - -key BUTTON_L1 { - base: none -} - -key BUTTON_R1 { - base: none -} - -key BUTTON_L2 { - base: none -} - -key BUTTON_R2 { - base: none -} - -key BUTTON_THUMBL { - base: fallback DPAD_CENTER -} - -key BUTTON_THUMBR { - base: fallback DPAD_CENTER -} - -key BUTTON_START { - base: fallback DPAD_CENTER -} - -key BUTTON_SELECT { - base: fallback MENU -} - -key BUTTON_MODE { - base: fallback MENU -} - -key BUTTON_1 { - base: fallback DPAD_CENTER -} - -key BUTTON_2 { - base: fallback DPAD_CENTER -} - -key BUTTON_3 { - base: fallback DPAD_CENTER -} - -key BUTTON_4 { - base: fallback DPAD_CENTER -} - -key BUTTON_5 { - base: fallback DPAD_CENTER -} - -key BUTTON_6 { - base: fallback DPAD_CENTER -} - -key BUTTON_7 { - base: fallback DPAD_CENTER -} - -key BUTTON_8 { - base: fallback DPAD_CENTER -} - -key BUTTON_9 { - base: fallback DPAD_CENTER -} - -key BUTTON_10 { - base: fallback DPAD_CENTER -} - -key BUTTON_11 { - base: fallback DPAD_CENTER -} - -key BUTTON_12 { - base: fallback DPAD_CENTER -} - -key BUTTON_13 { - base: fallback DPAD_CENTER -} - -key BUTTON_14 { - base: fallback DPAD_CENTER -} - -key BUTTON_15 { - base: fallback DPAD_CENTER -} - -key BUTTON_16 { - base: fallback DPAD_CENTER -} +### Gamepad buttons are handled by the view root ### diff --git a/data/keyboards/common.mk b/data/keyboards/common.mk index 87c2ef54e21f..d75b691bd585 100644 --- a/data/keyboards/common.mk +++ b/data/keyboards/common.mk @@ -15,8 +15,8 @@ # This is the list of framework provided keylayouts and key character maps to include. # Used by Android.mk and keyboards.mk. -keylayouts := $(notdir $(wildcard $(LOCAL_PATH)/*.kl)) +framework_keylayouts := $(wildcard $(LOCAL_PATH)/*.kl) -keycharmaps := $(notdir $(wildcard $(LOCAL_PATH)/*.kcm)) +framework_keycharmaps := $(wildcard $(LOCAL_PATH)/*.kcm) -keyconfigs := $(notdir $(wildcard $(LOCAL_PATH)/*.idc)) +framework_keyconfigs := $(wildcard $(LOCAL_PATH)/*.idc) diff --git a/data/keyboards/keyboards.mk b/data/keyboards/keyboards.mk index c96496195849..68cbd29859bb 100644 --- a/data/keyboards/keyboards.mk +++ b/data/keyboards/keyboards.mk @@ -16,11 +16,11 @@ include $(LOCAL_PATH)/common.mk -PRODUCT_COPY_FILES := $(foreach file,$(keylayouts),\ - frameworks/base/data/keyboards/$(file):system/usr/keylayout/$(file)) +PRODUCT_COPY_FILES := $(foreach file,$(framework_keylayouts),\ + $(file):system/usr/keylayout/$(notdir $(file))) -PRODUCT_COPY_FILES += $(foreach file,$(keycharmaps),\ - frameworks/base/data/keyboards/$(file):system/usr/keychars/$(file)) +PRODUCT_COPY_FILES += $(foreach file,$(framework_keycharmaps),\ + $(file):system/usr/keychars/$(notdir $(file))) -PRODUCT_COPY_FILES += $(foreach file,$(keyconfigs),\ - frameworks/base/data/keyboards/$(file):system/usr/idc/$(file)) +PRODUCT_COPY_FILES += $(foreach file,$(framework_keyconfigs),\ + $(file):system/usr/idc/$(notdir $(file))) diff --git a/data/sounds/AudioPackage10.mk b/data/sounds/AudioPackage10.mk index 90d8eaa5bd00..783e1f871211 100644 --- a/data/sounds/AudioPackage10.mk +++ b/data/sounds/AudioPackage10.mk @@ -20,6 +20,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage11.mk b/data/sounds/AudioPackage11.mk index 2897b0474102..b30be5689fb0 100644 --- a/data/sounds/AudioPackage11.mk +++ b/data/sounds/AudioPackage11.mk @@ -20,6 +20,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120_48k.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120_48k.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120_48k.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120_48k.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120_48k.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord_48k.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click_48k.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage2.mk b/data/sounds/AudioPackage2.mk index 1a36cba6960b..ea07acd94148 100644 --- a/data/sounds/AudioPackage2.mk +++ b/data/sounds/AudioPackage2.mk @@ -31,6 +31,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage3.mk b/data/sounds/AudioPackage3.mk index 146c2e45a60b..a8a3b7604dca 100644 --- a/data/sounds/AudioPackage3.mk +++ b/data/sounds/AudioPackage3.mk @@ -31,6 +31,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage4.mk b/data/sounds/AudioPackage4.mk index 712d7aa15e11..bde3ba0d9d8f 100644 --- a/data/sounds/AudioPackage4.mk +++ b/data/sounds/AudioPackage4.mk @@ -36,6 +36,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage5.mk b/data/sounds/AudioPackage5.mk index 5961f06a57c0..077335b56127 100644 --- a/data/sounds/AudioPackage5.mk +++ b/data/sounds/AudioPackage5.mk @@ -17,6 +17,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage6.mk b/data/sounds/AudioPackage6.mk index d113a29f59bb..2cdd702f8919 100644 --- a/data/sounds/AudioPackage6.mk +++ b/data/sounds/AudioPackage6.mk @@ -16,6 +16,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage7.mk b/data/sounds/AudioPackage7.mk index 6ae624e916d0..e909235d9a24 100644 --- a/data/sounds/AudioPackage7.mk +++ b/data/sounds/AudioPackage7.mk @@ -18,6 +18,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage7alt.mk b/data/sounds/AudioPackage7alt.mk index 11409f2e83de..1132fa951812 100644 --- a/data/sounds/AudioPackage7alt.mk +++ b/data/sounds/AudioPackage7alt.mk @@ -18,6 +18,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage8.mk b/data/sounds/AudioPackage8.mk index 93c43da5d075..49b6154b77a2 100644 --- a/data/sounds/AudioPackage8.mk +++ b/data/sounds/AudioPackage8.mk @@ -20,6 +20,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/AudioPackage9.mk b/data/sounds/AudioPackage9.mk index 73e4fd31d971..87b7764a1743 100644 --- a/data/sounds/AudioPackage9.mk +++ b/data/sounds/AudioPackage9.mk @@ -20,6 +20,7 @@ PRODUCT_COPY_FILES += \ $(LOCAL_PATH)/effects/ogg/KeypressStandard_120.ogg:system/media/audio/ui/KeypressStandard.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressSpacebar_120.ogg:system/media/audio/ui/KeypressSpacebar.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressDelete_120.ogg:system/media/audio/ui/KeypressDelete.ogg \ + $(LOCAL_PATH)/effects/ogg/KeypressInvalid_120.ogg:system/media/audio/ui/KeypressInvalid.ogg \ $(LOCAL_PATH)/effects/ogg/KeypressReturn_120.ogg:system/media/audio/ui/KeypressReturn.ogg \ $(LOCAL_PATH)/effects/ogg/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ $(LOCAL_PATH)/effects/ogg/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ diff --git a/data/sounds/effects/ogg/KeypressInvalid.ogg b/data/sounds/effects/ogg/KeypressInvalid.ogg Binary files differnew file mode 100644 index 000000000000..24935ad2e3ba --- /dev/null +++ b/data/sounds/effects/ogg/KeypressInvalid.ogg diff --git a/data/sounds/effects/ogg/KeypressInvalid_120.ogg b/data/sounds/effects/ogg/KeypressInvalid_120.ogg Binary files differnew file mode 100644 index 000000000000..24935ad2e3ba --- /dev/null +++ b/data/sounds/effects/ogg/KeypressInvalid_120.ogg diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd index 6e4a03c93430..ff194763e71d 100644 --- a/docs/html/about/dashboards/index.jd +++ b/docs/html/about/dashboards/index.jd @@ -30,16 +30,20 @@ you optimize your app.</p> <p>This page provides information about the relative number of devices that share a certain characteristic, such as Android version or screen size. This information may help you prioritize efforts for <a -href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a>.</p> +href="{@docRoot}training/basics/supporting-devices/index.html">supporting different devices</a> +by revealing which devices are active in the Android and Google Play ecosystem.</p> -<p>Each snapshot of data represents all the devices that visited the Google Play Store in the -prior 14 days.</p> +<p>This data reflects devices running the latest Google Play Store app, which is compatible +with Android 2.2 and higher. Each snapshot of data represents all the devices that visited the +Google Play Store in the prior 7 days.</p> -<p class="note"><strong>Note:</strong> Beginning in April, 2013, these charts are now built -using data collected from each device when the user visits the Google Play Store. Previously, the -data was collected when the device simply checked-in to Google servers. We believe the new -data more accurately reflects those users who are most engaged in the Android and Google Play -ecosystem.</p> + +<div class="note"> +<p><strong>Note:</strong> Beginning in September, 2013, devices running versions older than Android +2.2 do not appear in this data because those devices do not support the new Google Play Store +app. Only the new app is able to measure the number of devices that actively visit Google Play Store +and we believe this measurement best reflects your potential user-base.</p> +</div> <h2 id="Platform">Platform Versions</h2> @@ -57,10 +61,15 @@ Platform Versions</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 14-day period ending on August 1, 2013. +<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013. <br/>Any versions with less than 0.1% distribution are not shown.</em> </p> +<p class="note"><strong>Note:</strong> Because this data is gathered from the new Google Play +Store app, which supports Android 2.2 and above, devices running older versions are not included. +However, in August, 2013, versions older than Android 2.2 accounted for about 1% of devices that +<em>checked in</em> to Google servers (not those that actually visited Google Play Store). +</p> @@ -83,7 +92,7 @@ Screens</a>.</p> </div> -<p style="clear:both"><em>Data collected during a 14-day period ending on August 1, 2013 +<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013 <br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p> @@ -130,7 +139,7 @@ uses.</p> -<p style="clear:both"><em>Data collected during a 14-day period ending on August 1, 2013</em></p> +<p style="clear:both"><em>Data collected during a 7-day period ending on September 4, 2013</em></p> @@ -148,32 +157,17 @@ uses.</p> var VERSION_DATA = [ { - "chart": "//chart.googleapis.com/chart?cht=p&chs=500x250&chl=Eclair%7CFroyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean&chf=bg%2Cs%2C00000000&chd=t%3A1.3%2C2.5%2C33.1%2C0.1%2C22.5%2C40.5&chco=c4df9b%2C6fad0c", + "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A2.4%2C30.7%2C0.1%2C21.7%2C45.1&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean", "data": [ { - "api": 4, - "name": "Donut", - "perc": "0.1" - }, - { - "api": 7, - "name": "Eclair", - "perc": "1.2" - }, - { "api": 8, "name": "Froyo", - "perc": "2.5" - }, - { - "api": 9, - "name": "Gingerbread", - "perc": "0.1" + "perc": "2.4" }, { "api": 10, "name": "Gingerbread", - "perc": "33.0" + "perc": "30.7" }, { "api": 13, @@ -183,17 +177,17 @@ var VERSION_DATA = { "api": 15, "name": "Ice Cream Sandwich", - "perc": "22.5" + "perc": "21.7" }, { "api": 16, "name": "Jelly Bean", - "perc": "34.0" + "perc": "36.6" }, { "api": 17, "name": "Jelly Bean", - "perc": "6.5" + "perc": "8.5" } ] } @@ -209,30 +203,29 @@ var SCREEN_DATA = "data": { "Large": { "hdpi": "0.4", - "ldpi": "0.5", - "mdpi": "3.2", - "tvdpi": "1.1", + "ldpi": "0.6", + "mdpi": "3.4", + "tvdpi": "1.2", "xhdpi": "0.5" }, "Normal": { - "hdpi": "34.5", + "hdpi": "33.6", "ldpi": "0.1", - "mdpi": "15.9", - "xhdpi": "23.9", - "xxhdpi": "5.7" + "mdpi": "15.7", + "xhdpi": "23.1", + "xxhdpi": "7.1" }, "Small": { - "hdpi": "0.1", - "ldpi": "9.7" + "ldpi": "9.5" }, "Xlarge": { - "hdpi": "0.2", - "mdpi": "4.1", + "hdpi": "0.3", + "mdpi": "4.4", "xhdpi": "0.1" } }, - "densitychart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A10.3%2C23.2%2C1.1%2C35.2%2C24.5%2C5.7&chco=c4df9b%2C6fad0c", - "layoutchart": "//chart.googleapis.com/chart?cht=p&chs=400x250&chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.4%2C5.7%2C80.2%2C9.8&chco=c4df9b%2C6fad0c" + "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A10.2%2C23.5%2C1.2%2C34.3%2C23.7%2C7.1&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi", + "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chco=c4df9b%2C6fad0c&chd=t%3A4.8%2C6.1%2C79.6%2C9.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall" } ]; @@ -294,6 +287,11 @@ var VERSION_NAMES = "api":17, "link":"<a href='/about/versions/android-4.2.html'>4.2.x</a>", "codename":"Jelly Bean" + }, + { + "api":18, + "link":"<a href='/about/versions/android-4.3.html'>4.3</a>", + "codename":"Jelly Bean" } ]; diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 495bbca716c7..4c7395c7b98f 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -420,7 +420,7 @@ public final class Bitmap implements Parcelable { * It is recommended to use {@link #ARGB_8888} instead of this * configuration. * - * Note: as of {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, + * Note: as of {@link android.os.Build.VERSION_CODES#KITKAT}, * any bitmap created with this configuration will be created * using {@link #ARGB_8888} instead. * @@ -1130,7 +1130,7 @@ public final class Bitmap implements Parcelable { * getPixels() or setPixels(), then the pixels are uniformly treated as * 32bit values, packed according to the Color class. * - * <p>As of {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, this method + * <p>As of {@link android.os.Build.VERSION_CODES#KITKAT}, this method * should not be used to calculate the memory usage of the bitmap. Instead, * see {@link #getAllocationByteCount()}. * @@ -1143,7 +1143,7 @@ public final class Bitmap implements Parcelable { /** * Returns the minimum number of bytes that can be used to store this bitmap's pixels. * - * <p>As of {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, the result of this method can + * <p>As of {@link android.os.Build.VERSION_CODES#KITKAT}, the result of this method can * no longer be used to determine memory usage of a bitmap. See {@link * #getAllocationByteCount()}.</p> */ diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index 8872de0ccdd6..4193dbb32449 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -56,7 +56,7 @@ public class BitmapFactory { * mutable even when decoding a resource which would normally result in * an immutable bitmap.</p> * - * <p>As of {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE}, any + * <p>As of {@link android.os.Build.VERSION_CODES#KITKAT}, any * mutable bitmap can be reused to decode any other bitmaps as long as * the resulting {@link Bitmap#getByteCount() byte count} of the decoded * bitmap is less than or equal to the {@link @@ -64,7 +64,7 @@ public class BitmapFactory { * bitmap. This can be because the intrinsic size is smaller, or its * size post scaling (for density / sample size) is smaller.</p> * - * <p>Prior to {@link android.os.Build.VERSION_CODES#KEY_LIME_PIE} + * <p>Prior to {@link android.os.Build.VERSION_CODES#KITKAT} * additional constraints apply: The image being decoded (whether as a * resource or as a stream) must be in jpeg or png format. Only equal * sized bitmaps are supported, with {@link #inSampleSize} set to 1. diff --git a/graphics/java/android/renderscript/Element.java b/graphics/java/android/renderscript/Element.java index 3838c61d8ed5..68badfa185de 100644 --- a/graphics/java/android/renderscript/Element.java +++ b/graphics/java/android/renderscript/Element.java @@ -725,6 +725,13 @@ public class Element extends BaseObj { return rs.mElement_LONG_4; } + public static Element YUV(RenderScript rs) { + if (rs.mElement_YUV == null) { + rs.mElement_YUV = createPixel(rs, DataType.UNSIGNED_8, DataKind.PIXEL_YUV); + } + return rs.mElement_YUV; + } + public static Element MATRIX_4X4(RenderScript rs) { if(rs.mElement_MATRIX_4X4 == null) { rs.mElement_MATRIX_4X4 = createUser(rs, DataType.MATRIX_4X4); diff --git a/graphics/java/android/renderscript/RenderScript.java b/graphics/java/android/renderscript/RenderScript.java index 854f07928bd0..7d4a5c4d1295 100644 --- a/graphics/java/android/renderscript/RenderScript.java +++ b/graphics/java/android/renderscript/RenderScript.java @@ -898,6 +898,8 @@ public class RenderScript { Element mElement_LONG_3; Element mElement_LONG_4; + Element mElement_YUV; + Element mElement_MATRIX_4X4; Element mElement_MATRIX_3X3; Element mElement_MATRIX_2X2; diff --git a/graphics/java/android/renderscript/ScriptIntrinsicYuvToRGB.java b/graphics/java/android/renderscript/ScriptIntrinsicYuvToRGB.java index 9b5de9be82f1..845625d0b8ea 100644 --- a/graphics/java/android/renderscript/ScriptIntrinsicYuvToRGB.java +++ b/graphics/java/android/renderscript/ScriptIntrinsicYuvToRGB.java @@ -20,9 +20,9 @@ package android.renderscript; /** * Intrinsic for converting an Android YUV buffer to RGB. * - * The input allocation is supplied in NV21 format as a U8 - * element type. The output is RGBA, the alpha channel will be - * set to 255. + * The input allocation should be supplied in a supported YUV format + * as a YUV element Allocation. The output is RGBA; the alpha channel + * will be set to 255. */ public final class ScriptIntrinsicYuvToRGB extends ScriptIntrinsic { private Allocation mInput; diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index 9ea325a49802..8ad973d4fd02 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -34,6 +34,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.List; +import java.util.Locale; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -364,7 +365,8 @@ public final class KeyChain { * "RSA"). */ public static boolean isKeyAlgorithmSupported(String algorithm) { - return "RSA".equals(algorithm); + final String algUpper = algorithm.toUpperCase(Locale.US); + return "DSA".equals(algUpper) || "EC".equals(algUpper) || "RSA".equals(algUpper); } /** @@ -379,7 +381,7 @@ public final class KeyChain { return false; } - return KeyStore.getInstance().isHardwareBacked(); + return KeyStore.getInstance().isHardwareBacked(algorithm); } private static X509Certificate toCertificate(byte[] bytes) { diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 9babb94ef651..6ac49ee7dd88 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -22,6 +22,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; +import java.util.Locale; + /** * @hide This should not be made public in its present form because it * assumes that private and secret key bytes are available and would @@ -306,9 +308,14 @@ public class KeyStore { } } + // TODO remove this when it's removed from Settings public boolean isHardwareBacked() { + return isHardwareBacked("RSA"); + } + + public boolean isHardwareBacked(String keyType) { try { - return mBinder.is_hardware_backed() == NO_ERROR; + return mBinder.is_hardware_backed(keyType.toUpperCase(Locale.US)) == NO_ERROR; } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); return false; diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp index cebfd268bbd2..0d7b37d00df2 100644 --- a/libs/hwui/DisplayList.cpp +++ b/libs/hwui/DisplayList.cpp @@ -358,7 +358,7 @@ void DisplayList::outputViewProperties(const int level) { } if (mAnimationMatrix) { ALOGD("%*sConcatMatrix (animation) %p: " MATRIX_STRING, - level * 2, "", mAnimationMatrix, MATRIX_ARGS(mStaticMatrix)); + level * 2, "", mAnimationMatrix, MATRIX_ARGS(mAnimationMatrix)); } if (mMatrixFlags != 0) { if (mMatrixFlags == TRANSLATION) { diff --git a/location/java/android/location/SettingInjectorService.java b/location/java/android/location/SettingInjectorService.java index 8181f4eaa4f3..9f321f3f8796 100644 --- a/location/java/android/location/SettingInjectorService.java +++ b/location/java/android/location/SettingInjectorService.java @@ -16,9 +16,10 @@ package android.location; -import android.app.IntentService; +import android.app.Service; import android.content.Intent; import android.os.Bundle; +import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; @@ -26,12 +27,12 @@ import android.util.Log; /** * Dynamically specifies the summary (subtitle) and enabled status of a preference injected into - * the list of location services displayed by the system settings app. - * - * The location services list is intended for use only by preferences that affect multiple apps from - * the same developer. Location settings that apply only to one app should be shown within that app, + * the list of app settings displayed by the system settings app + * <p/> + * For use only by apps that are included in the system image, for preferences that affect multiple + * apps. Location settings that apply only to one app should be shown within that app, * rather than in the system settings. - * + * <p/> * To add a preference to the list, a subclass of {@link SettingInjectorService} must be declared in * the manifest as so: * @@ -69,21 +70,17 @@ import android.util.Log; * to the user that it is not part of the system settings.</li> * </ul> * - * To ensure a good user experience, the average time from the start of - * {@link #startService(Intent)} to the end of {@link #onHandleIntent(Intent)} should be less - * than 300 msec even if your app is not already in memory. This means that both your - * {@link android.app.Application#onCreate()} and your {@link #getStatus()} must be fast. If - * either is slow, it can delay the display of settings values for other apps as well. - * + * To ensure a good user experience, your {@link android.app.Application#onCreate()}, + * {@link #onGetSummary()}, and {@link #onGetEnabled()} methods must all be fast. If any are slow, + * it can delay the display of settings values for other apps as well. Note further that all are + * called on your app's UI thread. + * <p/> * For compactness, only one copy of a given setting should be injected. If each account has a - * distinct value for the setting, then the {@link #getStatus()} value should represent a summary of - * the state across all of the accounts and {@code settingsActivity} should display the value for + * distinct value for the setting, then the {@link #onGetSummary()} value should represent a summary + * of the state across all of the accounts and {@code settingsActivity} should display the value for * each account. */ -// TODO: is there a public list of supported locales? -// TODO: is there a public list of guidelines for settings text? -// TODO: would a bound service be better? E.g., we could just disconnect if a service took too long -public abstract class SettingInjectorService extends IntentService { +public abstract class SettingInjectorService extends Service { private static final String TAG = "SettingInjectorService"; @@ -138,100 +135,104 @@ public abstract class SettingInjectorService extends IntentService { /** * Constructor. * - * @param name used to name the worker thread and in log messages + * @param name used to identify your subclass in log messages */ public SettingInjectorService(String name) { - super(name); mName = name; } @Override - final protected void onHandleIntent(Intent intent) { - // Get messenger first to ensure intent doesn't get messed with (in case we later decide - // to pass intent into getStatus()) - Messenger messenger = intent.getParcelableExtra(MESSENGER_KEY); + public final IBinder onBind(Intent intent) { + return null; + } + + @Override + public final void onStart(Intent intent, int startId) { + super.onStart(intent, startId); + } + + @Override + public final int onStartCommand(Intent intent, int flags, int startId) { + onHandleIntent(intent); + stopSelf(startId); + return START_NOT_STICKY; + } + + private void onHandleIntent(Intent intent) { + + String summary; + try { + summary = onGetSummary(); + } catch (RuntimeException e) { + // Exception. Send status anyway, so that settings injector can immediately start + // loading the status of the next setting. + sendStatus(intent, null, true); + throw e; + } - Status status; + boolean enabled; try { - status = getStatus(); + enabled = onGetEnabled(); } catch (RuntimeException e) { - Log.e(TAG, mName + ": error getting status", e); - status = null; + // Exception. Send status anyway, so that settings injector can immediately start + // loading the status of the next setting. + sendStatus(intent, summary, true); + throw e; } - // Send the status back to the caller via the messenger + sendStatus(intent, summary, enabled); + } + + /** + * Send the summary and enabled values back to the caller via the messenger encoded in the + * intent. + */ + private void sendStatus(Intent intent, String summary, boolean enabled) { Message message = Message.obtain(); Bundle bundle = new Bundle(); - if (status != null) { - bundle.putString(SUMMARY_KEY, status.summary); - bundle.putBoolean(ENABLED_KEY, status.enabled); - } + bundle.putString(SUMMARY_KEY, summary); + bundle.putBoolean(ENABLED_KEY, enabled); message.setData(bundle); if (Log.isLoggable(TAG, Log.DEBUG)) { - Log.d(TAG, mName + ": received " + intent + " and " + status - + ", sending message: " + message); + Log.d(TAG, mName + ": received " + intent + ", summary=" + summary + + ", enabled=" + enabled + ", sending message: " + message); } + + Messenger messenger = intent.getParcelableExtra(MESSENGER_KEY); try { messenger.send(message); } catch (RemoteException e) { - Log.e(TAG, mName + ": sending status failed", e); + Log.e(TAG, mName + ": sending dynamic status failed", e); } } /** - * Reads the status of the setting. Should not perform unpredictably-long operations such as - * network access--see the running-time comments in the class-level javadoc. + * Returns the {@link android.preference.Preference#getSummary()} value (allowed to be null or + * empty). Should not perform unpredictably-long operations such as network access--see the + * running-time comments in the class-level javadoc. * - * @return the status of the setting value + * @return the {@link android.preference.Preference#getSummary()} value */ - protected abstract Status getStatus(); + protected abstract String onGetSummary(); /** - * Dynamic characteristics of an injected location setting. + * Returns the {@link android.preference.Preference#isEnabled()} value. Should not perform + * unpredictably-long operations such as network access--see the running-time comments in the + * class-level javadoc. + * <p/> + * Note that to prevent churn in the settings list, there is no support for dynamically choosing + * to hide a setting. Instead you should have this method return false, which will disable the + * setting and its link to your setting activity. One reason why you might choose to do this is + * if {@link android.provider.Settings.Secure#LOCATION_MODE} is {@link + * android.provider.Settings.Secure#LOCATION_MODE_OFF}. + * <p/> + * It is possible that the user may click on the setting before this method returns, so your + * settings activity must handle the case where it is invoked even though the setting is + * disabled. The simplest approach may be to simply call {@link android.app.Activity#finish()} + * when disabled. + * + * @return the {@link android.preference.Preference#isEnabled()} value */ - public static final class Status { - - /** - * The {@link android.preference.Preference#getSummary()} value. - * - * @hide - */ - public final String summary; - - /** - * The {@link android.preference.Preference#isEnabled()} value. - * - * @hide - */ - public final boolean enabled; - - /** - * Constructor. - * <p/> - * Note that to prevent churn in the settings list, there is no support for dynamically - * choosing to hide a setting. Instead you should provide a {@code enabled} value of false, - * which will disable the setting and its link to your setting activity. One reason why you - * might choose to do this is if {@link android.provider.Settings.Secure#LOCATION_MODE} - * is {@link android.provider.Settings.Secure#LOCATION_MODE_OFF}. - * - * It is possible that the user may click on the setting before you return a false value for - * {@code enabled}, so your settings activity must handle the case where it is invoked even - * though the setting is disabled. The simplest approach may be to simply call - * {@link android.app.Activity#finish()} when disabled. - * - * @param summary the {@link android.preference.Preference#getSummary()} value (allowed to - * be null or empty) - * @param enabled the {@link android.preference.Preference#isEnabled()} value - */ - public Status(String summary, boolean enabled) { - this.summary = summary; - this.enabled = enabled; - } - - @Override - public String toString() { - return "Status{summary='" + summary + '\'' + ", enabled=" + enabled + '}'; - } - } + protected abstract boolean onGetEnabled(); } diff --git a/media/java/android/media/AudioTimestamp.java b/media/java/android/media/AudioTimestamp.java new file mode 100644 index 000000000000..965ba859dcbd --- /dev/null +++ b/media/java/android/media/AudioTimestamp.java @@ -0,0 +1,44 @@ +/* + * 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.media; + +/** + * Structure that groups a position in frame units relative to an assumed audio stream, + * together with the estimated time when that frame was presented or is committed to be + * presented. + * In the case of audio output, "present" means that audio produced on device + * is detectable by an external observer off device. + * The time is based on the implementation's best effort, using whatever knowledge + * is available to the system, but cannot account for any delay unknown to the implementation. + * + * @see AudioTrack#getTimestamp + */ +public final class AudioTimestamp +{ + /** + * Position in frames relative to start of an assumed audio stream. + * The low-order 32 bits of position is in wrapping frame units similar to + * {@link AudioTrack#getPlaybackHeadPosition}. + */ + public long framePosition; + + /** + * The estimated time when frame was presented or is committed to be presented, + * in the same units and timebase as {@link java.lang.System#nanoTime}. + */ + public long nanoTime; +} diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index d9227bdaf0a9..788257d5ba51 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -732,6 +732,48 @@ public class AudioTrack return mSessionId; } + /** + * Poll for a timestamp on demand. + * + * Use if you need to get the most recent timestamp outside of the event callback handler. + * Calling this method too often may be inefficient; + * if you need a high-resolution mapping between frame position and presentation time, + * consider implementing that at application level, based on low-resolution timestamps. + * The audio data at the returned position may either already have been + * presented, or may have not yet been presented but is committed to be presented. + * It is not possible to request the time corresponding to a particular position, + * or to request the (fractional) position corresponding to a particular time. + * If you need such features, consider implementing them at application level. + * + * @param timestamp a reference to a non-null AudioTimestamp instance allocated + * and owned by caller, or null. + * @return that same instance if timestamp parameter is non-null and a timestamp is available, + * or a reference to a new AudioTimestamp instance which is now owned by caller + * if timestamp parameter is null and a timestamp is available, + * or null if no timestamp is available. In either successful case, + * the AudioTimestamp instance is filled in with a position in frame units, together + * with the estimated time when that frame was presented or is committed to + * be presented. + * In the case that no timestamp is available, any supplied instance is left unaltered. + */ + public AudioTimestamp getTimestamp(AudioTimestamp timestamp) + { + // It's unfortunate, but we have to either create garbage every time or use synchronized + long[] longArray = new long[2]; + int ret = native_get_timestamp(longArray); + if (ret == SUCCESS) { + if (timestamp == null) { + timestamp = new AudioTimestamp(); + } + timestamp.framePosition = longArray[0]; + timestamp.nanoTime = longArray[1]; + } else { + timestamp = null; + } + return timestamp; + } + + //-------------------------------------------------------------------------- // Initialization / configuration //-------------------- @@ -1321,6 +1363,11 @@ public class AudioTrack private native final int native_get_latency(); + // longArray must be a non-null array of length >= 2 + // [0] is assigned the frame position + // [1] is assigned the time in CLOCK_MONOTONIC nanoseconds + private native final int native_get_timestamp(long[] longArray); + private native final int native_set_loop(int start, int end, int loopCount); static private native final int native_get_output_sample_rate(int streamType); diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index d286be417c9e..ce1896a3b648 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -1351,8 +1351,10 @@ public class MediaPlayer implements SubtitleController.Listener mOnInfoListener = null; mOnVideoSizeChangedListener = null; mOnTimedTextListener = null; - mTimeProvider.close(); - mTimeProvider = null; + if (mTimeProvider != null) { + mTimeProvider.close(); + mTimeProvider = null; + } mOnSubtitleDataListener = null; _release(); } @@ -1380,11 +1382,17 @@ public class MediaPlayer implements SubtitleController.Listener if (mSubtitleController != null) { mSubtitleController.reset(); } + if (mTimeProvider != null) { + mTimeProvider.close(); + mTimeProvider = null; + } stayAwake(false); _reset(); // make sure none of the listeners get called anymore - mEventHandler.removeCallbacksAndMessages(null); + if (mEventHandler != null) { + mEventHandler.removeCallbacksAndMessages(null); + } disableProxyListener(); } @@ -2121,6 +2129,9 @@ public class MediaPlayer implements SubtitleController.Listener /** @hide */ public MediaTimeProvider getMediaTimeProvider() { + if (mTimeProvider == null) { + mTimeProvider = new TimeProvider(this); + } return mTimeProvider; } @@ -2761,6 +2772,7 @@ public class MediaPlayer implements SubtitleController.Listener private static final int REFRESH_AND_NOTIFY_TIME = 1; private static final int NOTIFY_STOP = 2; private static final int NOTIFY_SEEK = 3; + private HandlerThread mHandlerThread; /** @hide */ public boolean DEBUG = false; @@ -2773,7 +2785,18 @@ public class MediaPlayer implements SubtitleController.Listener // we assume starting position mRefresh = true; } - mEventHandler = new EventHandler(); + + Looper looper; + if ((looper = Looper.myLooper()) == null && + (looper = Looper.getMainLooper()) == null) { + // Create our own looper here in case MP was created without one + mHandlerThread = new HandlerThread("MediaPlayerMTPEventThread", + Process.THREAD_PRIORITY_FOREGROUND); + mHandlerThread.start(); + looper = mHandlerThread.getLooper(); + } + mEventHandler = new EventHandler(looper); + mListeners = new MediaTimeProvider.OnMediaTimeListener[0]; mTimes = new long[0]; mLastTimeUs = 0; @@ -2790,6 +2813,17 @@ public class MediaPlayer implements SubtitleController.Listener /** @hide */ public void close() { mEventHandler.removeMessages(NOTIFY); + if (mHandlerThread != null) { + mHandlerThread.quitSafely(); + mHandlerThread = null; + } + } + + /** @hide */ + protected void finalize() { + if (mHandlerThread != null) { + mHandlerThread.quitSafely(); + } } /** @hide */ @@ -3055,6 +3089,10 @@ public class MediaPlayer implements SubtitleController.Listener } private class EventHandler extends Handler { + public EventHandler(Looper looper) { + super(looper); + } + @Override public void handleMessage(Message msg) { if (msg.what == NOTIFY) { @@ -3075,10 +3113,5 @@ public class MediaPlayer implements SubtitleController.Listener } } } - - /** @hide */ - public Handler getHandler() { - return mEventHandler; - } } } diff --git a/packages/DocumentsUI/Android.mk b/packages/DocumentsUI/Android.mk index 79009532f315..2f97809c1818 100644 --- a/packages/DocumentsUI/Android.mk +++ b/packages/DocumentsUI/Android.mk @@ -3,7 +3,7 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4 guava diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index 45e26508494f..4c91bd3fcde8 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -30,11 +30,10 @@ <category android:name="android.intent.category.OPENABLE" /> <data android:mimeType="*/*" /> </intent-filter> - <!-- data expected to point at existing root to manage --> <intent-filter> - <action android:name="android.provider.action.MANAGE_DOCUMENTS" /> + <action android:name="android.provider.action.MANAGE_ROOT" /> <category android:name="android.intent.category.DEFAULT" /> - <data android:mimeType="vnd.android.document/directory" /> + <data android:mimeType="vnd.android.document/root" /> </intent-filter> </activity> diff --git a/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png Binary files differdeleted file mode 100644 index 224cc4ff43a2..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/drawer_shadow.9.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..8a170b04b8e7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png Binary files differnew file mode 100644 index 000000000000..a7726e7da762 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..658a6ddce4f3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png Binary files differnew file mode 100644 index 000000000000..57b3069b24b5 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..40b4326e915a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png Binary files differdeleted file mode 100644 index d02534f1ecaf..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_dir.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png Binary files differnew file mode 100644 index 000000000000..36fccad99c7a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png Binary files differnew file mode 100644 index 000000000000..3aba859ed8d2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png Binary files differnew file mode 100644 index 000000000000..778f9ba2d39e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png Binary files differnew file mode 100644 index 000000000000..65b03d183bde --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png Binary files differnew file mode 100644 index 000000000000..e9719b86ddc1 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png Binary files differnew file mode 100644 index 000000000000..4b2107c4ad70 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png Binary files differnew file mode 100644 index 000000000000..9ca3b359c7f4 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png Binary files differnew file mode 100644 index 000000000000..dc3bebcece5e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png Binary files differnew file mode 100644 index 000000000000..69afe0664ee8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png Binary files differnew file mode 100644 index 000000000000..c86b92d0708b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png Binary files differnew file mode 100644 index 000000000000..9b9729b95007 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png Binary files differnew file mode 100644 index 000000000000..ab917cefa2a5 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png Binary files differnew file mode 100644 index 000000000000..9b96b2f79295 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png Binary files differnew file mode 100644 index 000000000000..89a0d37e61b2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..594ce697884d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..6ee47a9cd9e7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..8797e942c73a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..4b9eeb0eacaa --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..85b60acdc495 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_create_dir.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_create_dir.png Binary files differdeleted file mode 100644 index 6eb31f1cdbbd..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_create_dir.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..3a039e097590 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png Binary files differnew file mode 100644 index 000000000000..164d2de4b94b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_grid.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_grid.png Binary files differdeleted file mode 100644 index d1326e5e3d4b..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_grid.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_list.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_list.png Binary files differdeleted file mode 100644 index e03e3454f08e..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_list.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png Binary files differnew file mode 100644 index 000000000000..06adf31a46ab --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..e8b000ceefe7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png Binary files differindex cc661e3ae1f9..a5ed309adb25 100644 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..240636600964 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..61b709972544 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sort.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sort.png Binary files differdeleted file mode 100644 index 680d4826483a..000000000000 --- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sort.png +++ /dev/null diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..05df3d7baaee --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo.png Binary files differnew file mode 100644 index 000000000000..6ac9dc184581 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png Binary files differnew file mode 100644 index 000000000000..0779f5c5537c --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png Binary files differnew file mode 100644 index 000000000000..ab7e5cb0afc8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_open.png b/packages/DocumentsUI/res/drawable-hdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..17f4a4143d61 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png Binary files differnew file mode 100644 index 000000000000..baf581064eb2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..4ee96b967f99 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png Binary files differnew file mode 100644 index 000000000000..5374e277608e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..caf580300dea --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png Binary files differnew file mode 100644 index 000000000000..cfa69f1cdcdf --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..f5c5f1843d3b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..623d9db50e60 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png Binary files differnew file mode 100644 index 000000000000..11779bbc1da5 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..bebd8030b6da --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png Binary files differnew file mode 100644 index 000000000000..af2412f7a1ae --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..b092ea09558f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png Binary files differnew file mode 100644 index 000000000000..1c6f8d154c9b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png Binary files differnew file mode 100644 index 000000000000..40cdc7672413 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png Binary files differnew file mode 100644 index 000000000000..94339f4d6941 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png Binary files differnew file mode 100644 index 000000000000..a84490c9500f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png Binary files differnew file mode 100644 index 000000000000..f827d6d93c39 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png Binary files differnew file mode 100644 index 000000000000..33f1367f7385 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png Binary files differnew file mode 100644 index 000000000000..65977857318b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png Binary files differnew file mode 100644 index 000000000000..8b1cded3b9f2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png Binary files differnew file mode 100644 index 000000000000..021743058d60 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png Binary files differnew file mode 100644 index 000000000000..ff510968cff1 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png Binary files differnew file mode 100644 index 000000000000..08605521606f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png Binary files differnew file mode 100644 index 000000000000..7431e83d3d9e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png Binary files differnew file mode 100644 index 000000000000..c540a80ce111 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png Binary files differnew file mode 100644 index 000000000000..ab0222a5d4f9 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..99a302695fa7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..b85d70be757f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..d632b585ed90 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..792b269c7c47 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..ea1ea522d76f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..999232133151 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png Binary files differnew file mode 100644 index 000000000000..cb0978234010 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png Binary files differnew file mode 100644 index 000000000000..65dfaa6c3b75 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..a56b7763995f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..4e442403965b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..67f8e4d467dc --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..ecd5a172863d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..549a381c5e80 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo.png Binary files differnew file mode 100644 index 000000000000..43b722013262 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png Binary files differnew file mode 100644 index 000000000000..0e40d89f7c81 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png Binary files differnew file mode 100644 index 000000000000..d0c171747c72 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_open.png b/packages/DocumentsUI/res/drawable-mdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..56cfa49d1d88 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png Binary files differnew file mode 100644 index 000000000000..60ebeef6e886 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..944de5b8f24e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png Binary files differnew file mode 100644 index 000000000000..45f7e0b5553d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..3b065f3acb99 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png Binary files differnew file mode 100644 index 000000000000..fb83d5d744e8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..276f00da8cd6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..9109320fad15 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png Binary files differnew file mode 100644 index 000000000000..89e580b4c811 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..d35b8021ab59 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png Binary files differnew file mode 100644 index 000000000000..254cb18806ea --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..d824bb0a1a42 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png Binary files differnew file mode 100644 index 000000000000..baded5e44060 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png Binary files differnew file mode 100644 index 000000000000..908aafb0b505 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png Binary files differnew file mode 100644 index 000000000000..1c3dee4b1cb2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png Binary files differnew file mode 100644 index 000000000000..a06820956795 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png Binary files differnew file mode 100644 index 000000000000..af0e36da2ffb --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png Binary files differnew file mode 100644 index 000000000000..e6833dc1dce9 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png Binary files differnew file mode 100644 index 000000000000..ff67036ef6da --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png Binary files differnew file mode 100644 index 000000000000..aaca230b951d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png Binary files differnew file mode 100644 index 000000000000..5221393cb6b7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png Binary files differnew file mode 100644 index 000000000000..518e5916027f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png Binary files differnew file mode 100644 index 000000000000..5c4edf6ef033 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png Binary files differnew file mode 100644 index 000000000000..d10dcf7a7e89 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png Binary files differnew file mode 100644 index 000000000000..f15cdfbaedb5 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png Binary files differnew file mode 100644 index 000000000000..f751be7c9bff --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..96acf3560925 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..d21193accd76 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..2655912c2ee0 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..450a486616d3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..946e450eeb0c --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..7ab538f60aad --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png Binary files differnew file mode 100644 index 000000000000..904672a06dce --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png Binary files differnew file mode 100644 index 000000000000..4af42d43f101 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..b63b70cf7160 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..9dd1938fbf59 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..bba370e97154 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..bdd8e20e9669 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..a23bee493bce --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo.png Binary files differnew file mode 100644 index 000000000000..34a0e33330fd --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png Binary files differnew file mode 100644 index 000000000000..c955fc3682ec --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png Binary files differnew file mode 100644 index 000000000000..a23c73aaecce --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..b64d8f1fdceb --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png Binary files differnew file mode 100644 index 000000000000..f66739d73d58 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..4d5564cf9ed8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png Binary files differnew file mode 100644 index 000000000000..7e24377b362b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..0ce9f9ff6a74 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png Binary files differnew file mode 100644 index 000000000000..dde7586a945e --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..7f3364d65d1a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png Binary files differnew file mode 100644 index 000000000000..06681e3c1c35 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png Binary files differnew file mode 100644 index 000000000000..ac88818c154b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png Binary files differnew file mode 100644 index 000000000000..88356c7c03b6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png Binary files differnew file mode 100644 index 000000000000..75658db58dc0 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png Binary files differnew file mode 100644 index 000000000000..887b1b5a3a23 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png Binary files differnew file mode 100644 index 000000000000..4eaf6ce690cc --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png Binary files differnew file mode 100644 index 000000000000..3659f4a2984f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png Binary files differnew file mode 100644 index 000000000000..68e619e6c45d --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png Binary files differnew file mode 100644 index 000000000000..0ec4e8677ab4 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png Binary files differnew file mode 100644 index 000000000000..bf49d787fcc2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png Binary files differnew file mode 100644 index 000000000000..bdd99d698f63 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png Binary files differnew file mode 100644 index 000000000000..77a0faec5c50 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png Binary files differnew file mode 100644 index 000000000000..30d2c4c383c5 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png Binary files differnew file mode 100644 index 000000000000..599196897251 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png Binary files differnew file mode 100644 index 000000000000..dd94ddadbffe --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png Binary files differnew file mode 100644 index 000000000000..c09d6ab855c3 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png Binary files differnew file mode 100644 index 000000000000..2170e666d1fa --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png Binary files differnew file mode 100644 index 000000000000..84960b9a901a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png Binary files differnew file mode 100644 index 000000000000..42d8ec174bef --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png Binary files differnew file mode 100644 index 000000000000..97fd9d6c81d2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png Binary files differnew file mode 100644 index 000000000000..3c9579097fdf --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_drawer_shadow_tablet.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png Binary files differnew file mode 100644 index 000000000000..7bbaf9dc4f7c --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png Binary files differnew file mode 100644 index 000000000000..988c85630ded --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png Binary files differnew file mode 100644 index 000000000000..2a0cfc29f2b2 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png Binary files differnew file mode 100644 index 000000000000..f4dca7f0bea8 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png Binary files differnew file mode 100644 index 000000000000..676d0f76972b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png Binary files differnew file mode 100644 index 000000000000..fb407077bdc4 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png Binary files differnew file mode 100644 index 000000000000..140abba0f8c6 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png Binary files differnew file mode 100644 index 000000000000..6079806c2df0 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png Binary files differnew file mode 100644 index 000000000000..ecd7de143c6f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png Binary files differnew file mode 100644 index 000000000000..0a3ac2e3fe19 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png Binary files differnew file mode 100644 index 000000000000..358f97a24e88 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png Binary files differnew file mode 100644 index 000000000000..fd0a194685c4 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png Binary files differnew file mode 100644 index 000000000000..11ec8da25bbb --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png Binary files differnew file mode 100644 index 000000000000..ed3b0c52518f --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png Binary files differnew file mode 100644 index 000000000000..b467962459bf --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png Binary files differnew file mode 100644 index 000000000000..f22a94a2531a --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png Binary files differnew file mode 100644 index 000000000000..077c851cee28 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png Binary files differnew file mode 100644 index 000000000000..09cac0e9cfe7 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png Binary files differnew file mode 100644 index 000000000000..53492525ff11 --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png Binary files differnew file mode 100644 index 000000000000..6deafc70c1da --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png Binary files differnew file mode 100644 index 000000000000..8710c683666b --- /dev/null +++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow.png diff --git a/packages/ExternalStorageProvider/res/xml/document_provider.xml b/packages/DocumentsUI/res/drawable/item_doc_grid.xml index 929a2734a0f2..3f036f7a21bd 100644 --- a/packages/ExternalStorageProvider/res/xml/document_provider.xml +++ b/packages/DocumentsUI/res/drawable/item_doc_grid.xml @@ -14,9 +14,6 @@ limitations under the License. --> -<documents-provider xmlns:android="http://schemas.android.com/apk/res/android" - android:customRoots="true"> - - <icon android:mimeType="application/pdf" android:icon="@drawable/ic_pdf" /> - <icon android:mimeType="text/*" android:icon="@drawable/ic_pdf" /> -</documents-provider> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/ic_grid_card_background" /> +</selector> diff --git a/packages/DocumentsUI/res/drawable/item_root.xml b/packages/DocumentsUI/res/drawable/item_root.xml new file mode 100644 index 000000000000..183d273ca749 --- /dev/null +++ b/packages/DocumentsUI/res/drawable/item_root.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_pressed="true" android:drawable="@color/item_root_activated" /> + <item android:state_activated="true" android:drawable="@color/item_root_activated" /> + <item android:state_focused="true" android:drawable="@color/item_root_activated" /> + <item android:drawable="@android:color/white" /> +</selector> diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml index 67c5954fd89d..881349bf9eea 100644 --- a/packages/DocumentsUI/res/layout/fragment_directory.xml +++ b/packages/DocumentsUI/res/layout/fragment_directory.xml @@ -38,8 +38,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:listSelector="@android:color/transparent" - android:paddingTop="?android:attr/listPreferredItemPaddingStart" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:visibility="gone" /> <Button diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml index 244214ba5bb5..8d1fc9aa34fd 100644 --- a/packages/DocumentsUI/res/layout/item_doc_grid.xml +++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml @@ -16,110 +16,111 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" - android:layout_height="180dip" - android:paddingBottom="?android:attr/listPreferredItemPaddingEnd" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + android:layout_height="@dimen/grid_height" + android:background="@drawable/item_doc_grid" + android:foreground="@drawable/item_background"> - <FrameLayout + <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/chip" - android:foreground="@drawable/item_background" - android:duplicateParentState="true"> + android:paddingBottom="6dp" + android:orientation="vertical"> - <LinearLayout + <FrameLayout android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingBottom="6dp" - android:orientation="vertical"> + android:layout_height="0dip" + android:layout_weight="1" + android:background="#fff"> <ImageView android:id="@android:id/icon" android:layout_width="match_parent" - android:layout_height="0dip" - android:layout_weight="1" - android:background="#bbb" + android:layout_height="match_parent" android:scaleType="centerInside" android:contentDescription="@null" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:scaleType="fitXY" + android:src="@drawable/ic_grid_gradient_bg" + android:contentDescription="@null" /> + + </FrameLayout> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingTop="6dp" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + <TextView android:id="@android:id/title" - android:layout_width="match_parent" + android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" - android:paddingTop="6dp" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:textAppearance="?android:attr/textAppearanceSmall" + android:textAppearance="?android:attr/textAppearanceMedium" android:textAlignment="viewStart" /> - <LinearLayout - android:id="@+id/summary_grid" - android:layout_width="match_parent" + <ImageView + android:id="@android:id/icon1" + android:layout_width="@dimen/root_icon_size" + android:layout_height="@dimen/root_icon_size" + android:layout_marginStart="8dip" + android:scaleType="centerInside" + android:contentDescription="@null" /> + + </LinearLayout> + + <LinearLayout + android:id="@+id/line2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> + + <TextView + android:id="@+id/date" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> - - <ImageView - android:id="@android:id/icon1" - android:layout_width="24dip" - android:layout_height="24dip" - android:layout_marginEnd="6dip" - android:scaleType="centerInside" - android:contentDescription="@null" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" - android:layout_gravity="center_vertical" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewStart" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - </LinearLayout> - - <LinearLayout - android:layout_width="match_parent" + android:layout_gravity="center_vertical" + android:minWidth="80dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <TextView + android:id="@+id/size" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:orientation="horizontal" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> - - <View - android:layout_width="0dip" - android:layout_height="0dip" - android:layout_weight="1" /> - - <TextView - android:id="@+id/size" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewEnd" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - <TextView - android:id="@+id/date" - android:layout_width="70dp" - android:layout_height="wrap_content" - android:layout_gravity="center_vertical" - android:singleLine="true" - android:ellipsize="marquee" - android:textAlignment="viewEnd" - android:textAppearance="?android:attr/textAppearanceSmall" /> - - </LinearLayout> + android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" + android:minWidth="80dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <TextView + android:id="@android:id/summary" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" + android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" + android:singleLine="true" + android:ellipsize="marquee" + android:textAlignment="viewStart" + android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> - </FrameLayout> + </LinearLayout> </FrameLayout> diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml index 37c588129ec7..8372eedb56d7 100644 --- a/packages/DocumentsUI/res/layout/item_doc_list.xml +++ b/packages/DocumentsUI/res/layout/item_doc_list.xml @@ -27,9 +27,10 @@ <ImageView android:id="@android:id/icon" - android:layout_width="@android:dimen/app_icon_size" - android:layout_height="@android:dimen/app_icon_size" - android:layout_marginEnd="8dip" + android:layout_width="@dimen/icon_size" + android:layout_height="@dimen/icon_size" + android:layout_marginStart="12dp" + android:layout_marginEnd="20dp" android:layout_gravity="center_vertical" android:scaleType="centerInside" android:contentDescription="@null" /> @@ -41,36 +42,43 @@ android:layout_gravity="center_vertical" android:orientation="vertical"> - <TextView - android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:singleLine="true" - android:ellipsize="marquee" - android:textAppearance="?android:attr/textAppearanceMedium" - android:textAlignment="viewStart" /> - <LinearLayout - android:id="@+id/summary_list" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> + <TextView + android:id="@android:id/title" + android:layout_width="0dip" + android:layout_height="wrap_content" + android:layout_weight="1" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceMedium" + android:textAlignment="viewStart" /> + <ImageView android:id="@android:id/icon1" - android:layout_width="24dip" - android:layout_height="24dip" - android:layout_marginEnd="6dip" + android:layout_width="@dimen/root_icon_size" + android:layout_height="@dimen/root_icon_size" + android:layout_marginStart="8dip" android:scaleType="centerInside" android:contentDescription="@null" /> + </LinearLayout> + + <LinearLayout + android:id="@+id/line2" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal"> + <TextView - android:id="@android:id/summary" - android:layout_width="0dp" + android:id="@+id/date" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_weight="1" android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" + android:minWidth="70dp" android:singleLine="true" android:ellipsize="marquee" android:textAlignment="viewStart" @@ -78,23 +86,26 @@ <TextView android:id="@+id/size" - android:layout_width="70dp" + android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" - android:layout_marginEnd="8dp" + android:minWidth="70dp" + android:layout_marginStart="8dp" android:singleLine="true" android:ellipsize="marquee" - android:textAlignment="viewEnd" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView - android:id="@+id/date" - android:layout_width="70dp" + android:id="@android:id/summary" + android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_weight="1" android:layout_gravity="center_vertical" + android:layout_marginStart="8dp" android:singleLine="true" android:ellipsize="marquee" - android:textAlignment="viewEnd" + android:textAlignment="viewStart" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> diff --git a/packages/DocumentsUI/res/layout/item_root.xml b/packages/DocumentsUI/res/layout/item_root.xml index e9cf3aaab730..ce97b5710427 100644 --- a/packages/DocumentsUI/res/layout/item_root.xml +++ b/packages/DocumentsUI/res/layout/item_root.xml @@ -17,17 +17,17 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:minHeight="?android:attr/listPreferredItemHeight" + android:minHeight="?android:attr/listPreferredItemHeightSmall" android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical" - android:orientation="horizontal"> + android:orientation="horizontal" + android:background="@drawable/item_root"> <ImageView android:id="@android:id/icon" - android:layout_width="@android:dimen/app_icon_size" - android:layout_height="@android:dimen/app_icon_size" - android:layout_rowSpan="2" + android:layout_width="@dimen/icon_size" + android:layout_height="@dimen/icon_size" android:layout_marginEnd="8dip" android:scaleType="centerInside" android:contentDescription="@null" /> diff --git a/packages/DocumentsUI/res/layout/item_root_header.xml b/packages/DocumentsUI/res/layout/item_root_header.xml index 2b9a46f32df4..127b2544abbf 100644 --- a/packages/DocumentsUI/res/layout/item_root_header.xml +++ b/packages/DocumentsUI/res/layout/item_root_header.xml @@ -16,14 +16,4 @@ <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:paddingStart="?android:attr/listPreferredItemPaddingStart" - android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" - android:paddingTop="8dp" - android:paddingBottom="8dp" - android:singleLine="true" - android:ellipsize="marquee" - android:textAllCaps="true" - android:textAppearance="?android:attr/textAppearanceSmall" - android:textAlignment="viewStart" /> + style="?android:attr/listSeparatorTextViewStyle" /> diff --git a/packages/DocumentsUI/res/layout/item_title.xml b/packages/DocumentsUI/res/layout/item_title.xml index eab3839586eb..9594e4ea32aa 100644 --- a/packages/DocumentsUI/res/layout/item_title.xml +++ b/packages/DocumentsUI/res/layout/item_title.xml @@ -17,8 +17,20 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="?android:attr/listPreferredItemHeightSmall" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" android:gravity="center_vertical" - android:orientation="vertical"> + android:orientation="horizontal"> + + <ImageView + android:id="@+id/subdir" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleType="centerInside" + android:visibility="gone" + android:src="@drawable/ic_subdirectory_arrow" + android:contentDescription="@null" /> <TextView android:id="@android:id/title" diff --git a/packages/DocumentsUI/res/menu/activity.xml b/packages/DocumentsUI/res/menu/activity.xml index e182159a2ca1..6c37a4e37ffe 100644 --- a/packages/DocumentsUI/res/menu/activity.xml +++ b/packages/DocumentsUI/res/menu/activity.xml @@ -18,7 +18,7 @@ <item android:id="@+id/menu_create_dir" android:title="@string/menu_create_dir" - android:icon="@drawable/ic_menu_create_dir" + android:icon="@drawable/ic_menu_new_folder" android:showAsAction="ifRoom" /> <item android:id="@+id/menu_search" @@ -30,7 +30,7 @@ <item android:id="@+id/menu_sort" android:title="@string/menu_sort" - android:icon="@drawable/ic_menu_sort" + android:icon="@drawable/ic_menu_sortby" android:showAsAction="always"> <menu> <item @@ -47,15 +47,16 @@ <item android:id="@+id/menu_grid" android:title="@string/menu_grid" - android:icon="@drawable/ic_menu_grid" + android:icon="@drawable/ic_menu_view_grid" android:showAsAction="ifRoom" /> <item android:id="@+id/menu_list" android:title="@string/menu_list" - android:icon="@drawable/ic_menu_list" + android:icon="@drawable/ic_menu_view_list" android:showAsAction="ifRoom" /> <item android:id="@+id/menu_settings" android:title="@string/menu_settings" + android:icon="@drawable/ic_menu_settings" android:showAsAction="never" /> </menu> diff --git a/packages/DocumentsUI/res/values-af/strings.xml b/packages/DocumentsUI/res/values-af/strings.xml index ece6673749e4..a2c3023c47f1 100644 --- a/packages/DocumentsUI/res/values-af/strings.xml +++ b/packages/DocumentsUI/res/values-af/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Kan sommige dokumente nie uitvee nie"</string> <string name="more" msgid="7117420986529297171">"Nog"</string> <string name="loading" msgid="7933681260296021180">"Laai tans..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Deel via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-am/strings.xml b/packages/DocumentsUI/res/values-am/strings.xml index 8761a2718e43..1e845b262ce1 100644 --- a/packages/DocumentsUI/res/values-am/strings.xml +++ b/packages/DocumentsUI/res/values-am/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"አንዳንድ ሰነዶችን መሰረዝ አልተቻለም"</string> <string name="more" msgid="7117420986529297171">"ተጨማሪ"</string> <string name="loading" msgid="7933681260296021180">"በመጫን ላይ…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"በሚከተለው በኩል ያጋሩ"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ar/strings.xml b/packages/DocumentsUI/res/values-ar/strings.xml index febc6dcec5a8..279c0e69d620 100644 --- a/packages/DocumentsUI/res/values-ar/strings.xml +++ b/packages/DocumentsUI/res/values-ar/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"تعذر حذف بعض المستندات"</string> <string name="more" msgid="7117420986529297171">"المزيد"</string> <string name="loading" msgid="7933681260296021180">"جارٍ التحميل…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"مشاركة عبر"</string> </resources> diff --git a/packages/DocumentsUI/res/values-az-rAZ/strings.xml b/packages/DocumentsUI/res/values-az-rAZ/strings.xml index a301b6632837..d405fe24418d 100644 --- a/packages/DocumentsUI/res/values-az-rAZ/strings.xml +++ b/packages/DocumentsUI/res/values-az-rAZ/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Bəzi sənədləri silə bilmir"</string> <string name="more" msgid="7117420986529297171">"Daha çox"</string> <string name="loading" msgid="7933681260296021180">"Yüklənir…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Bunun vasitəsilə paylaş:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-bg/strings.xml b/packages/DocumentsUI/res/values-bg/strings.xml index bf399d201299..5ba91074b887 100644 --- a/packages/DocumentsUI/res/values-bg/strings.xml +++ b/packages/DocumentsUI/res/values-bg/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Някои документи не могат да бъдат изтрити"</string> <string name="more" msgid="7117420986529297171">"Още"</string> <string name="loading" msgid="7933681260296021180">"Зарежда се..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Споделяне чрез"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ca/strings.xml b/packages/DocumentsUI/res/values-ca/strings.xml index 22c12fc2da8b..dfaead598380 100644 --- a/packages/DocumentsUI/res/values-ca/strings.xml +++ b/packages/DocumentsUI/res/values-ca/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"No es poden suprimir alguns documents."</string> <string name="more" msgid="7117420986529297171">"Més"</string> <string name="loading" msgid="7933681260296021180">"S\'està carregant…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Comparteix mitjançant"</string> </resources> diff --git a/packages/DocumentsUI/res/values-cs/strings.xml b/packages/DocumentsUI/res/values-cs/strings.xml index 42a5a2bf94d9..053a19a5aee0 100644 --- a/packages/DocumentsUI/res/values-cs/strings.xml +++ b/packages/DocumentsUI/res/values-cs/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Některé dokumenty nelze smazat"</string> <string name="more" msgid="7117420986529297171">"Více"</string> <string name="loading" msgid="7933681260296021180">"Načítání..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Sdílet pomocí"</string> </resources> diff --git a/packages/DocumentsUI/res/values-da/strings.xml b/packages/DocumentsUI/res/values-da/strings.xml index 41b1aac19009..1c533268a860 100644 --- a/packages/DocumentsUI/res/values-da/strings.xml +++ b/packages/DocumentsUI/res/values-da/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nogle dokumenter kan ikke slettes"</string> <string name="more" msgid="7117420986529297171">"Mere"</string> <string name="loading" msgid="7933681260296021180">"Indlæser…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Del via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-de/strings.xml b/packages/DocumentsUI/res/values-de/strings.xml index bd545457992d..3bbb35a25a80 100644 --- a/packages/DocumentsUI/res/values-de/strings.xml +++ b/packages/DocumentsUI/res/values-de/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Einige Dokumente konnten nicht gelöscht werden."</string> <string name="more" msgid="7117420986529297171">"Mehr"</string> <string name="loading" msgid="7933681260296021180">"Wird geladen…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Teilen über"</string> </resources> diff --git a/packages/DocumentsUI/res/values-el/strings.xml b/packages/DocumentsUI/res/values-el/strings.xml index c15eb1f89bc2..a31aa139d3f7 100644 --- a/packages/DocumentsUI/res/values-el/strings.xml +++ b/packages/DocumentsUI/res/values-el/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Δεν είναι δυνατή η διαγραφή ορισμένων εγγράφων"</string> <string name="more" msgid="7117420986529297171">"Περισσότερα"</string> <string name="loading" msgid="7933681260296021180">"Φόρτωση…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Κοινή χρήση μέσω"</string> </resources> diff --git a/packages/DocumentsUI/res/values-en-rGB/strings.xml b/packages/DocumentsUI/res/values-en-rGB/strings.xml index b1693b072796..b8f29269441c 100644 --- a/packages/DocumentsUI/res/values-en-rGB/strings.xml +++ b/packages/DocumentsUI/res/values-en-rGB/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> <string name="more" msgid="7117420986529297171">"More"</string> <string name="loading" msgid="7933681260296021180">"Loading…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Share via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-en-rIN/strings.xml b/packages/DocumentsUI/res/values-en-rIN/strings.xml index b1693b072796..b8f29269441c 100644 --- a/packages/DocumentsUI/res/values-en-rIN/strings.xml +++ b/packages/DocumentsUI/res/values-en-rIN/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Unable to delete some documents"</string> <string name="more" msgid="7117420986529297171">"More"</string> <string name="loading" msgid="7933681260296021180">"Loading…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Share via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-es-rUS/strings.xml b/packages/DocumentsUI/res/values-es-rUS/strings.xml index d556667af048..91b00981509e 100644 --- a/packages/DocumentsUI/res/values-es-rUS/strings.xml +++ b/packages/DocumentsUI/res/values-es-rUS/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos."</string> <string name="more" msgid="7117420986529297171">"Más"</string> <string name="loading" msgid="7933681260296021180">"Cargando…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Compartir mediante"</string> </resources> diff --git a/packages/DocumentsUI/res/values-es/strings.xml b/packages/DocumentsUI/res/values-es/strings.xml index 723a0ec1cc07..099ccad1da59 100644 --- a/packages/DocumentsUI/res/values-es/strings.xml +++ b/packages/DocumentsUI/res/values-es/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"No es posible eliminar algunos documentos"</string> <string name="more" msgid="7117420986529297171">"Más"</string> <string name="loading" msgid="7933681260296021180">"Cargando..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Compartir a través de"</string> </resources> diff --git a/packages/DocumentsUI/res/values-et-rEE/strings.xml b/packages/DocumentsUI/res/values-et-rEE/strings.xml index 7c298de70586..0c21faa91a8c 100644 --- a/packages/DocumentsUI/res/values-et-rEE/strings.xml +++ b/packages/DocumentsUI/res/values-et-rEE/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Mõnda dokumenti ei õnnestu kustutada"</string> <string name="more" msgid="7117420986529297171">"Rohkem"</string> <string name="loading" msgid="7933681260296021180">"Laadimine ..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Jagage teenusega"</string> </resources> diff --git a/packages/DocumentsUI/res/values-fa/strings.xml b/packages/DocumentsUI/res/values-fa/strings.xml index 418a08f1b22a..9961af527074 100644 --- a/packages/DocumentsUI/res/values-fa/strings.xml +++ b/packages/DocumentsUI/res/values-fa/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"برخی از اسناد حذف نمیشوند"</string> <string name="more" msgid="7117420986529297171">"بیشتر"</string> <string name="loading" msgid="7933681260296021180">"در حال بارگیری..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"اشتراکگذاری از طریق"</string> </resources> diff --git a/packages/DocumentsUI/res/values-fi/strings.xml b/packages/DocumentsUI/res/values-fi/strings.xml index 0d9d88351a7a..c5c5eba9e739 100644 --- a/packages/DocumentsUI/res/values-fi/strings.xml +++ b/packages/DocumentsUI/res/values-fi/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Joitakin asiakirjoja ei voi poistaa"</string> <string name="more" msgid="7117420986529297171">"Lisää"</string> <string name="loading" msgid="7933681260296021180">"Ladataan…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Jaa sovelluksessa"</string> </resources> diff --git a/packages/DocumentsUI/res/values-fr-rCA/strings.xml b/packages/DocumentsUI/res/values-fr-rCA/strings.xml index 086b82c5ab51..5bcc3993b262 100644 --- a/packages/DocumentsUI/res/values-fr-rCA/strings.xml +++ b/packages/DocumentsUI/res/values-fr-rCA/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents"</string> <string name="more" msgid="7117420986529297171">"Plus"</string> <string name="loading" msgid="7933681260296021180">"Chargement en cours..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Partager par"</string> </resources> diff --git a/packages/DocumentsUI/res/values-fr/strings.xml b/packages/DocumentsUI/res/values-fr/strings.xml index d70877a1cb65..0b83f02f29ad 100644 --- a/packages/DocumentsUI/res/values-fr/strings.xml +++ b/packages/DocumentsUI/res/values-fr/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossible de supprimer certains documents."</string> <string name="more" msgid="7117420986529297171">"Plus"</string> <string name="loading" msgid="7933681260296021180">"Chargement…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Partager via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-hi/strings.xml b/packages/DocumentsUI/res/values-hi/strings.xml index d45e9bbdd00c..290eff786638 100644 --- a/packages/DocumentsUI/res/values-hi/strings.xml +++ b/packages/DocumentsUI/res/values-hi/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"कुछ दस्तावेज़ों को हटाने में अक्षम"</string> <string name="more" msgid="7117420986529297171">"अधिक"</string> <string name="loading" msgid="7933681260296021180">"लोड हो रहे हैं..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"इसके द्वारा साझा करें"</string> </resources> diff --git a/packages/DocumentsUI/res/values-hr/strings.xml b/packages/DocumentsUI/res/values-hr/strings.xml index 01be5385a296..f47a0f71d164 100644 --- a/packages/DocumentsUI/res/values-hr/strings.xml +++ b/packages/DocumentsUI/res/values-hr/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nije moguće izbrisati neke dokumente"</string> <string name="more" msgid="7117420986529297171">"Više"</string> <string name="loading" msgid="7933681260296021180">"Učitavanje…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Dijeli putem"</string> </resources> diff --git a/packages/DocumentsUI/res/values-hu/strings.xml b/packages/DocumentsUI/res/values-hu/strings.xml index 2648f824a06c..118776015200 100644 --- a/packages/DocumentsUI/res/values-hu/strings.xml +++ b/packages/DocumentsUI/res/values-hu/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Néhány dokumentumot nem lehet törölni"</string> <string name="more" msgid="7117420986529297171">"Továbbiak"</string> <string name="loading" msgid="7933681260296021180">"Betöltés..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Megosztás itt:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-hy-rAM/strings.xml b/packages/DocumentsUI/res/values-hy-rAM/strings.xml index ed026c205be4..38bf8b6c7450 100644 --- a/packages/DocumentsUI/res/values-hy-rAM/strings.xml +++ b/packages/DocumentsUI/res/values-hy-rAM/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Անհնար է ջնջել որոշ փաստաթղթեր"</string> <string name="more" msgid="7117420986529297171">"Ավելին"</string> <string name="loading" msgid="7933681260296021180">"Բեռնում..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Տարածել"</string> </resources> diff --git a/packages/DocumentsUI/res/values-in/strings.xml b/packages/DocumentsUI/res/values-in/strings.xml index a1cefc2d69de..085786979bf7 100644 --- a/packages/DocumentsUI/res/values-in/strings.xml +++ b/packages/DocumentsUI/res/values-in/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat menghapus beberapa dokumen"</string> <string name="more" msgid="7117420986529297171">"Lainnya"</string> <string name="loading" msgid="7933681260296021180">"Memuat..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Bagikan melalui"</string> </resources> diff --git a/packages/DocumentsUI/res/values-it/strings.xml b/packages/DocumentsUI/res/values-it/strings.xml index 6b1bb8b3ad06..9f97c1e26517 100644 --- a/packages/DocumentsUI/res/values-it/strings.xml +++ b/packages/DocumentsUI/res/values-it/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Impossibile eliminare alcuni documenti"</string> <string name="more" msgid="7117420986529297171">"Altro"</string> <string name="loading" msgid="7933681260296021180">"Caricamento..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Condividi via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-iw/strings.xml b/packages/DocumentsUI/res/values-iw/strings.xml index 98bfa87cc9ba..904efb078d20 100644 --- a/packages/DocumentsUI/res/values-iw/strings.xml +++ b/packages/DocumentsUI/res/values-iw/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"לא ניתן למחוק חלק מהמסמכים"</string> <string name="more" msgid="7117420986529297171">"עוד"</string> <string name="loading" msgid="7933681260296021180">"טוען..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"שתף באמצעות"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ja/strings.xml b/packages/DocumentsUI/res/values-ja/strings.xml index 9a83c1f537d2..3e473abb2500 100644 --- a/packages/DocumentsUI/res/values-ja/strings.xml +++ b/packages/DocumentsUI/res/values-ja/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"一部のドキュメントを削除できません"</string> <string name="more" msgid="7117420986529297171">"その他"</string> <string name="loading" msgid="7933681260296021180">"読み込んでいます..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"共有ツール"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ka-rGE/strings.xml b/packages/DocumentsUI/res/values-ka-rGE/strings.xml index 2b9338d326ce..26a83d7e76db 100644 --- a/packages/DocumentsUI/res/values-ka-rGE/strings.xml +++ b/packages/DocumentsUI/res/values-ka-rGE/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"ზოგიერთი დოკუმენტის წაშლა ვერ ხერხდება"</string> <string name="more" msgid="7117420986529297171">"მეტი"</string> <string name="loading" msgid="7933681260296021180">"ჩატვირთვა…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"გაზიარება:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-km-rKH/strings.xml b/packages/DocumentsUI/res/values-km-rKH/strings.xml index 7455ef429131..12a82ba4675a 100644 --- a/packages/DocumentsUI/res/values-km-rKH/strings.xml +++ b/packages/DocumentsUI/res/values-km-rKH/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"មិនអាចលុបឯកសារមួយចំនួន"</string> <string name="more" msgid="7117420986529297171">"ច្រើនទៀត"</string> <string name="loading" msgid="7933681260296021180">"កំពុងផ្ទុក..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"ចែករំលែកតាម"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ko/strings.xml b/packages/DocumentsUI/res/values-ko/strings.xml index b96ae3bea56a..6e90ff752c5d 100644 --- a/packages/DocumentsUI/res/values-ko/strings.xml +++ b/packages/DocumentsUI/res/values-ko/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"일부 문서를 삭제할 수 없음"</string> <string name="more" msgid="7117420986529297171">"더보기"</string> <string name="loading" msgid="7933681260296021180">"로드 중.."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"공유 방법"</string> </resources> diff --git a/packages/DocumentsUI/res/values-lo-rLA/strings.xml b/packages/DocumentsUI/res/values-lo-rLA/strings.xml index 6f889ea08ae6..e80564330fba 100644 --- a/packages/DocumentsUI/res/values-lo-rLA/strings.xml +++ b/packages/DocumentsUI/res/values-lo-rLA/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"ບໍ່ສາມາດລຶບບາງເອກະສານໄດ້"</string> <string name="more" msgid="7117420986529297171">"ເພີ່ມເຕີມ"</string> <string name="loading" msgid="7933681260296021180">"ກຳລັງໂຫລດ..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"ແບ່ງປັນຜ່ານ"</string> </resources> diff --git a/packages/DocumentsUI/res/values-lt/strings.xml b/packages/DocumentsUI/res/values-lt/strings.xml index 6bbc2ce88e9c..a5f94029df96 100644 --- a/packages/DocumentsUI/res/values-lt/strings.xml +++ b/packages/DocumentsUI/res/values-lt/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nepavyko ištrinti kai kurių dokumentų"</string> <string name="more" msgid="7117420986529297171">"Daugiau"</string> <string name="loading" msgid="7933681260296021180">"Įkeliama..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Bendrinti naudojant"</string> </resources> diff --git a/packages/DocumentsUI/res/values-lv/strings.xml b/packages/DocumentsUI/res/values-lv/strings.xml index 425c9a6bbe70..05470e82cbe9 100644 --- a/packages/DocumentsUI/res/values-lv/strings.xml +++ b/packages/DocumentsUI/res/values-lv/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nevar dzēst dažus dokumentus."</string> <string name="more" msgid="7117420986529297171">"Vēl"</string> <string name="loading" msgid="7933681260296021180">"Notiek ielāde..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Kopīgot, izmantojot"</string> </resources> diff --git a/packages/DocumentsUI/res/values-mn-rMN/strings.xml b/packages/DocumentsUI/res/values-mn-rMN/strings.xml index 49b12c9830ad..12cf6e1c7371 100644 --- a/packages/DocumentsUI/res/values-mn-rMN/strings.xml +++ b/packages/DocumentsUI/res/values-mn-rMN/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Зарим документуудыг устгах боломжгүй"</string> <string name="more" msgid="7117420986529297171">"Цааш"</string> <string name="loading" msgid="7933681260296021180">"Ачааллаж байна..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Дараахаар дамжуулан хуваалцах"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ms-rMY/strings.xml b/packages/DocumentsUI/res/values-ms-rMY/strings.xml index f013e7a095cb..ba93dd1a2b9e 100644 --- a/packages/DocumentsUI/res/values-ms-rMY/strings.xml +++ b/packages/DocumentsUI/res/values-ms-rMY/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Tidak dapat memadam beberapa dokumen"</string> <string name="more" msgid="7117420986529297171">"Lagi"</string> <string name="loading" msgid="7933681260296021180">"Memuatkan…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Kongsi melalui"</string> </resources> diff --git a/packages/DocumentsUI/res/values-nb/strings.xml b/packages/DocumentsUI/res/values-nb/strings.xml index fc5d0ce4f791..987b52dace96 100644 --- a/packages/DocumentsUI/res/values-nb/strings.xml +++ b/packages/DocumentsUI/res/values-nb/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Enkelte dokumenter kunne ikke slettes"</string> <string name="more" msgid="7117420986529297171">"Mer"</string> <string name="loading" msgid="7933681260296021180">"Laster inn …"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Del via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ne-rNP/strings.xml b/packages/DocumentsUI/res/values-ne-rNP/strings.xml index c7aac6bff538..6130b58c38ec 100644 --- a/packages/DocumentsUI/res/values-ne-rNP/strings.xml +++ b/packages/DocumentsUI/res/values-ne-rNP/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"केही कागजातहरू मेट्न असमर्थ छ"</string> <string name="more" msgid="7117420986529297171">"थप"</string> <string name="loading" msgid="7933681260296021180">"लोड हुँदै..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"माध्यमबाट साझेदारी गर्नुहोस्"</string> </resources> diff --git a/packages/DocumentsUI/res/values-nl/strings.xml b/packages/DocumentsUI/res/values-nl/strings.xml index 60a61bf8978a..03ba12c412bd 100644 --- a/packages/DocumentsUI/res/values-nl/strings.xml +++ b/packages/DocumentsUI/res/values-nl/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Kan bepaalde documenten niet verwijderen"</string> <string name="more" msgid="7117420986529297171">"Meer"</string> <string name="loading" msgid="7933681260296021180">"Laden..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Delen via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-pl/strings.xml b/packages/DocumentsUI/res/values-pl/strings.xml index 923e7ac29523..8ef3e6fcd6c4 100644 --- a/packages/DocumentsUI/res/values-pl/strings.xml +++ b/packages/DocumentsUI/res/values-pl/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nie można usunąć niektórych dokumentów"</string> <string name="more" msgid="7117420986529297171">"Więcej"</string> <string name="loading" msgid="7933681260296021180">"Wczytywanie…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Udostępnij przez"</string> </resources> diff --git a/packages/DocumentsUI/res/values-pt-rPT/strings.xml b/packages/DocumentsUI/res/values-pt-rPT/strings.xml index 93b3ca978013..7ae43db003e7 100644 --- a/packages/DocumentsUI/res/values-pt-rPT/strings.xml +++ b/packages/DocumentsUI/res/values-pt-rPT/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Não é possível eliminar alguns documentos"</string> <string name="more" msgid="7117420986529297171">"Mais"</string> <string name="loading" msgid="7933681260296021180">"A carregar…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Partilhar através de"</string> </resources> diff --git a/packages/DocumentsUI/res/values-pt/strings.xml b/packages/DocumentsUI/res/values-pt/strings.xml index 79dc36eddb6d..d07f78f16a12 100644 --- a/packages/DocumentsUI/res/values-pt/strings.xml +++ b/packages/DocumentsUI/res/values-pt/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Não foi possível excluir alguns documentos"</string> <string name="more" msgid="7117420986529297171">"Mais"</string> <string name="loading" msgid="7933681260296021180">"Carregando…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Compartilhar via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ro/strings.xml b/packages/DocumentsUI/res/values-ro/strings.xml index 01fc980958e4..06ab5ff2498a 100644 --- a/packages/DocumentsUI/res/values-ro/strings.xml +++ b/packages/DocumentsUI/res/values-ro/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Unele documente nu au putut fi șterse"</string> <string name="more" msgid="7117420986529297171">"Mai multe"</string> <string name="loading" msgid="7933681260296021180">"Se încarcă…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Distribuiţi prin"</string> </resources> diff --git a/packages/DocumentsUI/res/values-ru/strings.xml b/packages/DocumentsUI/res/values-ru/strings.xml index 587a057e9e5b..3b9c3f3b3632 100644 --- a/packages/DocumentsUI/res/values-ru/strings.xml +++ b/packages/DocumentsUI/res/values-ru/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Не удалось удалить некоторые документы"</string> <string name="more" msgid="7117420986529297171">"Ещё"</string> <string name="loading" msgid="7933681260296021180">"Загрузка…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Способ отправки"</string> </resources> diff --git a/packages/DocumentsUI/res/values-si-rLK/strings.xml b/packages/DocumentsUI/res/values-si-rLK/strings.xml index fefa4dde959a..9b1fb9bc2dc3 100644 --- a/packages/DocumentsUI/res/values-si-rLK/strings.xml +++ b/packages/DocumentsUI/res/values-si-rLK/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"සමහර ලේඛන මැකීමට නොහැකි විය"</string> <string name="more" msgid="7117420986529297171">"තව"</string> <string name="loading" msgid="7933681260296021180">"පූරණය වෙමින්..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"හරහා බෙදාගන්න"</string> </resources> diff --git a/packages/DocumentsUI/res/values-sk/strings.xml b/packages/DocumentsUI/res/values-sk/strings.xml index 2b073dbcd25b..a4850c1248d2 100644 --- a/packages/DocumentsUI/res/values-sk/strings.xml +++ b/packages/DocumentsUI/res/values-sk/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Niektoré dokumenty sa nepodarilo odstrániť"</string> <string name="more" msgid="7117420986529297171">"Viac"</string> <string name="loading" msgid="7933681260296021180">"Prebieha načítavanie..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Zdieľať pomocou"</string> </resources> diff --git a/packages/DocumentsUI/res/values-sl/strings.xml b/packages/DocumentsUI/res/values-sl/strings.xml index b5ee9083bb4c..c1cfbd91f07b 100644 --- a/packages/DocumentsUI/res/values-sl/strings.xml +++ b/packages/DocumentsUI/res/values-sl/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Nekaterih dokumentov ni mogoče izbrisati"</string> <string name="more" msgid="7117420986529297171">"Več"</string> <string name="loading" msgid="7933681260296021180">"Nalaganje …"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Deli z drugimi prek"</string> </resources> diff --git a/packages/DocumentsUI/res/values-sr/strings.xml b/packages/DocumentsUI/res/values-sr/strings.xml index 3310f3e4967e..eaec4e5fb143 100644 --- a/packages/DocumentsUI/res/values-sr/strings.xml +++ b/packages/DocumentsUI/res/values-sr/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Није могуће избрисати неке документе"</string> <string name="more" msgid="7117420986529297171">"Још"</string> <string name="loading" msgid="7933681260296021180">"Учитавање…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Дељење преко"</string> </resources> diff --git a/packages/DocumentsUI/res/values-sv/strings.xml b/packages/DocumentsUI/res/values-sv/strings.xml index 55f3f5479422..6d93d4dbb340 100644 --- a/packages/DocumentsUI/res/values-sv/strings.xml +++ b/packages/DocumentsUI/res/values-sv/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Det gick inte att ta bort vissa dokument"</string> <string name="more" msgid="7117420986529297171">"Mer"</string> <string name="loading" msgid="7933681260296021180">"Läser in …"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Dela via"</string> </resources> diff --git a/packages/DocumentsUI/res/values-sw/strings.xml b/packages/DocumentsUI/res/values-sw/strings.xml index b6e128f6f15d..915f851e24dc 100644 --- a/packages/DocumentsUI/res/values-sw/strings.xml +++ b/packages/DocumentsUI/res/values-sw/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Imeshindwa kufuta baadhi ya hati"</string> <string name="more" msgid="7117420986529297171">"Zaidi"</string> <string name="loading" msgid="7933681260296021180">"Inapakia…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Shiriki kupitia"</string> </resources> diff --git a/packages/DocumentsUI/res/values-th/strings.xml b/packages/DocumentsUI/res/values-th/strings.xml index 08dc27b7e0cc..b1603f0d44b8 100644 --- a/packages/DocumentsUI/res/values-th/strings.xml +++ b/packages/DocumentsUI/res/values-th/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"ไม่สามารถลบเอกสารบางรายการ"</string> <string name="more" msgid="7117420986529297171">"เพิ่มเติม"</string> <string name="loading" msgid="7933681260296021180">"กำลังโหลด..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"แชร์ผ่าน"</string> </resources> diff --git a/packages/DocumentsUI/res/values-tl/strings.xml b/packages/DocumentsUI/res/values-tl/strings.xml index 57e63801fcb0..d47be6f11240 100644 --- a/packages/DocumentsUI/res/values-tl/strings.xml +++ b/packages/DocumentsUI/res/values-tl/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Hindi matanggal ang ilang dokumento"</string> <string name="more" msgid="7117420986529297171">"Higit pa"</string> <string name="loading" msgid="7933681260296021180">"Naglo-load…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Ibahagi sa pamamagitan ng"</string> </resources> diff --git a/packages/DocumentsUI/res/values-tr/strings.xml b/packages/DocumentsUI/res/values-tr/strings.xml index 0c87107dc16b..46688bd75499 100644 --- a/packages/DocumentsUI/res/values-tr/strings.xml +++ b/packages/DocumentsUI/res/values-tr/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Bazı dokümanlar silinemiyor"</string> <string name="more" msgid="7117420986529297171">"Diğer"</string> <string name="loading" msgid="7933681260296021180">"Yükleniyor..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Şunu kullanarak paylaş:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-uk/strings.xml b/packages/DocumentsUI/res/values-uk/strings.xml index bdaab5909744..1d793a1e3d51 100644 --- a/packages/DocumentsUI/res/values-uk/strings.xml +++ b/packages/DocumentsUI/res/values-uk/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Не вдалося видалити деякі документи"</string> <string name="more" msgid="7117420986529297171">"Більше"</string> <string name="loading" msgid="7933681260296021180">"Завантаження..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Надіслати через"</string> </resources> diff --git a/packages/DocumentsUI/res/values-vi/strings.xml b/packages/DocumentsUI/res/values-vi/strings.xml index 8257d9b47859..5a7e6cc7d792 100644 --- a/packages/DocumentsUI/res/values-vi/strings.xml +++ b/packages/DocumentsUI/res/values-vi/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Không thể xóa một số tài liệu"</string> <string name="more" msgid="7117420986529297171">"Thêm"</string> <string name="loading" msgid="7933681260296021180">"Đang tải…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Chia sẻ qua"</string> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rCN/strings.xml b/packages/DocumentsUI/res/values-zh-rCN/strings.xml index 882aee2bc7e4..7b8f2f917007 100644 --- a/packages/DocumentsUI/res/values-zh-rCN/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rCN/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"无法删除部分文档"</string> <string name="more" msgid="7117420986529297171">"更多"</string> <string name="loading" msgid="7933681260296021180">"正在加载..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rHK/strings.xml b/packages/DocumentsUI/res/values-zh-rHK/strings.xml index 773b8b3d2052..6fc05031b150 100644 --- a/packages/DocumentsUI/res/values-zh-rHK/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rHK/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> <string name="more" msgid="7117420986529297171">"更多"</string> <string name="loading" msgid="7933681260296021180">"正在載入..."</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-zh-rTW/strings.xml b/packages/DocumentsUI/res/values-zh-rTW/strings.xml index 0852a1b9ebbd..8ca664d39d77 100644 --- a/packages/DocumentsUI/res/values-zh-rTW/strings.xml +++ b/packages/DocumentsUI/res/values-zh-rTW/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"無法刪除部分文件"</string> <string name="more" msgid="7117420986529297171">"更多"</string> <string name="loading" msgid="7933681260296021180">"載入中…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"分享方式:"</string> </resources> diff --git a/packages/DocumentsUI/res/values-zu/strings.xml b/packages/DocumentsUI/res/values-zu/strings.xml index d4ad40546d3e..02db890f1334 100644 --- a/packages/DocumentsUI/res/values-zu/strings.xml +++ b/packages/DocumentsUI/res/values-zu/strings.xml @@ -50,6 +50,5 @@ <string name="toast_failed_delete" msgid="2180678019407244069">"Ayikwazi ukususa amanye amadokhumenti"</string> <string name="more" msgid="7117420986529297171">"Okuningi"</string> <string name="loading" msgid="7933681260296021180">"Iyalayisha…"</string> - <!-- no translation found for share_via (8966594246261344259) --> - <skip /> + <string name="share_via" msgid="8966594246261344259">"Yabelana nge-"</string> </resources> diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml index ff3e999b9ccf..6d627597c673 100644 --- a/packages/DocumentsUI/res/values/colors.xml +++ b/packages/DocumentsUI/res/values/colors.xml @@ -16,4 +16,5 @@ <resources> <color name="chip">#ddd</color> + <color name="item_root_activated">#cccccc</color> </resources> diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml index e5c4138ab0f4..e5b5b4e1f578 100644 --- a/packages/DocumentsUI/res/values/dimens.xml +++ b/packages/DocumentsUI/res/values/dimens.xml @@ -15,5 +15,8 @@ --> <resources> + <dimen name="icon_size">32dp</dimen> + <dimen name="root_icon_size">24dp</dimen> <dimen name="grid_width">180dp</dimen> + <dimen name="grid_height">180dp</dimen> </resources> diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java index e0b8d1971a6e..d8e60aa2eed3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java @@ -70,7 +70,7 @@ public class CreateDirectoryFragment extends DialogFragment { try { final Uri childUri = DocumentsContract.createDocument( - resolver, cwd.uri, Document.MIME_TYPE_DIR, displayName); + resolver, cwd.derivedUri, Document.MIME_TYPE_DIR, displayName); // Navigate into newly created child final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri); diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java index 33d7d6afd18d..a13beba56c3a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java @@ -20,6 +20,8 @@ import static com.android.documentsui.DocumentsActivity.TAG; import static com.android.documentsui.DocumentsActivity.State.ACTION_MANAGE; import static com.android.documentsui.DocumentsActivity.State.MODE_GRID; import static com.android.documentsui.DocumentsActivity.State.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.State.MODE_UNKNOWN; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_UNKNOWN; import static com.android.documentsui.model.DocumentInfo.getCursorInt; import static com.android.documentsui.model.DocumentInfo.getCursorLong; import static com.android.documentsui.model.DocumentInfo.getCursorString; @@ -91,43 +93,42 @@ public class DirectoryFragment extends Fragment { private int mType = TYPE_NORMAL; + private int mLastMode = MODE_UNKNOWN; + private int mLastSortOrder = SORT_ORDER_UNKNOWN; + private Point mThumbSize; private DocumentsAdapter mAdapter; private LoaderCallbacks<DirectoryResult> mCallbacks; private static final String EXTRA_TYPE = "type"; - private static final String EXTRA_AUTHORITY = "authority"; - private static final String EXTRA_ROOT_ID = "rootId"; - private static final String EXTRA_DOC_ID = "docId"; + private static final String EXTRA_ROOT = "root"; + private static final String EXTRA_DOC = "doc"; private static final String EXTRA_QUERY = "query"; private static AtomicInteger sLoaderId = new AtomicInteger(4000); - private int mLastSortOrder = -1; - private final int mLoaderId = sLoaderId.incrementAndGet(); - public static void showNormal(FragmentManager fm, Uri uri) { - show(fm, TYPE_NORMAL, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), null); + public static void showNormal(FragmentManager fm, RootInfo root, DocumentInfo doc) { + show(fm, TYPE_NORMAL, root, doc, null); } - public static void showSearch(FragmentManager fm, Uri uri, String query) { - show(fm, TYPE_SEARCH, uri.getAuthority(), null, DocumentsContract.getDocumentId(uri), - query); + public static void showSearch( + FragmentManager fm, RootInfo root, DocumentInfo doc, String query) { + show(fm, TYPE_SEARCH, root, doc, query); } public static void showRecentsOpen(FragmentManager fm) { - show(fm, TYPE_RECENT_OPEN, null, null, null, null); + show(fm, TYPE_RECENT_OPEN, null, null, null); } - private static void show(FragmentManager fm, int type, String authority, String rootId, - String docId, String query) { + private static void show( + FragmentManager fm, int type, RootInfo root, DocumentInfo doc, String query) { final Bundle args = new Bundle(); args.putInt(EXTRA_TYPE, type); - args.putString(EXTRA_AUTHORITY, authority); - args.putString(EXTRA_ROOT_ID, rootId); - args.putString(EXTRA_DOC_ID, docId); + args.putParcelable(EXTRA_ROOT, root); + args.putParcelable(EXTRA_DOC, doc); args.putString(EXTRA_QUERY, query); final DirectoryFragment fragment = new DirectoryFragment(); @@ -167,6 +168,7 @@ public class DirectoryFragment extends Fragment { super.onActivityCreated(savedInstanceState); final Context context = getActivity(); + final State state = getDisplayState(DirectoryFragment.this); mAdapter = new DocumentsAdapter(); mType = getArguments().getInt(EXTRA_TYPE); @@ -174,35 +176,48 @@ public class DirectoryFragment extends Fragment { mCallbacks = new LoaderCallbacks<DirectoryResult>() { @Override public Loader<DirectoryResult> onCreateLoader(int id, Bundle args) { - final State state = getDisplayState(DirectoryFragment.this); - - final String authority = getArguments().getString(EXTRA_AUTHORITY); - final String rootId = getArguments().getString(EXTRA_ROOT_ID); - final String docId = getArguments().getString(EXTRA_DOC_ID); + final RootInfo root = getArguments().getParcelable(EXTRA_ROOT); + final DocumentInfo doc = getArguments().getParcelable(EXTRA_DOC); final String query = getArguments().getString(EXTRA_QUERY); Uri contentsUri; switch (mType) { case TYPE_NORMAL: - contentsUri = DocumentsContract.buildChildDocumentsUri(authority, docId); - return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); + contentsUri = DocumentsContract.buildChildDocumentsUri( + doc.authority, doc.documentId); + return new DirectoryLoader(context, root, doc, contentsUri); case TYPE_SEARCH: contentsUri = DocumentsContract.buildSearchDocumentsUri( - authority, docId, query); - return new DirectoryLoader(context, rootId, contentsUri, state.sortOrder); + doc.authority, doc.documentId, query); + return new DirectoryLoader(context, root, doc, contentsUri); case TYPE_RECENT_OPEN: final RootsCache roots = DocumentsApplication.getRootsCache(context); final List<RootInfo> matchingRoots = roots.getMatchingRoots(state); - return new RecentLoader(context, matchingRoots); + return new RecentLoader(context, matchingRoots, state.acceptMimes); default: throw new IllegalStateException("Unknown type " + mType); - } } @Override public void onLoadFinished(Loader<DirectoryResult> loader, DirectoryResult result) { + if (!isAdded()) return; + mAdapter.swapCursor(result.cursor); + + // Push latest state up to UI + // TODO: if mode change was racing with us, don't overwrite it + state.mode = result.mode; + state.sortOrder = result.sortOrder; + ((DocumentsActivity) context).onStateChanged(); + + updateDisplayState(); + + if (mLastSortOrder != result.sortOrder) { + mLastSortOrder = result.sortOrder; + mListView.smoothScrollToPosition(0); + mGridView.smoothScrollToPosition(0); + } } @Override @@ -211,25 +226,39 @@ public class DirectoryFragment extends Fragment { } }; + // Kick off loader at least once + getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); + + updateDisplayState(); + } + + @Override + public void onStart() { + super.onStart(); updateDisplayState(); } - public void updateDisplayState() { + public void onUserSortOrderChanged() { + // User change always triggers reload + getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); + } + + public void onUserModeChanged() { + // Mode change is just display; no need to reload + updateDisplayState(); + } + + private void updateDisplayState() { final State state = getDisplayState(this); - if (mLastSortOrder != state.sortOrder) { - getLoaderManager().restartLoader(mLoaderId, null, mCallbacks); - mLastSortOrder = state.sortOrder; - } + mFilter = new MimePredicate(state.acceptMimes); - mListView.smoothScrollToPosition(0); - mGridView.smoothScrollToPosition(0); + if (mLastMode == state.mode) return; + mLastMode = state.mode; mListView.setVisibility(state.mode == MODE_LIST ? View.VISIBLE : View.GONE); mGridView.setVisibility(state.mode == MODE_GRID ? View.VISIBLE : View.GONE); - mFilter = new MimePredicate(state.acceptMimes); - final int choiceMode; if (state.allowMultiple) { choiceMode = ListView.CHOICE_MODE_MULTIPLE_MODAL; @@ -248,14 +277,14 @@ public class DirectoryFragment extends Fragment { mGridView.setChoiceMode(choiceMode); mCurrentView = mGridView; } else if (state.mode == MODE_LIST) { - thumbSize = getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); + thumbSize = getResources().getDimensionPixelSize(R.dimen.icon_size); mGridView.setAdapter(null); mGridView.setChoiceMode(ListView.CHOICE_MODE_NONE); mListView.setAdapter(mAdapter); mListView.setChoiceMode(choiceMode); mCurrentView = mListView; } else { - throw new IllegalStateException(); + throw new IllegalStateException("Unknown state " + state.mode); } mThumbSize = new Point(thumbSize, thumbSize); @@ -360,7 +389,7 @@ public class DirectoryFragment extends Fragment { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setType(doc.mimeType); - intent.putExtra(Intent.EXTRA_STREAM, doc.uri); + intent.putExtra(Intent.EXTRA_STREAM, doc.derivedUri); } else if (docs.size() > 1) { intent = new Intent(Intent.ACTION_SEND_MULTIPLE); @@ -371,7 +400,7 @@ public class DirectoryFragment extends Fragment { final ArrayList<Uri> uris = Lists.newArrayList(); for (DocumentInfo doc : docs) { mimeTypes.add(doc.mimeType); - uris.add(doc.uri); + uris.add(doc.derivedUri); } intent.setType(findCommonMimeType(mimeTypes)); @@ -397,7 +426,7 @@ public class DirectoryFragment extends Fragment { continue; } - if (!DocumentsContract.deleteDocument(resolver, doc.uri)) { + if (!DocumentsContract.deleteDocument(resolver, doc.derivedUri)) { Log.w(TAG, "Failed to delete " + doc); hadTrouble = true; } @@ -477,13 +506,11 @@ public class DirectoryFragment extends Fragment { if (extras != null) { final String info = extras.getString(DocumentsContract.EXTRA_INFO); if (info != null) { - mFooters.add(new MessageFooter( - com.android.internal.R.drawable.ic_menu_info_details, info)); + mFooters.add(new MessageFooter(R.drawable.ic_dialog_alert, info)); } final String error = extras.getString(DocumentsContract.EXTRA_ERROR); if (error != null) { - mFooters.add(new MessageFooter( - com.android.internal.R.drawable.ic_dialog_alert, error)); + mFooters.add(new MessageFooter(R.drawable.ic_dialog_alert, error)); } if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) { mFooters.add(new LoadingFooter()); @@ -543,7 +570,7 @@ public class DirectoryFragment extends Fragment { final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final View summaryGrid = convertView.findViewById(R.id.summary_grid); + final View line2 = convertView.findViewById(R.id.line2); final ImageView icon1 = (ImageView) convertView.findViewById(android.R.id.icon1); final TextView summary = (TextView) convertView.findViewById(android.R.id.summary); final TextView date = (TextView) convertView.findViewById(R.id.date); @@ -566,38 +593,39 @@ public class DirectoryFragment extends Fragment { task.execute(uri); } } else if (docIcon != 0) { - icon.setImageDrawable(DocumentInfo.loadIcon(context, docAuthority, docIcon)); + icon.setImageDrawable(IconUtils.loadPackageIcon(context, docAuthority, docIcon)); } else { - icon.setImageDrawable(RootsCache.resolveDocumentIcon(context, docMimeType)); + icon.setImageDrawable(IconUtils.loadMimeIcon(context, docMimeType)); } title.setText(docDisplayName); + boolean hasLine2 = false; + if (mType == TYPE_RECENT_OPEN) { final RootInfo root = roots.getRoot(docAuthority, docRootId); icon1.setVisibility(View.VISIBLE); icon1.setImageDrawable(root.loadIcon(context)); summary.setText(root.getDirectoryString()); summary.setVisibility(View.VISIBLE); + summary.setTextAlignment(TextView.TEXT_ALIGNMENT_TEXT_END); + hasLine2 = true; } else { icon1.setVisibility(View.GONE); if (docSummary != null) { summary.setText(docSummary); summary.setVisibility(View.VISIBLE); + hasLine2 = true; } else { summary.setVisibility(View.INVISIBLE); } } - if (summaryGrid != null) { - summaryGrid.setVisibility( - (summary.getVisibility() == View.VISIBLE) ? View.VISIBLE : View.GONE); - } - if (docLastModified == -1) { date.setText(null); } else { date.setText(formatTime(context, docLastModified)); + hasLine2 = true; } if (state.showSize) { @@ -606,11 +634,14 @@ public class DirectoryFragment extends Fragment { size.setText(null); } else { size.setText(Formatter.formatFileSize(context, docSize)); + hasLine2 = true; } } else { size.setVisibility(View.GONE); } + line2.setVisibility(hasLine2 ? View.VISIBLE : View.GONE); + return convertView; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java index 6ea57d77cfa6..72dfa30377ec 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryLoader.java @@ -16,18 +16,29 @@ package com.android.documentsui; +import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.DocumentsActivity.State.MODE_UNKNOWN; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_DISPLAY_NAME; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED; import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_SIZE; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_UNKNOWN; +import static com.android.documentsui.model.DocumentInfo.getCursorInt; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; +import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.CancellationSignal; import android.os.OperationCanceledException; import android.provider.DocumentsContract.Document; +import android.util.Log; + +import com.android.documentsui.DocumentsActivity.State; +import com.android.documentsui.RecentsProvider.StateColumns; +import com.android.documentsui.model.DocumentInfo; +import com.android.documentsui.model.RootInfo; import libcore.io.IoUtils; @@ -36,6 +47,9 @@ class DirectoryResult implements AutoCloseable { Cursor cursor; Exception exception; + int mode = MODE_UNKNOWN; + int sortOrder = SORT_ORDER_UNKNOWN; + @Override public void close() { IoUtils.closeQuietly(cursor); @@ -48,18 +62,18 @@ class DirectoryResult implements AutoCloseable { public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { private final ForceLoadContentObserver mObserver = new ForceLoadContentObserver(); - private final String mRootId; + private final RootInfo mRoot; + private final DocumentInfo mDoc; private final Uri mUri; - private final int mSortOrder; private CancellationSignal mSignal; private DirectoryResult mResult; - public DirectoryLoader(Context context, String rootId, Uri uri, int sortOrder) { + public DirectoryLoader(Context context, RootInfo root, DocumentInfo doc, Uri uri) { super(context); - mRootId = rootId; + mRoot = root; + mDoc = doc; mUri = uri; - mSortOrder = sortOrder; } @Override @@ -70,20 +84,65 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { } mSignal = new CancellationSignal(); } - final DirectoryResult result = new DirectoryResult(); + + final ContentResolver resolver = getContext().getContentResolver(); final String authority = mUri.getAuthority(); + + final DirectoryResult result = new DirectoryResult(); + + int userMode = State.MODE_UNKNOWN; + int userSortOrder = State.SORT_ORDER_UNKNOWN; + + // Pick up any custom modes requested by user + Cursor cursor = null; try { - result.client = getContext() - .getContentResolver().acquireUnstableContentProviderClient(authority); - final Cursor cursor = result.client.query( - mUri, null, null, null, getQuerySortOrder(mSortOrder), mSignal); + final Uri stateUri = RecentsProvider.buildState( + mRoot.authority, mRoot.rootId, mDoc.documentId); + cursor = resolver.query(stateUri, null, null, null, null); + if (cursor.moveToFirst()) { + userMode = getCursorInt(cursor, StateColumns.MODE); + userSortOrder = getCursorInt(cursor, StateColumns.SORT_ORDER); + } + } finally { + IoUtils.closeQuietly(cursor); + } + + if (userMode != State.MODE_UNKNOWN) { + result.mode = userMode; + } else { + if ((mDoc.flags & Document.FLAG_DIR_PREFERS_GRID) != 0) { + result.mode = State.MODE_GRID; + } else { + result.mode = State.MODE_LIST; + } + } + + if (userSortOrder != State.SORT_ORDER_UNKNOWN) { + result.sortOrder = userSortOrder; + } else { + if ((mDoc.flags & Document.FLAG_DIR_PREFERS_LAST_MODIFIED) != 0) { + result.sortOrder = State.SORT_ORDER_LAST_MODIFIED; + } else { + result.sortOrder = State.SORT_ORDER_DISPLAY_NAME; + } + } + + Log.d(TAG, "userMode=" + userMode + ", userSortOrder=" + userSortOrder + " --> mode=" + + result.mode + ", sortOrder=" + result.sortOrder); + + try { + result.client = resolver.acquireUnstableContentProviderClient(authority); + cursor = result.client.query( + mUri, null, null, null, getQuerySortOrder(result.sortOrder), mSignal); cursor.registerContentObserver(mObserver); - final Cursor withRoot = new RootCursorWrapper(mUri.getAuthority(), mRootId, cursor, -1); - final Cursor sorted = new SortingCursorWrapper(withRoot, mSortOrder); + final Cursor withRoot = new RootCursorWrapper( + mUri.getAuthority(), mRoot.rootId, cursor, -1); + final Cursor sorted = new SortingCursorWrapper(withRoot, result.sortOrder); result.cursor = sorted; } catch (Exception e) { + Log.d(TAG, "Failed to query", e); result.exception = e; ContentProviderClient.closeQuietly(result.client); } finally { @@ -91,6 +150,7 @@ public class DirectoryLoader extends AsyncTaskLoader<DirectoryResult> { mSignal = null; } } + return result; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index 4da6567ae6a6..fe398004ee87 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -53,12 +53,16 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import android.widget.ImageView; import android.widget.SearchView; import android.widget.SearchView.OnCloseListener; import android.widget.SearchView.OnQueryTextListener; import android.widget.TextView; import android.widget.Toast; +import com.android.documentsui.RecentsProvider.RecentColumns; +import com.android.documentsui.RecentsProvider.ResumeColumns; +import com.android.documentsui.RecentsProvider.StateColumns; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; @@ -104,7 +108,7 @@ public class DocumentsActivity extends Activity { R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close); mDrawerLayout.setDrawerListener(mDrawerListener); - mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + mDrawerLayout.setDrawerShadow(R.drawable.ic_drawer_shadow, GravityCompat.START); if (icicle != null) { mState = icicle.getParcelable(EXTRA_STATE); @@ -145,7 +149,7 @@ public class DocumentsActivity extends Activity { mState.action = ACTION_CREATE; } else if (Intent.ACTION_GET_CONTENT.equals(action)) { mState.action = ACTION_GET_CONTENT; - } else if (DocumentsContract.ACTION_MANAGE_DOCUMENTS.equals(action)) { + } else if (DocumentsContract.ACTION_MANAGE_ROOT.equals(action)) { mState.action = ACTION_MANAGE; } @@ -171,12 +175,13 @@ public class DocumentsActivity extends Activity { } if (mState.action == ACTION_MANAGE) { - final Uri rootUri = intent.getData(); - final RootInfo root = mRoots.findRoot(rootUri); + final Uri uri = intent.getData(); + final String rootId = DocumentsContract.getRootId(uri); + final RootInfo root = mRoots.getRoot(uri.getAuthority(), rootId); if (root != null) { onRootPicked(root, true); } else { - Log.w(TAG, "Failed to find root: " + rootUri); + Log.w(TAG, "Failed to find root: " + uri); finish(); } @@ -189,7 +194,7 @@ public class DocumentsActivity extends Activity { try { if (cursor.moveToFirst()) { final byte[] rawStack = cursor.getBlob( - cursor.getColumnIndex(RecentsProvider.COL_PATH)); + cursor.getColumnIndex(ResumeColumns.STACK)); DurableUtils.readFromArray(rawStack, mState.stack); } } catch (IOException e) { @@ -202,7 +207,7 @@ public class DocumentsActivity extends Activity { final RootInfo root = getCurrentRoot(); final List<RootInfo> matchingRoots = mRoots.getMatchingRoots(mState); if (!matchingRoots.contains(root)) { - mState.stack.clear(); + mState.stack.reset(); } // Only open drawer when showing recents @@ -341,11 +346,16 @@ public class DocumentsActivity extends Activity { final MenuItem list = menu.findItem(R.id.menu_list); final MenuItem settings = menu.findItem(R.id.menu_settings); - grid.setVisible(mState.mode != MODE_GRID); - list.setVisible(mState.mode != MODE_LIST); + if (cwd != null) { + sort.setVisible(true); + grid.setVisible(mState.mode != MODE_GRID); + list.setVisible(mState.mode != MODE_LIST); + } else { + sort.setVisible(false); + grid.setVisible(false); + list.setVisible(false); + } - // No sorting in recents - sort.setVisible(cwd != null); // Only sort by size when visible sortSize.setVisible(mState.showSize); @@ -390,28 +400,19 @@ public class DocumentsActivity extends Activity { } else if (id == R.id.menu_search) { return false; } else if (id == R.id.menu_sort_name) { - mState.sortOrder = State.SORT_ORDER_DISPLAY_NAME; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_DISPLAY_NAME); return true; } else if (id == R.id.menu_sort_date) { - mState.sortOrder = State.SORT_ORDER_LAST_MODIFIED; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_LAST_MODIFIED); return true; } else if (id == R.id.menu_sort_size) { - mState.sortOrder = State.SORT_ORDER_SIZE; - updateDisplayState(); + setUserSortOrder(State.SORT_ORDER_SIZE); return true; } else if (id == R.id.menu_grid) { - // TODO: persist explicit user mode for cwd - mState.mode = MODE_GRID; - updateDisplayState(); - invalidateOptionsMenu(); + setUserMode(State.MODE_GRID); return true; } else if (id == R.id.menu_list) { - // TODO: persist explicit user mode for cwd - mState.mode = MODE_LIST; - updateDisplayState(); - invalidateOptionsMenu(); + setUserMode(State.MODE_LIST); return true; } else if (id == R.id.menu_settings) { startActivity(new Intent(this, SettingsActivity.class)); @@ -421,6 +422,51 @@ public class DocumentsActivity extends Activity { } } + /** + * Update UI to reflect internal state changes not from user. + */ + public void onStateChanged() { + invalidateOptionsMenu(); + } + + /** + * Set state sort order based on explicit user action. + */ + private void setUserSortOrder(int sortOrder) { + final RootInfo root = getCurrentRoot(); + final DocumentInfo cwd = getCurrentDirectory(); + + // TODO: persist async, then trigger rebind + final Uri stateUri = RecentsProvider.buildState( + root.authority, root.rootId, cwd.documentId); + final ContentValues values = new ContentValues(); + values.put(StateColumns.SORT_ORDER, sortOrder); + getContentResolver().insert(stateUri, values); + + DirectoryFragment.get(getFragmentManager()).onUserSortOrderChanged(); + onStateChanged(); + } + + /** + * Set state mode based on explicit user action. + */ + private void setUserMode(int mode) { + final RootInfo root = getCurrentRoot(); + final DocumentInfo cwd = getCurrentDirectory(); + + // TODO: persist async, then trigger rebind + final Uri stateUri = RecentsProvider.buildState( + root.authority, root.rootId, cwd.documentId); + final ContentValues values = new ContentValues(); + values.put(StateColumns.MODE, mode); + getContentResolver().insert(stateUri, values); + + mState.mode = mode; + + DirectoryFragment.get(getFragmentManager()).onUserModeChanged(); + onStateChanged(); + } + @Override public void onBackPressed() { final int size = mState.stack.size(); @@ -480,6 +526,8 @@ public class DocumentsActivity extends Activity { title.setText(doc.displayName); } + // No padding when shown in actionbar + convertView.setPadding(0, 0, 0, 0); return convertView; } @@ -487,17 +535,20 @@ public class DocumentsActivity extends Activity { public View getDropDownView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()) - .inflate(android.R.layout.simple_dropdown_item_1line, parent, false); + .inflate(R.layout.item_title, parent, false); } - final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1); + final ImageView subdir = (ImageView) convertView.findViewById(R.id.subdir); + final TextView title = (TextView) convertView.findViewById(android.R.id.title); final DocumentInfo doc = getItem(position); if (position == 0) { final RootInfo root = getCurrentRoot(); - text1.setText(root.title); + title.setText(root.title); + subdir.setVisibility(View.GONE); } else { - text1.setText(doc.displayName); + title.setText(doc.displayName); + subdir.setVisibility(View.VISIBLE); } return convertView; @@ -521,8 +572,8 @@ public class DocumentsActivity extends Activity { }; public RootInfo getCurrentRoot() { - if (mState.stack.size() > 0) { - return mState.stack.getRoot(mRoots); + if (mState.stack.root != null) { + return mState.stack.root; } else { return mRoots.getRecentsRoot(); } @@ -538,6 +589,7 @@ public class DocumentsActivity extends Activity { private void onCurrentDirectoryChanged() { final FragmentManager fm = getFragmentManager(); + final RootInfo root = getCurrentRoot(); final DocumentInfo cwd = getCurrentDirectory(); if (cwd == null) { @@ -550,10 +602,10 @@ public class DocumentsActivity extends Activity { } else { if (mState.currentSearch != null) { // Ongoing search - DirectoryFragment.showSearch(fm, cwd.uri, mState.currentSearch); + DirectoryFragment.showSearch(fm, root, cwd, mState.currentSearch); } else { // Normal boring directory - DirectoryFragment.showNormal(fm, cwd.uri); + DirectoryFragment.showNormal(fm, root, cwd); } } @@ -565,16 +617,16 @@ public class DocumentsActivity extends Activity { } } + final RootsFragment roots = RootsFragment.get(fm); + if (roots != null) { + roots.onCurrentRootChanged(); + } + updateActionBar(); invalidateOptionsMenu(); dumpStack(); } - private void updateDisplayState() { - // TODO: handle multiple directory stacks on tablets - DirectoryFragment.get(getFragmentManager()).updateDisplayState(); - } - public void onStackPicked(DocumentStack stack) { mState.stack = stack; onCurrentDirectoryChanged(); @@ -582,6 +634,7 @@ public class DocumentsActivity extends Activity { public void onRootPicked(RootInfo root, boolean closeDrawer) { // Clear entire backstack and start in new root + mState.stack.root = root; mState.stack.clear(); if (!mRoots.isRecentsRoot(root)) { @@ -621,19 +674,29 @@ public class DocumentsActivity extends Activity { onCurrentDirectoryChanged(); } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { // Explicit file picked, return - onFinished(doc.uri); + onFinished(doc.derivedUri); } else if (mState.action == ACTION_CREATE) { // Replace selected file SaveFragment.get(fm).setReplaceTarget(doc); } else if (mState.action == ACTION_MANAGE) { - // Open the document - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - intent.setData(doc.uri); + // First try managing the document; we expect manager to filter + // based on authority, so we don't grant. + final Intent manage = new Intent(DocumentsContract.ACTION_MANAGE_DOCUMENT); + manage.setData(doc.derivedUri); + try { - startActivity(intent); + startActivity(manage); } catch (ActivityNotFoundException ex) { - Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); + // Fall back to viewing + final Intent view = new Intent(Intent.ACTION_VIEW); + view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + view.setData(doc.derivedUri); + + try { + startActivity(view); + } catch (ActivityNotFoundException ex2) { + Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); + } } } } @@ -643,22 +706,21 @@ public class DocumentsActivity extends Activity { final int size = docs.size(); final Uri[] uris = new Uri[size]; for (int i = 0; i < size; i++) { - uris[i] = docs.get(i).uri; + uris[i] = docs.get(i).derivedUri; } onFinished(uris); } } public void onSaveRequested(DocumentInfo replaceTarget) { - onFinished(replaceTarget.uri); + onFinished(replaceTarget.derivedUri); } public void onSaveRequested(String mimeType, String displayName) { final DocumentInfo cwd = getCurrentDirectory(); - final String authority = cwd.uri.getAuthority(); final Uri childUri = DocumentsContract.createDocument( - getContentResolver(), cwd.uri, mimeType, displayName); + getContentResolver(), cwd.derivedUri, mimeType, displayName); if (childUri != null) { onFinished(childUri); } else { @@ -676,22 +738,14 @@ public class DocumentsActivity extends Activity { if (mState.action == ACTION_CREATE) { // Remember stack for last create values.clear(); - values.put(RecentsProvider.COL_PATH, rawStack); - resolver.insert(RecentsProvider.buildRecentCreate(), values); - - } else if (mState.action == ACTION_OPEN || mState.action == ACTION_GET_CONTENT) { - // Remember opened items - for (Uri uri : uris) { - values.clear(); - values.put(RecentsProvider.COL_URI, uri.toString()); - resolver.insert(RecentsProvider.buildRecentOpen(), values); - } + values.put(RecentColumns.STACK, rawStack); + resolver.insert(RecentsProvider.buildRecent(), values); } // Remember location for next app launch final String packageName = getCallingPackage(); values.clear(); - values.put(RecentsProvider.COL_PATH, rawStack); + values.put(ResumeColumns.STACK, rawStack); resolver.insert(RecentsProvider.buildResume(packageName), values); final Intent intent = new Intent(); @@ -738,12 +792,14 @@ public class DocumentsActivity extends Activity { public static final int ACTION_GET_CONTENT = 3; public static final int ACTION_MANAGE = 4; - public static final int MODE_LIST = 0; - public static final int MODE_GRID = 1; + public static final int MODE_UNKNOWN = 0; + public static final int MODE_LIST = 1; + public static final int MODE_GRID = 2; - public static final int SORT_ORDER_DISPLAY_NAME = 0; - public static final int SORT_ORDER_LAST_MODIFIED = 1; - public static final int SORT_ORDER_SIZE = 2; + public static final int SORT_ORDER_UNKNOWN = 0; + public static final int SORT_ORDER_DISPLAY_NAME = 1; + public static final int SORT_ORDER_LAST_MODIFIED = 2; + public static final int SORT_ORDER_SIZE = 3; @Override public int describeContents() { @@ -789,9 +845,10 @@ public class DocumentsActivity extends Activity { } private void dumpStack() { - Log.d(TAG, "Current stack:"); + Log.d(TAG, "Current stack: "); + Log.d(TAG, " * " + mState.stack.root); for (DocumentInfo doc : mState.stack) { - Log.d(TAG, "--> " + doc); + Log.d(TAG, " +-- " + doc); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java b/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java new file mode 100644 index 000000000000..60f010380b66 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/FilteringCursorWrapper.java @@ -0,0 +1,119 @@ +/* + * 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.documentsui; + +import static com.android.documentsui.DocumentsActivity.TAG; + +import android.database.AbstractCursor; +import android.database.Cursor; +import android.os.Bundle; +import android.provider.DocumentsContract.Document; +import android.util.Log; + +/** + * Cursor wrapper that filters MIME types not matching given list. + */ +public class FilteringCursorWrapper extends AbstractCursor { + private final Cursor mCursor; + + private final int[] mPosition; + private int mCount; + + public FilteringCursorWrapper(Cursor cursor, String[] acceptMimes) { + mCursor = cursor; + + final int count = cursor.getCount(); + mPosition = new int[count]; + + cursor.moveToPosition(-1); + while (cursor.moveToNext()) { + final String mimeType = cursor.getString( + cursor.getColumnIndex(Document.COLUMN_MIME_TYPE)); + if (MimePredicate.mimeMatches(acceptMimes, mimeType)) { + mPosition[mCount++] = cursor.getPosition(); + } + } + + Log.d(TAG, "Before filtering " + cursor.getCount() + ", after " + mCount); + } + + @Override + public Bundle getExtras() { + return mCursor.getExtras(); + } + + @Override + public void close() { + super.close(); + mCursor.close(); + } + + @Override + public boolean onMove(int oldPosition, int newPosition) { + return mCursor.moveToPosition(mPosition[newPosition]); + } + + @Override + public String[] getColumnNames() { + return mCursor.getColumnNames(); + } + + @Override + public int getCount() { + return mCount; + } + + @Override + public double getDouble(int column) { + return mCursor.getDouble(column); + } + + @Override + public float getFloat(int column) { + return mCursor.getFloat(column); + } + + @Override + public int getInt(int column) { + return mCursor.getInt(column); + } + + @Override + public long getLong(int column) { + return mCursor.getLong(column); + } + + @Override + public short getShort(int column) { + return mCursor.getShort(column); + } + + @Override + public String getString(int column) { + return mCursor.getString(column); + } + + @Override + public int getType(int column) { + return mCursor.getType(column); + } + + @Override + public boolean isNull(int column) { + return mCursor.isNull(column); + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java new file mode 100644 index 000000000000..5caf9ba0db29 --- /dev/null +++ b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java @@ -0,0 +1,243 @@ +/* + * 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.documentsui; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.ProviderInfo; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.provider.DocumentsContract.Document; + +import com.google.android.collect.Maps; + +import java.util.HashMap; + +public class IconUtils { + + private static HashMap<String, Integer> sMimeIcons = Maps.newHashMap(); + + private static void add(String mimeType, int resId) { + if (sMimeIcons.put(mimeType, resId) != null) { + throw new RuntimeException(mimeType + " already registered!"); + } + } + + static { + int icon; + + // Package + icon = R.drawable.ic_doc_apk; + add("application/vnd.android.package-archive", icon); + + // Audio + icon = R.drawable.ic_doc_audio; + add("application/ogg", icon); + add("application/x-flac", icon); + + // Certificate + icon = R.drawable.ic_doc_certificate; + add("application/pgp-keys", icon); + add("application/pgp-signature", icon); + add("application/x-pkcs12", icon); + add("application/x-pkcs7-certreqresp", icon); + add("application/x-pkcs7-crl", icon); + add("application/x-x509-ca-cert", icon); + add("application/x-x509-user-cert", icon); + add("application/x-pkcs7-certificates", icon); + add("application/x-pkcs7-mime", icon); + add("application/x-pkcs7-signature", icon); + + // Source code + icon = R.drawable.ic_doc_codes; + add("application/rdf+xml", icon); + add("application/rss+xml", icon); + add("application/x-object", icon); + add("application/xhtml+xml", icon); + add("text/css", icon); + add("text/html", icon); + add("text/xml", icon); + add("text/x-c++hdr", icon); + add("text/x-c++src", icon); + add("text/x-chdr", icon); + add("text/x-csrc", icon); + add("text/x-dsrc", icon); + add("text/x-csh", icon); + add("text/x-haskell", icon); + add("text/x-java", icon); + add("text/x-literate-haskell", icon); + add("text/x-pascal", icon); + add("text/x-tcl", icon); + add("text/x-tex", icon); + add("application/x-latex", icon); + add("application/x-texinfo", icon); + add("application/atom+xml", icon); + add("application/ecmascript", icon); + add("application/json", icon); + add("application/javascript", icon); + add("application/xml", icon); + add("text/javascript", icon); + add("application/x-javascript", icon); + + // Compressed + icon = R.drawable.ic_doc_compressed; + add("application/mac-binhex40", icon); + add("application/rar", icon); + add("application/zip", icon); + add("application/x-apple-diskimage", icon); + add("application/x-debian-package", icon); + add("application/x-gtar", icon); + add("application/x-iso9660-image", icon); + add("application/x-lha", icon); + add("application/x-lzh", icon); + add("application/x-lzx", icon); + add("application/x-stuffit", icon); + add("application/x-tar", icon); + add("application/x-webarchive", icon); + add("application/x-webarchive-xml", icon); + add("application/gzip", icon); + add("application/x-7z-compressed", icon); + add("application/x-deb", icon); + add("application/x-rar-compressed", icon); + + // Contact + icon = R.drawable.ic_doc_contact; + add("text/x-vcard", icon); + add("text/vcard", icon); + + // Event + icon = R.drawable.ic_doc_event; + add("text/calendar", icon); + add("text/x-vcalendar", icon); + + // Font + icon = R.drawable.ic_doc_font; + add("application/x-font", icon); + add("application/font-woff", icon); + add("application/x-font-woff", icon); + add("application/x-font-ttf", icon); + + // Image + icon = R.drawable.ic_doc_image; + add("application/vnd.oasis.opendocument.graphics", icon); + add("application/vnd.oasis.opendocument.graphics-template", icon); + add("application/vnd.oasis.opendocument.image", icon); + add("application/vnd.stardivision.draw", icon); + add("application/vnd.sun.xml.draw", icon); + add("application/vnd.sun.xml.draw.template", icon); + + // PDF + icon = R.drawable.ic_doc_pdf; + add("application/pdf", icon); + + // Presentation + icon = R.drawable.ic_doc_presentation; + add("application/vnd.ms-powerpoint", icon); + add("application/vnd.openxmlformats-officedocument.presentationml.presentation", icon); + add("application/vnd.openxmlformats-officedocument.presentationml.template", icon); + add("application/vnd.openxmlformats-officedocument.presentationml.slideshow", icon); + add("application/vnd.stardivision.impress", icon); + add("application/vnd.sun.xml.impress", icon); + add("application/vnd.sun.xml.impress.template", icon); + add("application/x-kpresenter", icon); + add("application/vnd.oasis.opendocument.presentation", icon); + + // Spreadsheet + icon = R.drawable.ic_doc_spreadsheet; + add("application/vnd.oasis.opendocument.spreadsheet", icon); + add("application/vnd.oasis.opendocument.spreadsheet-template", icon); + add("application/vnd.ms-excel", icon); + add("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", icon); + add("application/vnd.openxmlformats-officedocument.spreadsheetml.template", icon); + add("application/vnd.stardivision.calc", icon); + add("application/vnd.sun.xml.calc", icon); + add("application/vnd.sun.xml.calc.template", icon); + add("application/x-kspread", icon); + + // Text + icon = R.drawable.ic_doc_text; + add("application/vnd.oasis.opendocument.text", icon); + add("application/vnd.oasis.opendocument.text-master", icon); + add("application/vnd.oasis.opendocument.text-template", icon); + add("application/vnd.oasis.opendocument.text-web", icon); + add("application/msword", icon); + add("application/vnd.openxmlformats-officedocument.wordprocessingml.document", icon); + add("application/vnd.openxmlformats-officedocument.wordprocessingml.template", icon); + add("application/vnd.stardivision.writer", icon); + add("application/vnd.stardivision.writer-global", icon); + add("application/vnd.sun.xml.writer", icon); + add("application/vnd.sun.xml.writer.global", icon); + add("application/vnd.sun.xml.writer.template", icon); + add("application/x-abiword", icon); + add("application/x-kword", icon); + + // Video + icon = R.drawable.ic_doc_video; + add("application/x-quicktimeplayer", icon); + add("application/x-shockwave-flash", icon); + } + + public static Drawable loadPackageIcon(Context context, String authority, int icon) { + if (icon != 0) { + if (authority != null) { + final PackageManager pm = context.getPackageManager(); + final ProviderInfo info = pm.resolveContentProvider(authority, 0); + if (info != null) { + return pm.getDrawable(info.packageName, icon, info.applicationInfo); + } + } else { + return context.getResources().getDrawable(icon); + } + } + return null; + } + + public static Drawable loadMimeIcon(Context context, String mimeType) { + final Resources res = context.getResources(); + + if (Document.MIME_TYPE_DIR.equals(mimeType)) { + // TODO: return a mipmap, since this is used for grid + return res.getDrawable(R.drawable.ic_root_folder); + } + + // Look for exact match first + Integer resId = sMimeIcons.get(mimeType); + if (resId != null) { + return res.getDrawable(resId); + } + + if (mimeType == null) { + // TODO: generic icon? + return null; + } + + // Otherwise look for partial match + final String typeOnly = mimeType.split("/")[0]; + if ("audio".equals(typeOnly)) { + return res.getDrawable(R.drawable.ic_doc_audio); + } else if ("image".equals(typeOnly)) { + return res.getDrawable(R.drawable.ic_doc_image); + } else if ("text".equals(typeOnly)) { + return res.getDrawable(R.drawable.ic_doc_text); + } else if ("video".equals(typeOnly)) { + return res.getDrawable(R.drawable.ic_doc_video); + } else { + // TODO: generic icon? + return null; + } + } +} diff --git a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java index 15ad061ac66f..b55ce820f25e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java +++ b/packages/DocumentsUI/src/com/android/documentsui/MimePredicate.java @@ -31,8 +31,18 @@ public class MimePredicate implements Predicate<DocumentInfo> { if (doc.isDirectory()) { return true; } - for (String filter : mFilters) { - if (mimeMatches(filter, doc.mimeType)) { + if (mimeMatches(mFilters, doc.mimeType)) { + return true; + } + return false; + } + + public static boolean mimeMatches(String[] filters, String[] tests) { + if (tests == null) { + return false; + } + for (String test : tests) { + if (mimeMatches(filters, test)) { return true; } } @@ -40,6 +50,9 @@ public class MimePredicate implements Predicate<DocumentInfo> { } public static boolean mimeMatches(String filter, String[] tests) { + if (tests == null) { + return true; + } for (String test : tests) { if (mimeMatches(filter, test)) { return true; @@ -48,13 +61,25 @@ public class MimePredicate implements Predicate<DocumentInfo> { return false; } + public static boolean mimeMatches(String[] filters, String test) { + if (filters == null) { + return true; + } + for (String filter : filters) { + if (mimeMatches(filter, test)) { + return true; + } + } + return false; + } + public static boolean mimeMatches(String filter, String test) { - if (test == null) { + if (filter == null || "*/*".equals(filter)) { + return true; + } else if (test == null) { return false; } else if (filter.equals(test)) { return true; - } else if ("*/*".equals(filter)) { - return true; } else if (filter.endsWith("/*")) { return filter.regionMatches(0, test, 0, filter.indexOf('/')); } else { diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java index 756a29796039..57442a030697 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentLoader.java @@ -17,6 +17,9 @@ package com.android.documentsui; import static com.android.documentsui.DocumentsActivity.TAG; +import static com.android.documentsui.DocumentsActivity.State.MODE_GRID; +import static com.android.documentsui.DocumentsActivity.State.MODE_LIST; +import static com.android.documentsui.DocumentsActivity.State.SORT_ORDER_LAST_MODIFIED; import android.content.AsyncTaskLoader; import android.content.ContentProviderClient; @@ -79,6 +82,7 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } private final List<RootInfo> mRoots; + private final String[] mAcceptMimes; private final HashMap<RootInfo, RecentTask> mTasks = Maps.newHashMap(); @@ -135,9 +139,10 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } } - public RecentLoader(Context context, List<RootInfo> roots) { + public RecentLoader(Context context, List<RootInfo> roots, String[] acceptMimes) { super(context); mRoots = roots; + mAcceptMimes = acceptMimes; } @Override @@ -171,7 +176,15 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { for (RecentTask task : mTasks.values()) { if (task.isDone()) { try { - cursors.add(task.get()); + final Cursor cursor = task.get(); + final FilteringCursorWrapper filtered = new FilteringCursorWrapper( + cursor, mAcceptMimes) { + @Override + public void close() { + // Ignored, since we manage cursor lifecycle internally + } + }; + cursors.add(filtered); } catch (InterruptedException e) { throw new RuntimeException(e); } catch (ExecutionException e) { @@ -181,15 +194,14 @@ public class RecentLoader extends AsyncTaskLoader<DirectoryResult> { } final DirectoryResult result = new DirectoryResult(); + + final boolean acceptImages = MimePredicate.mimeMatches("image/*", mAcceptMimes); + result.mode = acceptImages ? MODE_GRID : MODE_LIST; + result.sortOrder = SORT_ORDER_LAST_MODIFIED; + if (cursors.size() > 0) { final MergeCursor merged = new MergeCursor(cursors.toArray(new Cursor[cursors.size()])); - final SortingCursorWrapper sorted = new SortingCursorWrapper( - merged, State.SORT_ORDER_LAST_MODIFIED) { - @Override - public void close() { - // Ignored, since we manage cursor lifecycle internally - } - }; + final SortingCursorWrapper sorted = new SortingCursorWrapper(merged, result.sortOrder); result.cursor = sorted; } return result; diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java index fd7293d46b87..9391ca927e62 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java @@ -41,8 +41,8 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.RootInfo; import com.google.android.collect.Lists; import libcore.io.IoUtils; @@ -128,7 +128,7 @@ public class RecentsCreateFragment extends Fragment { public static class RecentsCreateLoader extends UriDerivativeLoader<Uri, List<DocumentStack>> { public RecentsCreateLoader(Context context) { - super(context, RecentsProvider.buildRecentCreate()); + super(context, RecentsProvider.buildRecent()); } @Override @@ -137,14 +137,14 @@ public class RecentsCreateFragment extends Fragment { final ContentResolver resolver = getContext().getContentResolver(); final Cursor cursor = resolver.query( - uri, null, null, null, RecentsProvider.COL_TIMESTAMP + " DESC", signal); + uri, null, null, null, RecentColumns.TIMESTAMP + " DESC", signal); try { while (cursor != null && cursor.moveToNext()) { - final byte[] raw = cursor.getBlob( - cursor.getColumnIndex(RecentsProvider.COL_PATH)); + final byte[] rawStack = cursor.getBlob( + cursor.getColumnIndex(RecentColumns.STACK)); try { final DocumentStack stack = new DocumentStack(); - stack.read(new DataInputStream(new ByteArrayInputStream(raw))); + stack.read(new DataInputStream(new ByteArrayInputStream(rawStack))); result.add(stack); } catch (IOException e) { Log.w(TAG, "Failed to resolve stack: " + e); @@ -181,11 +181,9 @@ public class RecentsCreateFragment extends Fragment { final ImageView icon = (ImageView) convertView.findViewById(android.R.id.icon); final TextView title = (TextView) convertView.findViewById(android.R.id.title); - final View summaryList = convertView.findViewById(R.id.summary_list); final DocumentStack stack = getItem(position); - final RootInfo root = stack.getRoot(roots); - icon.setImageDrawable(root.loadIcon(context)); + icon.setImageDrawable(stack.root.loadIcon(context)); final StringBuilder builder = new StringBuilder(); for (int i = stack.size() - 1; i >= 0; i--) { @@ -197,8 +195,6 @@ public class RecentsCreateFragment extends Fragment { title.setText(builder.toString()); title.setEllipsize(TruncateAt.MIDDLE); - summaryList.setVisibility(View.GONE); - return convertView; } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java index 0c87783673a9..df7ed4a6b77e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java @@ -25,51 +25,64 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.net.Uri; +import android.provider.DocumentsContract.Document; +import android.provider.DocumentsContract.Root; import android.text.format.DateUtils; import android.util.Log; public class RecentsProvider extends ContentProvider { private static final String TAG = "RecentsProvider"; - // TODO: offer view of recents that handles backend root resolution before - // returning cursor, include extra columns + public static final long MAX_HISTORY_IN_MILLIS = DateUtils.DAY_IN_MILLIS * 45; - public static final String AUTHORITY = "com.android.documentsui.recents"; + private static final String AUTHORITY = "com.android.documentsui.recents"; private static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH); - private static final int URI_RECENT_OPEN = 1; - private static final int URI_RECENT_CREATE = 2; + private static final int URI_RECENT = 1; + private static final int URI_STATE = 2; private static final int URI_RESUME = 3; static { - sMatcher.addURI(AUTHORITY, "recent_open", URI_RECENT_OPEN); - sMatcher.addURI(AUTHORITY, "recent_create", URI_RECENT_CREATE); + sMatcher.addURI(AUTHORITY, "recent", URI_RECENT); + // state/authority/rootId/docId + sMatcher.addURI(AUTHORITY, "state/*/*/*", URI_STATE); + // resume/packageName sMatcher.addURI(AUTHORITY, "resume/*", URI_RESUME); } - private static final String TABLE_RECENT_OPEN = "recent_open"; - private static final String TABLE_RECENT_CREATE = "recent_create"; - private static final String TABLE_RESUME = "resume"; - - /** - * String of URIs pointing at a storage backend, stored as a JSON array, - * starting with root. - */ - public static final String COL_PATH = "path"; - public static final String COL_URI = "uri"; - public static final String COL_PACKAGE_NAME = "package_name"; - public static final String COL_TIMESTAMP = "timestamp"; - - @Deprecated - public static Uri buildRecentOpen() { - return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("recent_open").build(); + public static final String TABLE_RECENT = "recent"; + public static final String TABLE_STATE = "state"; + public static final String TABLE_RESUME = "resume"; + + public static class RecentColumns { + public static final String STACK = "stack"; + public static final String TIMESTAMP = "timestamp"; + } + + public static class StateColumns { + public static final String AUTHORITY = "authority"; + public static final String ROOT_ID = Root.COLUMN_ROOT_ID; + public static final String DOCUMENT_ID = Document.COLUMN_DOCUMENT_ID; + public static final String MODE = "mode"; + public static final String SORT_ORDER = "sortOrder"; } - public static Uri buildRecentCreate() { + public static class ResumeColumns { + public static final String PACKAGE_NAME = "package_name"; + public static final String STACK = "stack"; + public static final String TIMESTAMP = "timestamp"; + } + + public static Uri buildRecent() { return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) - .authority(AUTHORITY).appendPath("recent_create").build(); + .authority(AUTHORITY).appendPath("recent").build(); + } + + public static Uri buildState(String authority, String rootId, String documentId) { + return new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT).authority(AUTHORITY) + .appendPath("state").appendPath(authority).appendPath(rootId).appendPath(documentId) + .build(); } public static Uri buildResume(String packageName) { @@ -83,35 +96,42 @@ public class RecentsProvider extends ContentProvider { private static final String DB_NAME = "recents.db"; private static final int VERSION_INIT = 1; + private static final int VERSION_AS_BLOB = 3; public DatabaseHelper(Context context) { - super(context, DB_NAME, null, VERSION_INIT); + super(context, DB_NAME, null, VERSION_AS_BLOB); } @Override public void onCreate(SQLiteDatabase db) { - db.execSQL("CREATE TABLE " + TABLE_RECENT_OPEN + " (" + - COL_URI + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_TIMESTAMP + " INTEGER" + + + db.execSQL("CREATE TABLE " + TABLE_RECENT + " (" + + RecentColumns.STACK + " BLOB PRIMARY KEY ON CONFLICT REPLACE," + + RecentColumns.TIMESTAMP + " INTEGER" + ")"); - db.execSQL("CREATE TABLE " + TABLE_RECENT_CREATE + " (" + - COL_PATH + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_TIMESTAMP + " INTEGER" + + db.execSQL("CREATE TABLE " + TABLE_STATE + " (" + + StateColumns.AUTHORITY + " TEXT," + + StateColumns.ROOT_ID + " TEXT," + + StateColumns.DOCUMENT_ID + " TEXT," + + StateColumns.MODE + " INTEGER," + + StateColumns.SORT_ORDER + " INTEGER," + + "PRIMARY KEY (" + StateColumns.AUTHORITY + ", " + StateColumns.ROOT_ID + ", " + + StateColumns.DOCUMENT_ID + ")" + ")"); db.execSQL("CREATE TABLE " + TABLE_RESUME + " (" + - COL_PACKAGE_NAME + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + - COL_PATH + " TEXT," + - COL_TIMESTAMP + " INTEGER" + + ResumeColumns.PACKAGE_NAME + " TEXT PRIMARY KEY ON CONFLICT REPLACE," + + ResumeColumns.STACK + " BLOB," + + ResumeColumns.TIMESTAMP + " INTEGER" + ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database; wiping app data"); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT_OPEN); - db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT_CREATE); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_RECENT); + db.execSQL("DROP TABLE IF EXISTS " + TABLE_STATE); db.execSQL("DROP TABLE IF EXISTS " + TABLE_RESUME); onCreate(db); } @@ -128,22 +148,23 @@ public class RecentsProvider extends ContentProvider { String sortOrder) { final SQLiteDatabase db = mHelper.getReadableDatabase(); switch (sMatcher.match(uri)) { - case URI_RECENT_OPEN: { - return db.query(TABLE_RECENT_OPEN, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); - } - case URI_RECENT_CREATE: { - return db.query(TABLE_RECENT_CREATE, projection, - buildWhereYounger(DateUtils.WEEK_IN_MILLIS), null, null, null, null); - } - case URI_RESUME: { + case URI_RECENT: + return db.query(TABLE_RECENT, projection, + RecentColumns.TIMESTAMP + "<" + MAX_HISTORY_IN_MILLIS, null, null, null, + null); + case URI_STATE: + final String authority = uri.getPathSegments().get(1); + final String rootId = uri.getPathSegments().get(2); + final String documentId = uri.getPathSegments().get(3); + return db.query(TABLE_STATE, projection, StateColumns.AUTHORITY + "=? AND " + + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", + new String[] { authority, rootId, documentId }, null, null, null); + case URI_RESUME: final String packageName = uri.getPathSegments().get(1); - return db.query(TABLE_RESUME, projection, COL_PACKAGE_NAME + "=?", + return db.query(TABLE_RESUME, projection, ResumeColumns.PACKAGE_NAME + "=?", new String[] { packageName }, null, null, null); - } - default: { + default: throw new UnsupportedOperationException("Unsupported Uri " + uri); - } } } @@ -156,28 +177,37 @@ public class RecentsProvider extends ContentProvider { public Uri insert(Uri uri, ContentValues values) { final SQLiteDatabase db = mHelper.getWritableDatabase(); switch (sMatcher.match(uri)) { - case URI_RECENT_OPEN: { - values.put(COL_TIMESTAMP, System.currentTimeMillis()); - db.insert(TABLE_RECENT_OPEN, null, values); - db.delete(TABLE_RECENT_OPEN, buildWhereOlder(DateUtils.WEEK_IN_MILLIS), null); + case URI_RECENT: + values.put(RecentColumns.TIMESTAMP, System.currentTimeMillis()); + db.insert(TABLE_RECENT, null, values); + db.delete( + TABLE_RECENT, RecentColumns.TIMESTAMP + ">" + MAX_HISTORY_IN_MILLIS, null); return uri; - } - case URI_RECENT_CREATE: { - values.put(COL_TIMESTAMP, System.currentTimeMillis()); - db.insert(TABLE_RECENT_CREATE, null, values); - db.delete(TABLE_RECENT_CREATE, buildWhereOlder(DateUtils.WEEK_IN_MILLIS), null); + case URI_STATE: + final String authority = uri.getPathSegments().get(1); + final String rootId = uri.getPathSegments().get(2); + final String documentId = uri.getPathSegments().get(3); + + final ContentValues key = new ContentValues(); + key.put(StateColumns.AUTHORITY, authority); + key.put(StateColumns.ROOT_ID, rootId); + key.put(StateColumns.DOCUMENT_ID, documentId); + + // Ensure that row exists, then update with changed values + db.insertWithOnConflict(TABLE_STATE, null, key, SQLiteDatabase.CONFLICT_IGNORE); + db.update(TABLE_STATE, values, StateColumns.AUTHORITY + "=? AND " + + StateColumns.ROOT_ID + "=? AND " + StateColumns.DOCUMENT_ID + "=?", + new String[] { authority, rootId, documentId }); + return uri; - } - case URI_RESUME: { + case URI_RESUME: final String packageName = uri.getPathSegments().get(1); - values.put(COL_PACKAGE_NAME, packageName); - values.put(COL_TIMESTAMP, System.currentTimeMillis()); + values.put(ResumeColumns.PACKAGE_NAME, packageName); + values.put(ResumeColumns.TIMESTAMP, System.currentTimeMillis()); db.insert(TABLE_RESUME, null, values); return uri; - } - default: { + default: throw new UnsupportedOperationException("Unsupported Uri " + uri); - } } } @@ -190,12 +220,4 @@ public class RecentsProvider extends ContentProvider { public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException("Unsupported Uri " + uri); } - - private static String buildWhereOlder(long deltaMillis) { - return COL_TIMESTAMP + "<" + (System.currentTimeMillis() - deltaMillis); - } - - private static String buildWhereYounger(long deltaMillis) { - return COL_TIMESTAMP + ">" + (System.currentTimeMillis() - deltaMillis); - } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java index 0b10f197f82b..8530a9f9b100 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java @@ -21,15 +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.PackageManager; import android.content.pm.ProviderInfo; -import android.content.pm.ResolveInfo; import android.database.Cursor; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Root; import android.util.Log; @@ -76,7 +72,7 @@ public class RootsCache { // Create special root for recents final RootInfo root = new RootInfo(); root.rootType = Root.ROOT_TYPE_SHORTCUT; - root.icon = R.drawable.ic_dir; + root.icon = R.drawable.ic_root_recent; root.flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_CREATE; root.title = mContext.getString(R.string.root_recent); root.availableBytes = -1; @@ -153,35 +149,14 @@ public class RootsCache { return mRoots; } - /** - * Flags that declare explicit content types. - */ - private static final int FLAGS_CONTENT_MASK = Root.FLAG_PROVIDES_IMAGES - | Root.FLAG_PROVIDES_AUDIO | Root.FLAG_PROVIDES_VIDEO; - @GuardedBy("ActivityThread") public List<RootInfo> getMatchingRoots(State state) { + return getMatchingRoots(mRoots, state); + } - // Determine acceptable content flags - int includeFlags = 0; - for (String acceptMime : state.acceptMimes) { - final String[] type = acceptMime.split("/"); - if (type.length != 2) continue; - - if ("image".equals(type[0])) { - includeFlags |= Root.FLAG_PROVIDES_IMAGES; - } else if ("audio".equals(type[0])) { - includeFlags |= Root.FLAG_PROVIDES_AUDIO; - } else if ("video".equals(type[0])) { - includeFlags |= Root.FLAG_PROVIDES_VIDEO; - } else if ("*".equals(type[0])) { - includeFlags |= Root.FLAG_PROVIDES_IMAGES | Root.FLAG_PROVIDES_AUDIO - | Root.FLAG_PROVIDES_VIDEO; - } - } - + public static List<RootInfo> getMatchingRoots(List<RootInfo> roots, State state) { ArrayList<RootInfo> matching = Lists.newArrayList(); - for (RootInfo root : mRoots) { + for (RootInfo root : roots) { final boolean supportsCreate = (root.flags & Root.FLAG_SUPPORTS_CREATE) != 0; final boolean advanced = (root.flags & Root.FLAG_ADVANCED) != 0; final boolean localOnly = (root.flags & Root.FLAG_LOCAL_ONLY) != 0; @@ -193,36 +168,16 @@ public class RootsCache { // Exclude non-local devices when local only if (state.localOnly && !localOnly) continue; - if ((root.flags & FLAGS_CONTENT_MASK) != 0) { - // This root offers specific content, so only include if the - // caller asked for that content type. - if ((root.flags & includeFlags) == 0) { - // Sorry, no overlap. - continue; - } + // Only include roots that serve requested content + final boolean overlap = + MimePredicate.mimeMatches(root.derivedMimeTypes, state.acceptMimes) || + MimePredicate.mimeMatches(state.acceptMimes, root.derivedMimeTypes); + if (!overlap) { + continue; } matching.add(root); } return matching; } - - @GuardedBy("ActivityThread") - public static Drawable resolveDocumentIcon(Context context, String mimeType) { - if (Document.MIME_TYPE_DIR.equals(mimeType)) { - return context.getResources().getDrawable(R.drawable.ic_dir); - } else { - final PackageManager pm = context.getPackageManager(); - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setType(mimeType); - - final ResolveInfo activityInfo = pm.resolveActivity( - intent, PackageManager.MATCH_DEFAULT_ONLY); - if (activityInfo != null) { - return activityInfo.loadIcon(pm); - } else { - return null; - } - } - } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index ef3a31d86ee9..efb972d44c0a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -40,6 +40,7 @@ import com.android.documentsui.DocumentsActivity.State; import com.android.documentsui.SectionedListAdapter.SectionAdapter; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; +import com.android.internal.util.Objects; import java.util.Comparator; import java.util.List; @@ -78,6 +79,7 @@ public class RootsFragment extends Fragment { final View view = inflater.inflate(R.layout.fragment_roots, container, false); mList = (ListView) view.findViewById(android.R.id.list); mList.setOnItemClickListener(mItemListener); + mList.setChoiceMode(ListView.CHOICE_MODE_SINGLE); return view; } @@ -100,6 +102,21 @@ public class RootsFragment extends Fragment { mAdapter = new SectionedRootsAdapter(context, matchingRoots, includeApps); mList.setAdapter(mAdapter); + + onCurrentRootChanged(); + } + + public void onCurrentRootChanged() { + if (mAdapter == null) return; + + 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; + } + } } private OnItemClickListener mItemListener = new OnItemClickListener() { diff --git a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java index 8b0a97489a1e..dc5b64a82606 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/SaveFragment.java @@ -74,7 +74,7 @@ public class SaveFragment extends Fragment { final ImageView icon = (ImageView) view.findViewById(android.R.id.icon); icon.setImageDrawable( - RootsCache.resolveDocumentIcon(context, getArguments().getString(EXTRA_MIME_TYPE))); + IconUtils.loadMimeIcon(context, getArguments().getString(EXTRA_MIME_TYPE))); mDisplayName = (EditText) view.findViewById(android.R.id.title); mDisplayName.addTextChangedListener(mDisplayNameWatcher); diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java index 2405cb576977..7b7c3d53a075 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java @@ -33,10 +33,14 @@ import libcore.io.IoUtils; import libcore.io.Streams; import java.io.InputStream; +import java.io.OutputStream; public class TestActivity extends Activity { private static final String TAG = "TestActivity"; + private static final int CODE_READ = 42; + private static final int CODE_WRITE = 43; + private TextView mResult; @Override @@ -49,10 +53,10 @@ public class TestActivity extends Activity { view.setOrientation(LinearLayout.VERTICAL); final CheckBox multiple = new CheckBox(context); - multiple.setText("\nALLOW_MULTIPLE\n"); + multiple.setText("ALLOW_MULTIPLE"); view.addView(multiple); final CheckBox localOnly = new CheckBox(context); - localOnly.setText("\nLOCAL_ONLY\n"); + localOnly.setText("LOCAL_ONLY"); view.addView(localOnly); Button button; @@ -70,7 +74,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(intent, 42); + startActivityForResult(intent, CODE_READ); } }); view.addView(button); @@ -89,7 +93,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(intent, 42); + startActivityForResult(intent, CODE_READ); } }); view.addView(button); @@ -108,7 +112,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(intent, 42); + startActivityForResult(intent, CODE_READ); } }); view.addView(button); @@ -129,7 +133,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(intent, 42); + startActivityForResult(intent, CODE_READ); } }); view.addView(button); @@ -146,7 +150,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(intent, 42); + startActivityForResult(intent, CODE_WRITE); } }); view.addView(button); @@ -165,7 +169,7 @@ public class TestActivity extends Activity { if (localOnly.isChecked()) { intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true); } - startActivityForResult(Intent.createChooser(intent, "Kittens!"), 42); + startActivityForResult(Intent.createChooser(intent, "Kittens!"), CODE_READ); } }); view.addView(button); @@ -178,20 +182,45 @@ public class TestActivity extends Activity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - mResult.setText("resultCode=" + resultCode + ", data=" + String.valueOf(data)); - - final Uri uri = data != null ? data.getData() : null; - if (uri != null) { - InputStream is = null; - try { - is = getContentResolver().openInputStream(uri); - final int length = Streams.readFullyNoClose(is).length; - Log.d(TAG, "read length=" + length); - } catch (Exception e) { - Log.w(TAG, "Failed to read " + uri, e); - } finally { - IoUtils.closeQuietly(is); + mResult.setText(null); + String result = "resultCode=" + resultCode + ", data=" + String.valueOf(data); + + if (requestCode == CODE_READ) { + final Uri uri = data != null ? data.getData() : null; + if (uri != null) { + InputStream is = null; + try { + is = getContentResolver().openInputStream(uri); + final int length = Streams.readFullyNoClose(is).length; + result += "; read length=" + length; + } catch (Exception e) { + result += "; ERROR"; + Log.w(TAG, "Failed to read " + uri, e); + } finally { + IoUtils.closeQuietly(is); + } + } else { + result += "no uri?"; + } + } else if (requestCode == CODE_WRITE) { + final Uri uri = data != null ? data.getData() : null; + if (uri != null) { + OutputStream os = null; + try { + os = getContentResolver().openOutputStream(uri); + os.write("THE COMPLETE WORKS OF SHAKESPEARE".getBytes()); + } catch (Exception e) { + result += "; ERROR"; + Log.w(TAG, "Failed to write " + uri, e); + } finally { + IoUtils.closeQuietly(os); + } + } else { + result += "no uri?"; } } + + Log.d(TAG, result); + mResult.setText(result); } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java index 98742655edb7..c69103ef5d7e 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java @@ -18,12 +18,10 @@ package com.android.documentsui.model; import android.content.ContentProviderClient; import android.content.ContentResolver; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.ProviderInfo; import android.database.Cursor; -import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; @@ -36,15 +34,16 @@ import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.net.ProtocolException; -import java.util.Comparator; /** * Representation of a {@link Document}. */ -public class DocumentInfo implements Durable { +public class DocumentInfo implements Durable, Parcelable { private static final int VERSION_INIT = 1; + private static final int VERSION_SPLIT_URI = 2; - public Uri uri; + public String authority; + public String documentId; public String mimeType; public String displayName; public long lastModified; @@ -53,13 +52,17 @@ public class DocumentInfo implements Durable { public long size; public int icon; + /** Derived fields that aren't persisted */ + public Uri derivedUri; + public DocumentInfo() { reset(); } @Override public void reset() { - uri = null; + authority = null; + documentId = null; mimeType = null; displayName = null; lastModified = -1; @@ -67,6 +70,8 @@ public class DocumentInfo implements Durable { summary = null; size = -1; icon = 0; + + derivedUri = null; } @Override @@ -74,8 +79,10 @@ public class DocumentInfo implements Durable { final int version = in.readInt(); switch (version) { case VERSION_INIT: - final String rawUri = DurableUtils.readNullableString(in); - uri = rawUri != null ? Uri.parse(rawUri) : null; + throw new ProtocolException("Ignored upgrade"); + case VERSION_SPLIT_URI: + authority = DurableUtils.readNullableString(in); + documentId = DurableUtils.readNullableString(in); mimeType = DurableUtils.readNullableString(in); displayName = DurableUtils.readNullableString(in); lastModified = in.readLong(); @@ -83,6 +90,7 @@ public class DocumentInfo implements Durable { summary = DurableUtils.readNullableString(in); size = in.readLong(); icon = in.readInt(); + deriveFields(); break; default: throw new ProtocolException("Unknown version " + version); @@ -91,8 +99,9 @@ public class DocumentInfo implements Durable { @Override public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_INIT); - DurableUtils.writeNullableString(out, uri.toString()); + out.writeInt(VERSION_SPLIT_URI); + DurableUtils.writeNullableString(out, authority); + DurableUtils.writeNullableString(out, documentId); DurableUtils.writeNullableString(out, mimeType); DurableUtils.writeNullableString(out, displayName); out.writeLong(lastModified); @@ -102,11 +111,41 @@ public class DocumentInfo implements Durable { out.writeInt(icon); } + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + DurableUtils.writeToParcel(dest, this); + } + + public static final Creator<DocumentInfo> CREATOR = new Creator<DocumentInfo>() { + @Override + public DocumentInfo createFromParcel(Parcel in) { + final DocumentInfo doc = new DocumentInfo(); + DurableUtils.readFromParcel(in, doc); + return doc; + } + + @Override + public DocumentInfo[] newArray(int size) { + return new DocumentInfo[size]; + } + }; + public static DocumentInfo fromDirectoryCursor(Cursor cursor) { - final DocumentInfo doc = new DocumentInfo(); final String authority = getCursorString(cursor, RootCursorWrapper.COLUMN_AUTHORITY); - final String docId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); - doc.uri = DocumentsContract.buildDocumentUri(authority, docId); + return fromCursor(cursor, authority); + } + + public static DocumentInfo fromCursor(Cursor cursor, String authority) { + final DocumentInfo doc = new DocumentInfo(); + doc.authority = authority; + doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); + doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); + doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID); doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); @@ -114,6 +153,7 @@ public class DocumentInfo implements Durable { doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY); doc.size = getCursorLong(cursor, Document.COLUMN_SIZE); doc.icon = getCursorInt(cursor, Document.COLUMN_ICON); + doc.deriveFields(); return doc; } @@ -126,16 +166,7 @@ public class DocumentInfo implements Durable { if (!cursor.moveToFirst()) { throw new FileNotFoundException("Missing details for " + uri); } - final DocumentInfo doc = new DocumentInfo(); - doc.uri = uri; - doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE); - doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME); - doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED); - doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS); - doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY); - doc.size = getCursorLong(cursor, Document.COLUMN_SIZE); - doc.icon = getCursorInt(cursor, Document.COLUMN_ICON); - return doc; + return fromCursor(cursor, uri.getAuthority()); } catch (Throwable t) { throw asFileNotFoundException(t); } finally { @@ -144,9 +175,13 @@ public class DocumentInfo implements Durable { } } + private void deriveFields() { + derivedUri = DocumentsContract.buildDocumentUri(authority, documentId); + } + @Override public String toString() { - return "Document{name=" + displayName + ", uri=" + uri + "}"; + return "Document{name=" + displayName + ", docId=" + documentId + "}"; } public boolean isCreateSupported() { @@ -173,25 +208,6 @@ public class DocumentInfo implements Durable { return (flags & Document.FLAG_SUPPORTS_DELETE) != 0; } - public Drawable loadIcon(Context context) { - return loadIcon(context, uri.getAuthority(), icon); - } - - public static Drawable loadIcon(Context context, String authority, int icon) { - if (icon != 0) { - if (authority != null) { - final PackageManager pm = context.getPackageManager(); - final ProviderInfo info = pm.resolveContentProvider(authority, 0); - if (info != null) { - return pm.getDrawable(info.packageName, icon, info.applicationInfo); - } - } else { - return context.getResources().getDrawable(icon); - } - } - return null; - } - public static String getCursorString(Cursor cursor, String columnName) { final int index = cursor.getColumnIndex(columnName); return (index != -1) ? cursor.getString(index) : null; @@ -212,42 +228,14 @@ public class DocumentInfo implements Durable { } } + /** + * Missing or null values are returned as 0. + */ public static int getCursorInt(Cursor cursor, String columnName) { final int index = cursor.getColumnIndex(columnName); return (index != -1) ? cursor.getInt(index) : 0; } - @Deprecated - public static class DisplayNameComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - final boolean leftDir = lhs.isDirectory(); - final boolean rightDir = rhs.isDirectory(); - - if (leftDir != rightDir) { - return leftDir ? -1 : 1; - } else { - return compareToIgnoreCaseNullable(lhs.displayName, rhs.displayName); - } - } - } - - @Deprecated - public static class LastModifiedComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - return Long.compare(rhs.lastModified, lhs.lastModified); - } - } - - @Deprecated - public static class SizeComparator implements Comparator<DocumentInfo> { - @Override - public int compare(DocumentInfo lhs, DocumentInfo rhs) { - return Long.compare(rhs.size, lhs.size); - } - } - public static FileNotFoundException asFileNotFoundException(Throwable t) throws FileNotFoundException { if (t instanceof FileNotFoundException) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java index 33a1376e2144..254144065f8a 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java @@ -16,8 +16,6 @@ package com.android.documentsui.model; -import com.android.documentsui.RootsCache; - import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; @@ -30,14 +28,13 @@ import java.util.LinkedList; */ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { private static final int VERSION_INIT = 1; + private static final int VERSION_ADD_ROOT = 2; - public RootInfo getRoot(RootsCache roots) { - return roots.findRoot(getLast().uri); - } + public RootInfo root; - public String getTitle(RootsCache roots) { - if (size() == 1) { - return getRoot(roots).title; + public String getTitle() { + if (size() == 1 && root != null) { + return root.title; } else if (size() > 1) { return peek().displayName; } else { @@ -52,6 +49,7 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { @Override public void reset() { clear(); + root = null; } @Override @@ -59,6 +57,12 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { final int version = in.readInt(); switch (version) { case VERSION_INIT: + throw new ProtocolException("Ignored upgrade"); + case VERSION_ADD_ROOT: + if (in.readBoolean()) { + root = new RootInfo(); + root.read(in); + } final int size = in.readInt(); for (int i = 0; i < size; i++) { final DocumentInfo doc = new DocumentInfo(); @@ -73,7 +77,13 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable { @Override public void write(DataOutputStream out) throws IOException { - out.writeInt(VERSION_INIT); + out.writeInt(VERSION_ADD_ROOT); + if (root != null) { + out.writeBoolean(true); + root.write(out); + } else { + out.writeBoolean(false); + } final int size = size(); out.writeInt(size); for (int i = 0; i < size; i++) { diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java index 189284b2d97e..e0e8acf98ece 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java +++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java @@ -23,14 +23,25 @@ import static com.android.documentsui.model.DocumentInfo.getCursorString; import android.content.Context; import android.database.Cursor; import android.graphics.drawable.Drawable; +import android.os.Parcel; +import android.os.Parcelable; import android.provider.DocumentsContract.Root; +import com.android.documentsui.IconUtils; +import com.android.documentsui.R; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.ProtocolException; import java.util.Objects; /** * Representation of a {@link Root}. */ -public class RootInfo { +public class RootInfo implements Durable, Parcelable { + private static final int VERSION_INIT = 1; + public String authority; public String rootId; public int rootType; @@ -40,6 +51,93 @@ public class RootInfo { public String summary; public String documentId; public long availableBytes; + public String mimeTypes; + + /** Derived fields that aren't persisted */ + public String[] derivedMimeTypes; + public int derivedIcon; + + public RootInfo() { + reset(); + } + + @Override + public void reset() { + authority = null; + rootId = null; + rootType = 0; + flags = 0; + icon = 0; + title = null; + summary = null; + documentId = null; + availableBytes = -1; + mimeTypes = null; + + derivedMimeTypes = null; + derivedIcon = 0; + } + + @Override + public void read(DataInputStream in) throws IOException { + final int version = in.readInt(); + switch (version) { + case VERSION_INIT: + authority = DurableUtils.readNullableString(in); + rootId = DurableUtils.readNullableString(in); + rootType = in.readInt(); + flags = in.readInt(); + icon = in.readInt(); + title = DurableUtils.readNullableString(in); + summary = DurableUtils.readNullableString(in); + documentId = DurableUtils.readNullableString(in); + availableBytes = in.readLong(); + mimeTypes = DurableUtils.readNullableString(in); + deriveFields(); + break; + default: + throw new ProtocolException("Unknown version " + version); + } + } + + @Override + public void write(DataOutputStream out) throws IOException { + out.writeInt(VERSION_INIT); + DurableUtils.writeNullableString(out, authority); + DurableUtils.writeNullableString(out, rootId); + out.writeInt(rootType); + out.writeInt(flags); + out.writeInt(icon); + DurableUtils.writeNullableString(out, title); + DurableUtils.writeNullableString(out, summary); + DurableUtils.writeNullableString(out, documentId); + out.writeLong(availableBytes); + DurableUtils.writeNullableString(out, mimeTypes); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + DurableUtils.writeToParcel(dest, this); + } + + public static final Creator<RootInfo> CREATOR = new Creator<RootInfo>() { + @Override + public RootInfo createFromParcel(Parcel in) { + final RootInfo root = new RootInfo(); + DurableUtils.readFromParcel(in, root); + return root; + } + + @Override + public RootInfo[] newArray(int size) { + return new RootInfo[size]; + } + }; public static RootInfo fromRootsCursor(String authority, Cursor cursor) { final RootInfo root = new RootInfo(); @@ -52,11 +150,41 @@ public class RootInfo { root.summary = getCursorString(cursor, Root.COLUMN_SUMMARY); root.documentId = getCursorString(cursor, Root.COLUMN_DOCUMENT_ID); root.availableBytes = getCursorLong(cursor, Root.COLUMN_AVAILABLE_BYTES); + root.mimeTypes = getCursorString(cursor, Root.COLUMN_MIME_TYPES); + root.deriveFields(); return root; } + private void deriveFields() { + derivedMimeTypes = (mimeTypes != null) ? mimeTypes.split("\n") : null; + + // TODO: remove these special case icons + if ("com.android.externalstorage.documents".equals(authority)) { + derivedIcon = R.drawable.ic_root_sdcard; + } + if ("com.android.providers.downloads.documents".equals(authority)) { + derivedIcon = R.drawable.ic_root_download; + } + if ("com.android.providers.media.documents".equals(authority)) { + if ("image".equals(rootId)) { + derivedIcon = R.drawable.ic_doc_image; + } else if ("audio".equals(rootId)) { + derivedIcon = R.drawable.ic_doc_audio; + } + } + } + + @Override + public String toString() { + return "Root{title=" + title + ", rootId=" + rootId + "}"; + } + public Drawable loadIcon(Context context) { - return DocumentInfo.loadIcon(context, authority, icon); + if (derivedIcon != 0) { + return context.getResources().getDrawable(derivedIcon); + } else { + return IconUtils.loadPackageIcon(context, authority, icon); + } } @Override diff --git a/packages/DocumentsUI/tests/Android.mk b/packages/DocumentsUI/tests/Android.mk new file mode 100644 index 000000000000..fdf4fabacce0 --- /dev/null +++ b/packages/DocumentsUI/tests/Android.mk @@ -0,0 +1,16 @@ + +LOCAL_PATH := $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-java-files-under, src) + +LOCAL_JAVA_LIBRARIES := android.test.runner + +LOCAL_PACKAGE_NAME := DocumentsUITests +LOCAL_INSTRUMENTATION_FOR := DocumentsUI + +LOCAL_CERTIFICATE := platform + +include $(BUILD_PACKAGE) diff --git a/packages/DocumentsUI/tests/AndroidManifest.xml b/packages/DocumentsUI/tests/AndroidManifest.xml new file mode 100644 index 000000000000..81a2889a8ee9 --- /dev/null +++ b/packages/DocumentsUI/tests/AndroidManifest.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.documentsui.tests"> + + <application> + <uses-library android:name="android.test.runner" /> + </application> + + <instrumentation android:name="android.test.InstrumentationTestRunner" + android:targetPackage="com.android.documentsui" + android:label="Tests for DocumentsUI" /> + +</manifest> diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java new file mode 100644 index 000000000000..f53e60dcfcaf --- /dev/null +++ b/packages/DocumentsUI/tests/src/com/android/documentsui/RootsCacheTest.java @@ -0,0 +1,123 @@ +/* + * 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.documentsui; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +import com.android.documentsui.DocumentsActivity.State; +import com.android.documentsui.model.RootInfo; +import com.google.android.collect.Lists; + +import java.util.List; + +@SmallTest +public class RootsCacheTest extends AndroidTestCase { + + private static RootInfo buildForMimeTypes(String... mimeTypes) { + final RootInfo root = new RootInfo(); + root.mimeTypes = mimeTypes; + return root; + } + + private RootInfo mNull = new RootInfo(); + private RootInfo mEmpty = buildForMimeTypes(); + private RootInfo mWild = buildForMimeTypes("*/*"); + private RootInfo mImages = buildForMimeTypes("image/*"); + private RootInfo mAudio = buildForMimeTypes("audio/*", "application/ogg", "application/x-flac"); + private RootInfo mDocs = buildForMimeTypes("application/msword", "application/vnd.ms-excel"); + private RootInfo mMalformed1 = buildForMimeTypes("meow"); + private RootInfo mMalformed2 = buildForMimeTypes("*/meow"); + + private List<RootInfo> mRoots = Lists.newArrayList( + mNull, mWild, mEmpty, mImages, mAudio, mDocs, mMalformed1, mMalformed2); + + private State mState; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + mState = new State(); + mState.action = State.ACTION_OPEN; + mState.showAdvanced = true; + mState.localOnly = false; + } + + public void testMatchingRootsEverything() throws Exception { + mState.acceptMimes = new String[] { "*/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsPngOrWild() throws Exception { + mState.acceptMimes = new String[] { "image/png", "*/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mImages, mAudio, mDocs, mMalformed1, mMalformed2), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioWild() throws Exception { + mState.acceptMimes = new String[] { "audio/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioWildOrImageWild() throws Exception { + mState.acceptMimes = new String[] { "audio/*", "image/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mImages), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsAudioSpecific() throws Exception { + mState.acceptMimes = new String[] { "audio/mpeg" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsDocument() throws Exception { + mState.acceptMimes = new String[] { "application/msword" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mDocs), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsApplication() throws Exception { + mState.acceptMimes = new String[] { "application/*" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mDocs), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + public void testMatchingRootsFlacOrPng() throws Exception { + mState.acceptMimes = new String[] { "application/x-flac", "image/png" }; + assertContainsExactly( + Lists.newArrayList(mNull, mWild, mAudio, mImages), + RootsCache.getMatchingRoots(mRoots, mState)); + } + + private static void assertContainsExactly(List<?> expected, List<?> actual) { + assertEquals(expected.size(), actual.size()); + for (Object o : expected) { + assertTrue(actual.contains(o)); + } + } +} diff --git a/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png b/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png Binary files differdeleted file mode 100644 index 961a9bbfcfcf..000000000000 --- a/packages/ExternalStorageProvider/res/drawable-hdpi/ic_pdf.png +++ /dev/null diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java index bbe3b455f54c..226d6351e96f 100644 --- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java +++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java @@ -88,7 +88,6 @@ public class ExternalStorageProvider extends DocumentsProvider { root.rootId = "primary"; root.rootType = Root.ROOT_TYPE_DEVICE; root.flags = Root.FLAG_SUPPORTS_CREATE | Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED; - root.icon = R.drawable.ic_pdf; root.title = getContext().getString(R.string.root_internal_storage); root.docId = getDocIdForFile(path); mRoots.add(root); diff --git a/packages/InputDevices/Android.mk b/packages/InputDevices/Android.mk index 095655c6514a..f537022c6129 100644 --- a/packages/InputDevices/Android.mk +++ b/packages/InputDevices/Android.mk @@ -30,14 +30,20 @@ include $(BUILD_PACKAGE) # Validate all key maps. include $(CLEAR_VARS) -validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX) -files := frameworks/base/packages/InputDevices/res/raw/*.kcm - LOCAL_MODULE := validate_input_devices_keymaps -LOCAL_MODULE_TAGS := optional -LOCAL_REQUIRED_MODULES := validatekeymaps +intermediates := $(call intermediates-dir-for,ETC,$(LOCAL_MODULE),,COMMON) +LOCAL_BUILT_MODULE := $(intermediates)/stamp -validate_input_devices_keymaps: $(files) - $(hide) $(validatekeymaps) $(files) - -include $(BUILD_PHONY_PACKAGE) +validatekeymaps := $(HOST_OUT_EXECUTABLES)/validatekeymaps$(HOST_EXECUTABLE_SUFFIX) +input_devices_keymaps := $(wildcard $(LOCAL_PATH)/res/raw/*.kcm) +$(LOCAL_BUILT_MODULE): PRIVATE_VALIDATEKEYMAPS := $(validatekeymaps) +$(LOCAL_BUILT_MODULE) : $(input_devices_keymaps) | $(validatekeymaps) + $(hide) $(PRIVATE_VALIDATEKEYMAPS) $^ + $(hide) mkdir -p $(dir $@) && touch $@ + +# Run validatekeymaps unconditionally for platform build. +droidcore all_modules : $(LOCAL_BUILT_MODULE) + +# Reset temp vars. +validatekeymaps := +input_devices_keymaps := diff --git a/packages/Keyguard/AndroidManifest.xml b/packages/Keyguard/AndroidManifest.xml index 7d77c48b5636..d2c82c844835 100644 --- a/packages/Keyguard/AndroidManifest.xml +++ b/packages/Keyguard/AndroidManifest.xml @@ -37,6 +37,8 @@ <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" /> <uses-permission android:name="android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> + <!-- Permission to perform hotword recognition --> + <uses-permission android:name="android.permission.HOTWORD_RECOGNITION" /> <application android:label="@string/app_name" android:process="com.android.systemui" diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java index eedb7d06e8fe..78b842cd474c 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardHostView.java @@ -24,6 +24,7 @@ import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityOptions; import android.app.AlertDialog; +import android.app.PendingIntent; import android.app.SearchManager; import android.app.admin.DevicePolicyManager; import android.appwidget.AppWidgetHost; @@ -40,6 +41,7 @@ import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Rect; import android.media.RemoteControlClient; +import android.os.Bundle; import android.os.Looper; import android.os.Parcel; import android.os.Parcelable; @@ -47,6 +49,9 @@ import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.speech.hotword.HotwordRecognitionListener; +import android.speech.hotword.HotwordRecognizer; +import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; import android.util.Slog; @@ -63,6 +68,11 @@ import java.util.List; public class KeyguardHostView extends KeyguardViewBase { private static final String TAG = "KeyguardHostView"; + // Don't enable hotword on limited-memory devices. + private static final boolean ENABLE_HOTWORD = !ActivityManager.isLowRamDeviceStatic(); + // Indicates if hotword is enabled, should it also be available on secure keyguard(s). + private static final boolean ENABLE_HOTWORD_SECURE = false; + // Transport control states. static final int TRANSPORT_GONE = 0; static final int TRANSPORT_INVISIBLE = 1; @@ -77,6 +87,13 @@ public class KeyguardHostView extends KeyguardViewBase { // Found in KeyguardAppWidgetPickActivity.java static final int APPWIDGET_HOST_ID = 0x4B455947; + // TODO: Fix this to be non-static. + // We need to be careful here to make stopRecognition calls on the same instance + // that started it. Since KeyguardHostView is a view, it keeps getting + // recreated every now and then, and unless we figure out a better way, + // this needs to be a static field. + private static HotwordRecognizer sHotwordClient; + private final int MAX_WIDGETS = 5; private AppWidgetHost mAppWidgetHost; @@ -117,6 +134,8 @@ public class KeyguardHostView extends KeyguardViewBase { private KeyguardMultiUserSelectorView mKeyguardMultiUserSelectorView; + private boolean mIsScreenOn; + protected int mClientGeneration; protected boolean mShowSecurityWhenReturn; @@ -198,6 +217,11 @@ public class KeyguardHostView extends KeyguardViewBase { if ((mDisabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_SECURE_CAMERA) != 0) { Log.v(TAG, "Keyguard secure camera disabled by DPM"); } + + // Create Hotword recognizer, for the first time. + if (ENABLE_HOTWORD && sHotwordClient == null) { + sHotwordClient = HotwordRecognizer.createHotwordRecognizer(getContext()); + } } private void getInitialTransportState() { @@ -295,6 +319,21 @@ public class KeyguardHostView extends KeyguardViewBase { } } } + @Override + public void onPhoneStateChanged(int phoneState) { + // We need to stop hotword detection when a call state is not idle anymore. + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection) + && TelephonyManager.CALL_STATE_IDLE != phoneState) { + if (DEBUG) Log.d(TAG, "Stopping due to call state not being idle"); + maybeStopHotwordDetector(); + } + } + @Override + public void onUserSwitching(int userId) { + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStopHotwordDetector(); + } + } }; private static final boolean isMusicPlaying(int playbackState) { @@ -778,6 +817,9 @@ public class KeyguardHostView extends KeyguardViewBase { // If the alternate unlock was suppressed, it can now be safely // enabled because the user has left keyguard. KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)){ + maybeStopHotwordDetector(); + } // If there's a pending runnable because the user interacted with a widget // and we're leaving keyguard, then run it. @@ -942,6 +984,9 @@ public class KeyguardHostView extends KeyguardViewBase { // Emulate Activity life cycle if (oldView != null) { + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStopHotwordDetector(); + } oldView.onPause(); oldView.setKeyguardCallback(mNullCallback); // ignore requests from old view } @@ -982,6 +1027,7 @@ public class KeyguardHostView extends KeyguardViewBase { @Override public void onScreenTurnedOn() { if (DEBUG) Log.d(TAG, "screen on, instance " + Integer.toHexString(hashCode())); + mIsScreenOn = true; showPrimarySecurityScreen(false); getSecurityView(mCurrentSecuritySelection).onResume(KeyguardSecurityView.SCREEN_ON); @@ -993,6 +1039,12 @@ public class KeyguardHostView extends KeyguardViewBase { if (mViewStateManager != null) { mViewStateManager.showUsabilityHints(); } + + // Start hotword detection on insecure Keyguard. + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStartHotwordDetector(); + } + requestFocus(); } @@ -1000,6 +1052,7 @@ public class KeyguardHostView extends KeyguardViewBase { public void onScreenTurnedOff() { if (DEBUG) Log.d(TAG, String.format("screen off, instance %s at %s", Integer.toHexString(hashCode()), SystemClock.uptimeMillis())); + mIsScreenOn = false; // Once the screen turns off, we no longer consider this to be first boot and we want the // biometric unlock to start next time keyguard is shown. KeyguardUpdateMonitor.getInstance(mContext).setAlternateUnlockEnabled(true); @@ -1013,6 +1066,12 @@ public class KeyguardHostView extends KeyguardViewBase { if (cameraPage != null) { cameraPage.onScreenTurnedOff(); } + + // Stop hotword detection on insecure Keyguard. + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStopHotwordDetector(); + } + clearFocus(); } @@ -1097,6 +1156,9 @@ public class KeyguardHostView extends KeyguardViewBase { new CameraWidgetFrame.Callbacks() { @Override public void onLaunchingCamera() { + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStopHotwordDetector(); + } setSliderHandleAlpha(0); } @@ -1626,6 +1688,9 @@ public class KeyguardHostView extends KeyguardViewBase { } public void showAssistant() { + if (shouldRunHotwordInSecurityMode(mCurrentSecuritySelection)) { + maybeStopHotwordDetector(); + } final Intent intent = ((SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE)) .getAssistIntent(mContext, true, UserHandle.USER_CURRENT); @@ -1640,4 +1705,123 @@ public class KeyguardHostView extends KeyguardViewBase { mActivityLauncher.launchActivityWithAnimation( intent, false, opts.toBundle(), null, null); } + + + /** + * Start the hotword detector if: + * <li> ENABLE_HOTWORD is true and + * <li> Hotword detection is not already running and + * <li> TelephonyManager is in CALL_STATE_IDLE + * <li> and Screen is turned on. + */ + private void maybeStartHotwordDetector() { + if (!ENABLE_HOTWORD) return; + + if (sHotwordClient != null) { + if (DEBUG) Log.d(TAG, "maybeStartHotwordDetector()"); + // Don't start hotword detection if the screen is off. + if (!mIsScreenOn) { + if (DEBUG) Log.d(TAG, "screen was off, not starting"); + return; + } + + KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext()); + if (monitor.getPhoneState() != TelephonyManager.CALL_STATE_IDLE) { + if (DEBUG) Log.d(TAG, "Call underway, not starting"); + return; + } + + try { + sHotwordClient.startRecognition(mHotwordCallback); + } catch(Exception ex) { + // Don't allow hotword errors to make the keyguard unusable + Log.e(TAG, "Failed to start hotword recognition", ex); + sHotwordClient = null; + } + } + } + + /** + * Stop hotword detector if: + * <li> ENABLE_HOTWORD is true + * <li> and hotword is running. + */ + private void maybeStopHotwordDetector() { + if (!ENABLE_HOTWORD) return; + + if (sHotwordClient != null) { + if (DEBUG) Log.d(TAG, "maybeStopHotwordDetector()"); + try { + sHotwordClient.stopRecognition(); + } catch(Exception ex) { + // Don't allow hotword errors to make the keyguard unusable + Log.e(TAG, "Failed to start hotword recognition", ex); + } finally { + sHotwordClient = null; + } + } + } + + private final HotwordRecognitionListener mHotwordCallback = new HotwordRecognitionListener() { + private static final String TAG = "HotwordRecognitionListener"; + + public void onHotwordRecognitionStarted() { + if (DEBUG) Log.d(TAG, "onHotwordRecognitionStarted()"); + } + + public void onHotwordRecognitionStopped() { + if (DEBUG) Log.d(TAG, "onHotwordRecognitionStopped()"); + } + + public void onHotwordEvent(int eventType, Bundle eventBundle) { + if (DEBUG) Log.d(TAG, "onHotwordEvent: " + eventType); + if (eventType == HotwordRecognizer.EVENT_TYPE_STATE_CHANGED) { + if (eventBundle != null && eventBundle.containsKey(HotwordRecognizer.PROMPT_TEXT)) { + new KeyguardMessageArea.Helper( + (View) getSecurityView(mCurrentSecuritySelection)) + .setMessage(eventBundle.getString(HotwordRecognizer.PROMPT_TEXT),true); + } + } + } + + public void onHotwordRecognized(final Intent intent) { + if (DEBUG) Log.d(TAG, "onHotwordRecognized"); + maybeStopHotwordDetector(); + // See if an activity can handle this intent. + if (getContext().getPackageManager().resolveActivity(intent, 0) == null) + return; + if (SecurityMode.None == mCurrentSecuritySelection) { + if (intent != null) { + mActivityLauncher.launchActivity(intent, true, true, null, null); + } + mCallback.userActivity(0); + } else if (ENABLE_HOTWORD_SECURE && mLockPatternUtils.isSecure()) { + setOnDismissAction(new OnDismissAction() { + @Override + public boolean onDismiss() { + if (intent != null) { + mActivityLauncher.launchActivity(intent, true, true, null, null); + } + return false; + } + }); + getSecurityView(mCurrentSecuritySelection).showBouncer(0); + } + } + + public void onHotwordError(int errorCode) { + if (DEBUG) Log.d(TAG, "onHotwordError: " + errorCode); + // TODO: Inspect the error code and handle the errors appropriately + // instead of blindly failing. + maybeStopHotwordDetector(); + } + }; + + private boolean shouldRunHotwordInSecurityMode(SecurityMode mode) { + // Enable hotoword for insecure keyguard, + // and for pattern unlock if ENABLE_HOTWORD_SECURE is true. + return ENABLE_HOTWORD + && ((SecurityMode.None == mode) + || (ENABLE_HOTWORD_SECURE && mLockPatternUtils.isSecure())); + } } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java index 40d55cf479e6..63be102451a1 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSelectorView.java @@ -28,8 +28,6 @@ import android.os.Bundle; import android.os.PowerManager; import android.os.UserHandle; import android.provider.Settings; -import android.speech.hotword.HotwordRecognitionListener; -import android.speech.hotword.HotwordRecognizer; import android.telephony.TelephonyManager; import android.util.AttributeSet; import android.util.Log; @@ -48,12 +46,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri private static final String ASSIST_ICON_METADATA_NAME = "com.android.systemui.action_assist_icon"; - // Don't enable hotword on limited-memory devices. - private static final boolean ENABLE_HOTWORD = !ActivityManager.isLowRamDeviceStatic(); - - // TODO: Fix this to be non-static. - private static HotwordRecognizer sHotwordClient; - private KeyguardSecurityCallback mCallback; private GlowPadView mGlowPadView; private ObjectAnimator mAnim; @@ -69,7 +61,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri public void onTrigger(View v, int target) { final int resId = mGlowPadView.getResourceIdForTarget(target); - maybeStopHotwordDetector(); switch (resId) { case R.drawable.ic_action_assist_generic: @@ -129,22 +120,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri public void onSimStateChanged(State simState) { updateTargets(); } - - @Override - public void onPhoneStateChanged(int phoneState) { - if (ENABLE_HOTWORD) { - // We need to stop hotword detection when a call state is not idle anymore. - if (phoneState != TelephonyManager.CALL_STATE_IDLE) { - if (DEBUG) Log.d(TAG, "Stopping due to call state not being idle"); - maybeStopHotwordDetector(); - } - } - } - - @Override - public void onUserSwitching(int userId) { - maybeStopHotwordDetector(); - } }; private final KeyguardActivityLauncher mActivityLauncher = new KeyguardActivityLauncher() { @@ -183,9 +158,6 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri mSecurityMessageDisplay = new KeyguardMessageArea.Helper(this); View bouncerFrameView = findViewById(R.id.keyguard_selector_view_frame); mBouncerFrame = bouncerFrameView.getBackground(); - if (ENABLE_HOTWORD && sHotwordClient == null) { - sHotwordClient = HotwordRecognizer.createHotwordRecognizer(getContext()); - } } public void setCarrierArea(View carrierArea) { @@ -289,20 +261,11 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri @Override public void onPause() { KeyguardUpdateMonitor.getInstance(getContext()).removeCallback(mUpdateCallback); - maybeStopHotwordDetector(); } @Override public void onResume(int reason) { KeyguardUpdateMonitor.getInstance(getContext()).registerCallback(mUpdateCallback); - // TODO: Figure out if there's a better way to do it. - // onResume gets called multiple times, however we are interested in - // the reason to figure out when to start/stop hotword detection. - if (reason == SCREEN_ON) { - if (!KeyguardUpdateMonitor.getInstance(getContext()).isSwitchingUser()) { - maybeStartHotwordDetector(); - } - } } @Override @@ -323,100 +286,4 @@ public class KeyguardSelectorView extends LinearLayout implements KeyguardSecuri KeyguardSecurityViewHelper. hideBouncer(mSecurityMessageDisplay, mFadeView, mBouncerFrame, duration); } - - /** - * Start the hotword detector if: - * <li> FLAG_HOTWORD is true and - * <li> Hotword detection is not already running and - * <li> TelephonyManager is in CALL_STATE_IDLE - * - * If this method is called when the screen is off, - * it attempts to stop hotword detection if it's running. - */ - private void maybeStartHotwordDetector() { - if (ENABLE_HOTWORD && sHotwordClient != null) { - if (DEBUG) Log.d(TAG, "maybeStartHotwordDetector()"); - // Don't start it if the screen is off or not showing - PowerManager powerManager = (PowerManager) getContext().getSystemService( - Context.POWER_SERVICE); - if (!powerManager.isScreenOn()) { - if (DEBUG) Log.d(TAG, "screen was off, not starting"); - return; - } - - KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(getContext()); - if (monitor.getPhoneState() != TelephonyManager.CALL_STATE_IDLE) { - if (DEBUG) Log.d(TAG, "Call underway, not starting"); - return; - } - - try { - sHotwordClient.startRecognition(mHotwordCallback); - } catch(Exception ex) { - // Don't allow hotword errors to make the keyguard unusable - Log.e(TAG, "Failed to start hotword recognition", ex); - sHotwordClient = null; - } - } - } - - /** - * Stop hotword detector if HOTWORDING_ENABLED is true. - */ - private void maybeStopHotwordDetector() { - if (ENABLE_HOTWORD && sHotwordClient != null) { - if (DEBUG) Log.d(TAG, "maybeStopHotwordDetector()"); - try { - sHotwordClient.stopRecognition(); - } catch(Exception ex) { - // Don't allow hotword errors to make the keyguard unusable - Log.e(TAG, "Failed to start hotword recognition", ex); - } finally { - sHotwordClient = null; - } - } - } - - private final HotwordRecognitionListener mHotwordCallback = new HotwordRecognitionListener() { - private static final String TAG = "HotwordRecognitionListener"; - - public void onHotwordRecognitionStarted() { - if (DEBUG) Log.d(TAG, "onHotwordRecognitionStarted()"); - } - - public void onHotwordRecognitionStopped() { - if (DEBUG) Log.d(TAG, "onHotwordRecognitionStopped()"); - } - - public void onHotwordEvent(int eventType, Bundle eventBundle) { - if (DEBUG) Log.d(TAG, "onHotwordEvent: " + eventType); - if (eventType == HotwordRecognizer.EVENT_TYPE_STATE_CHANGED) { - if (eventBundle != null && eventBundle.containsKey(HotwordRecognizer.PROMPT_TEXT)) { - mSecurityMessageDisplay.setMessage( - eventBundle.getString(HotwordRecognizer.PROMPT_TEXT), true); - } - } - } - - public void onHotwordRecognized(PendingIntent intent) { - if (DEBUG) Log.d(TAG, "onHotwordRecognized"); - maybeStopHotwordDetector(); - if (intent != null) { - try { - intent.send(); - } catch (PendingIntent.CanceledException e) { - Log.w(TAG, "Failed to launch PendingIntent. Encountered CanceledException"); - } - } - mCallback.userActivity(0); - mCallback.dismiss(false); - } - - public void onHotwordError(int errorCode) { - if (DEBUG) Log.d(TAG, "onHotwordError: " + errorCode); - // TODO: Inspect the error code and handle the errors appropriately - // instead of blindly failing. - maybeStopHotwordDetector(); - } - }; } diff --git a/packages/PrintSpooler/AndroidManifest.xml b/packages/PrintSpooler/AndroidManifest.xml index 6fa3ed4aa0c8..83ec1adf33fe 100644 --- a/packages/PrintSpooler/AndroidManifest.xml +++ b/packages/PrintSpooler/AndroidManifest.xml @@ -18,7 +18,6 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.printspooler" - android:sharedUserId="android.uid.printspooler" android:versionName="1" android:versionCode="1"> diff --git a/packages/PrintSpooler/res/layout/print_job_config_activity_content_editing.xml b/packages/PrintSpooler/res/layout/print_job_config_activity_content_editing.xml index 252dd81b387c..abf3c03256a2 100644 --- a/packages/PrintSpooler/res/layout/print_job_config_activity_content_editing.xml +++ b/packages/PrintSpooler/res/layout/print_job_config_activity_content_editing.xml @@ -67,7 +67,6 @@ android:layout_marginEnd="6dip" android:layout_row="1" android:layout_column="0" - android:layout_gravity="start|bottom" style="@style/PrintOptionTextViewStyle" android:labelFor="@id/copies_edittext" android:text="@string/label_copies"> diff --git a/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml b/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml index d14c0642af94..48189bd021e4 100644 --- a/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml +++ b/packages/PrintSpooler/res/layout/spinner_dropdown_item.xml @@ -21,7 +21,7 @@ android:paddingEnd="8dip" android:minHeight="?android:attr/listPreferredItemHeightSmall" android:orientation="vertical" - android:gravity="left|center_vertical"> + android:gravity="start|center_vertical"> <TextView android:id="@+id/title" diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java index 88da21f9cff2..7d6ca56c008d 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java +++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java @@ -257,8 +257,96 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { private boolean mReadHistoryCompleted; private boolean mReadHistoryInProgress; - private final AsyncTask<Void, Void, List<PrinterInfo>> mReadTask = - new AsyncTask<Void, Void, List<PrinterInfo>>() { + private ReadTask mReadTask; + + private PersistenceManager(Context context) { + mStatePersistFile = new AtomicFile(new File(context.getFilesDir(), + PERSIST_FILE_NAME)); + } + + public boolean isReadHistoryInProgress() { + return mReadHistoryInProgress; + } + + public boolean isReadHistoryCompleted() { + return mReadHistoryCompleted; + } + + public boolean stopReadPrinterHistory() { + final boolean cancelled = mReadTask.cancel(true); + mReadTask = null; + return cancelled; + } + + public void readPrinterHistory() { + if (DEBUG) { + Log.i(LOG_TAG, "read history started"); + } + mReadHistoryInProgress = true; + mReadTask = new ReadTask(); + mReadTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); + } + + @SuppressWarnings("unchecked") + public void addPrinterAndWritePrinterHistory(PrinterInfo printer) { + if (mHistoricalPrinters.size() >= MAX_HISTORY_LENGTH) { + mHistoricalPrinters.remove(0); + } + mHistoricalPrinters.add(printer); + new WriteTask().executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, + new ArrayList<PrinterInfo>(mHistoricalPrinters)); + } + + private List<PrinterInfo> computeFavoritePrinters(List<PrinterInfo> printers) { + Map<PrinterId, PrinterRecord> recordMap = + new ArrayMap<PrinterId, PrinterRecord>(); + + // Recompute the weights. + float currentWeight = 1.0f; + final int printerCount = printers.size(); + for (int i = printerCount - 1; i >= 0; i--) { + PrinterInfo printer = printers.get(i); + // Aggregate weight for the same printer + PrinterRecord record = recordMap.get(printer.getId()); + if (record == null) { + record = new PrinterRecord(printer); + recordMap.put(printer.getId(), record); + } + record.weight += currentWeight; + currentWeight *= WEIGHT_DECAY_COEFFICIENT; + } + + // Soft the favorite printers. + List<PrinterRecord> favoriteRecords = new ArrayList<PrinterRecord>( + recordMap.values()); + Collections.sort(favoriteRecords); + + // Write the favorites to the output. + final int favoriteCount = favoriteRecords.size(); + List<PrinterInfo> favoritePrinters = new ArrayList<PrinterInfo>(favoriteCount); + for (int i = 0; i < favoriteCount; i++) { + PrinterInfo printer = favoriteRecords.get(i).printer; + favoritePrinters.add(printer); + } + + return favoritePrinters; + } + + private final class PrinterRecord implements Comparable<PrinterRecord> { + public final PrinterInfo printer; + public float weight; + + public PrinterRecord(PrinterInfo printer) { + this.printer = printer; + } + + @Override + public int compareTo(PrinterRecord another) { + return Float.floatToIntBits(another.weight) - Float.floatToIntBits(weight); + } + } + + private final class ReadTask extends AsyncTask<Void, Void, List<PrinterInfo>> { @Override protected List<PrinterInfo> doInBackground(Void... args) { return doReadPrinterHistory(); @@ -284,6 +372,9 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { // Start loading the available printers. loadInternal(); + + // We are done. + mReadTask = null; } private List<PrinterInfo> doReadPrinterHistory() { @@ -411,8 +502,7 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } }; - private final AsyncTask<List<PrinterInfo>, Void, Void> mWriteTask = - new AsyncTask<List<PrinterInfo>, Void, Void>() { + private final class WriteTask extends AsyncTask<List<PrinterInfo>, Void, Void> { @Override protected Void doInBackground(List<PrinterInfo>... printers) { doWritePrinterHistory(printers[0]); @@ -473,89 +563,5 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> { } } }; - - private PersistenceManager(Context context) { - mStatePersistFile = new AtomicFile(new File(context.getFilesDir(), - PERSIST_FILE_NAME)); - } - - public boolean isReadHistoryInProgress() { - return mReadHistoryInProgress; - } - - public boolean isReadHistoryCompleted() { - return mReadHistoryCompleted; - } - - public boolean stopReadPrinterHistory() { - return mReadTask.cancel(true); - } - - public void readPrinterHistory() { - if (DEBUG) { - Log.i(LOG_TAG, "read history started"); - } - mReadHistoryInProgress = true; - mReadTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, (Void[]) null); - } - - @SuppressWarnings("unchecked") - public void addPrinterAndWritePrinterHistory(PrinterInfo printer) { - if (mHistoricalPrinters.size() >= MAX_HISTORY_LENGTH) { - mHistoricalPrinters.remove(0); - } - mHistoricalPrinters.add(printer); - mWriteTask.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR, - new ArrayList<PrinterInfo>(mHistoricalPrinters)); - } - - private List<PrinterInfo> computeFavoritePrinters(List<PrinterInfo> printers) { - Map<PrinterId, PrinterRecord> recordMap = - new ArrayMap<PrinterId, PrinterRecord>(); - - // Recompute the weights. - float currentWeight = 1.0f; - final int printerCount = printers.size(); - for (int i = printerCount - 1; i >= 0; i--) { - PrinterInfo printer = printers.get(i); - // Aggregate weight for the same printer - PrinterRecord record = recordMap.get(printer.getId()); - if (record == null) { - record = new PrinterRecord(printer); - recordMap.put(printer.getId(), record); - } - record.weight += currentWeight; - currentWeight *= WEIGHT_DECAY_COEFFICIENT; - } - - // Soft the favorite printers. - List<PrinterRecord> favoriteRecords = new ArrayList<PrinterRecord>( - recordMap.values()); - Collections.sort(favoriteRecords); - - // Write the favorites to the output. - final int favoriteCount = favoriteRecords.size(); - List<PrinterInfo> favoritePrinters = new ArrayList<PrinterInfo>(favoriteCount); - for (int i = 0; i < favoriteCount; i++) { - PrinterInfo printer = favoriteRecords.get(i).printer; - favoritePrinters.add(printer); - } - - return favoritePrinters; - } - - private final class PrinterRecord implements Comparable<PrinterRecord> { - public final PrinterInfo printer; - public float weight; - - public PrinterRecord(PrinterInfo printer) { - this.printer = printer; - } - - @Override - public int compareTo(PrinterRecord another) { - return Float.floatToIntBits(another.weight) - Float.floatToIntBits(weight); - } - } } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java index 5361a1eba7c7..1040edf6e66d 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintJobConfigActivity.java @@ -42,7 +42,6 @@ import android.print.IPrintDocumentAdapter; import android.print.IWriteResultCallback; import android.print.PageRange; import android.print.PrintAttributes; -import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; import android.print.PrintDocumentAdapter; @@ -75,8 +74,6 @@ import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; -import libcore.io.IoUtils; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -92,6 +89,8 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.regex.Matcher; import java.util.regex.Pattern; +import libcore.io.IoUtils; + /** * Activity for configuring a print job. */ @@ -101,8 +100,6 @@ public class PrintJobConfigActivity extends Activity { private static final boolean DEBUG = true && Build.IS_DEBUGGABLE; - private static final boolean LIVE_PREVIEW_SUPPORTED = false; - public static final String EXTRA_PRINT_DOCUMENT_ADAPTER = "printDocumentAdapter"; public static final String EXTRA_PRINT_ATTRIBUTES = "printAttributes"; public static final String EXTRA_PRINT_JOB_ID = "printJobId"; @@ -111,6 +108,9 @@ public class PrintJobConfigActivity extends Activity { private static final int LOADER_ID_PRINTERS_LOADER = 1; + private static final int ORIENTATION_PORTRAIT = 0; + private static final int ORIENTATION_LANDSCAPE = 1; + private static final int DEST_ADAPTER_MAX_ITEM_COUNT = 9; private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE; @@ -131,8 +131,7 @@ public class PrintJobConfigActivity extends Activity { private static final int EDITOR_STATE_INITIALIZED = 1; private static final int EDITOR_STATE_CONFIRMED_PRINT = 2; -// private static final int EDITOR_STATE_CONFIRMED_PREVIEW = 3; - private static final int EDITOR_STATE_CANCELLED = 4; + private static final int EDITOR_STATE_CANCELLED = 3; private static final int MIN_COPIES = 1; private static final String MIN_COPIES_STRING = String.valueOf(MIN_COPIES); @@ -238,8 +237,7 @@ public class PrintJobConfigActivity extends Activity { } public boolean onTouchEvent(MotionEvent event) { - if (!mEditor.isPrintConfirmed() && !mEditor.isPreviewConfirmed() - && mEditor.shouldCloseOnTouch(event)) { + if (!mEditor.isPrintConfirmed() && mEditor.shouldCloseOnTouch(event)) { if (!mController.isWorking()) { PrintJobConfigActivity.this.finish(); } @@ -343,10 +341,11 @@ public class PrintJobConfigActivity extends Activity { if (!mController.hasStarted()) { mController.start(); } - if (!printAttributesChanged()) { - // If the attributes changed, then we do not do a layout but may - // have to ask the app to write some pages. Hence, pretend layout - // completed and nothing changed, so we handle writing as usual. + if (!printAttributesChanged() && mDocument.info != null) { + // If the attributes didn't change and we have done a layout, then + // we do not do a layout but may have to ask the app to write some + // pages. Hence, pretend layout completed and nothing changed, so + // we handle writing as usual. handleOnLayoutFinished(mDocument.info, false, mRequestCounter.get()); } else { PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( @@ -394,9 +393,6 @@ public class PrintJobConfigActivity extends Activity { mPrintJobId, info); } - // Update the fitting mode based on the document type. - updateCurrentFittingMode(info); - // If the document info or the layout changed, then // drop the pages since we have to fetch them again. if (infoChanged || layoutChanged) { @@ -424,19 +420,7 @@ public class PrintJobConfigActivity extends Activity { if (!infoChanged && !layoutChanged && PageRangeUtils.contains(mDocument.pages, mRequestedPages)) { if (mEditor.isDone()) { - PrintJobConfigActivity.this.finish(); - } - return; - } - - // If we do not support live preview and the current layout is - // not for preview purposes, i.e. the user did not poke the - // preview button, then just skip the write. - if (!LIVE_PREVIEW_SUPPORTED && !mEditor.isPreviewConfirmed() - && mMetadata.getBoolean(PrintDocumentAdapter.METADATA_KEY_PRINT_PREVIEW)) { - mEditor.updateUi(); - if (mEditor.isDone()) { - PrintJobConfigActivity.this.finish(); + requestCreatePdfFileOrFinish(); } return; } @@ -526,20 +510,20 @@ public class PrintJobConfigActivity extends Activity { } if (mEditor.isDone()) { - // Update the print attributes based on whether the application - // handled some of the print attribute constraints, e.g. rotation. - updateAndSaveCurrentPrintAttributes(mDocument.info); + requestCreatePdfFileOrFinish(); + } + } - if (mEditor.isPrintingToPdf()) { - PrintJobInfo printJob = PrintSpoolerService.peekInstance() - .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY); - Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); - intent.setType("application/pdf"); - intent.putExtra(Intent.EXTRA_TITLE, printJob.getLabel()); - startActivityForResult(intent, ACTIVITY_REQUEST_CREATE_FILE); - } else { - PrintJobConfigActivity.this.finish(); - } + private void requestCreatePdfFileOrFinish() { + if (mEditor.isPrintingToPdf()) { + PrintJobInfo printJob = PrintSpoolerService.peekInstance() + .getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY); + Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); + intent.setType("application/pdf"); + intent.putExtra(Intent.EXTRA_TITLE, printJob.getLabel()); + startActivityForResult(intent, ACTIVITY_REQUEST_CREATE_FILE); + } else { + PrintJobConfigActivity.this.finish(); } } @@ -552,58 +536,6 @@ public class PrintJobConfigActivity extends Activity { PrintJobConfigActivity.this.finish(); } - private void updateCurrentFittingMode(PrintDocumentInfo document) { - // Update the fitting mode based on content type. - switch (document.getContentType()) { - case PrintDocumentInfo.CONTENT_TYPE_DOCUMENT: { - mCurrPrintAttributes.setFittingMode( - PrintAttributes.FITTING_MODE_SCALE_TO_FIT); - } break; - - case PrintDocumentInfo.CONTENT_TYPE_PHOTO: { - mCurrPrintAttributes.setFittingMode( - PrintAttributes.FITTING_MODE_SCALE_TO_FILL); - } - } - } - - private void updateAndSaveCurrentPrintAttributes(PrintDocumentInfo document) { - PrintAttributes attributes = mTempPrintAttributes; - attributes.copyFrom(mCurrPrintAttributes); - - // Update the orientation - if (document.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) { - if (attributes.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) { - // If the document is in landscape and we want to print it in - // landscape, then we do not need to rotate, so portrait. - attributes.setOrientation(PrintAttributes.ORIENTATION_PORTRAIT); - } else { - // If the document is in landscape and we want to print it in - // portrait, then we have to rotate the content, so landscape. - attributes.setOrientation(PrintAttributes.ORIENTATION_LANDSCAPE); - } - } - - // Update margins. - Margins documentMargins = document.getMargins(); - if (documentMargins.getLeftMils() != 0 - || documentMargins.getTopMils() != 0 - || documentMargins.getRightMils() != 0 - || documentMargins.getBottomMils() != 0) { - // If the application has applied some of the margins, then - // the printer should only apply the difference. - Margins oldMargins = attributes.getMargins(); - attributes.setMargins(new Margins( - oldMargins.getLeftMils() - documentMargins.getLeftMils(), - oldMargins.getTopMils() - documentMargins.getTopMils(), - oldMargins.getRightMils() - documentMargins.getRightMils(), - oldMargins.getBottomMils() - documentMargins.getBottomMils())); - } - - PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence( - mPrintJobId, attributes); - } - private final class ControllerHandler extends Handler { public static final int MSG_ON_LAYOUT_FINISHED = 1; public static final int MSG_ON_LAYOUT_FAILED = 2; @@ -878,7 +810,16 @@ public class PrintJobConfigActivity extends Activity { } SpinnerItem<Integer> orientationItem = mOrientationSpinnerAdapter.getItem(position); - mCurrPrintAttributes.setOrientation(orientationItem.value); + MediaSize mediaSize = mCurrPrintAttributes.getMediaSize(); + if (orientationItem.value == ORIENTATION_PORTRAIT) { + if (!mediaSize.isPortrait()) { + mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait()); + } + } else { + if (mediaSize.isPortrait()) { + mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape()); + } + } if (!hasErrors()) { mController.update(); } @@ -1108,6 +1049,12 @@ public class PrintJobConfigActivity extends Activity { mOrientationSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( PrintJobConfigActivity.this, R.layout.spinner_dropdown_item, R.id.title); + String[] orientationLabels = getResources().getStringArray( + R.array.orientation_labels); + mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>( + ORIENTATION_PORTRAIT, orientationLabels[0])); + mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>( + ORIENTATION_LANDSCAPE, orientationLabels[1])); // Range options mRangeOptionsSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>( @@ -1142,7 +1089,8 @@ public class PrintJobConfigActivity extends Activity { public void addCurrentPrinterToHistory() { PrinterInfo printer = (PrinterInfo) mDestinationSpinner.getSelectedItem(); - if (printer != null) { + PrinterId fakePdfPritnerId = mDestinationSpinnerAdapter.mFakePdfPrinter.getId(); + if (printer != null && !printer.getId().equals(fakePdfPritnerId)) { FusedPrintersProvider printersLoader = (FusedPrintersProvider) (Loader<?>) getLoaderManager().getLoader( LOADER_ID_PRINTERS_LOADER); @@ -1365,7 +1313,7 @@ public class PrintJobConfigActivity extends Activity { } public boolean isDone() { - return isPrintConfirmed() || isPreviewConfirmed() || isCancelled(); + return isPrintConfirmed() || isCancelled(); } public boolean isPrintConfirmed() { @@ -1378,10 +1326,6 @@ public class PrintJobConfigActivity extends Activity { showUi(UI_GENERATING_PRINT_JOB, null); } - public boolean isPreviewConfirmed() { - return mEditorState == EDITOR_STATE_CONFIRMED_PRINT; - } - public PageRange[] getRequestedPages() { if (hasErrors()) { return null; @@ -1491,7 +1435,7 @@ public class PrintJobConfigActivity extends Activity { if (mCurrentUi != UI_EDITING_PRINT_JOB) { return false; } - if (isPrintConfirmed() || isPreviewConfirmed() || isCancelled()) { + if (isPrintConfirmed() || isCancelled()) { mDestinationSpinner.setEnabled(false); mCopiesEditText.setEnabled(false); mMediaSizeSpinner.setEnabled(false); @@ -1539,9 +1483,9 @@ public class PrintJobConfigActivity extends Activity { mColorModeSpinner.setEnabled(false); // Orientation - if (mOrientationSpinner.getSelectedItemPosition() != AdapterView.INVALID_POSITION) { + if (mOrientationSpinner.getSelectedItemPosition() != 0) { mIgnoreNextOrientationChange = true; - mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION); + mOrientationSpinner.setSelection(0); } mOrientationSpinner.setEnabled(false); @@ -1604,7 +1548,7 @@ public class PrintJobConfigActivity extends Activity { oldMediaSizeNewIndex = i; } mMediaSizeSpinnerAdapter.add(new SpinnerItem<MediaSize>( - mediaSize, mediaSize.getLabel())); + mediaSize, mediaSize.getLabel(getPackageManager()))); } if (mediaSizeCount <= 0) { @@ -1693,68 +1637,7 @@ public class PrintJobConfigActivity extends Activity { } mColorModeSpinner.setEnabled(true); - // Orientation. - final int orientations = capabilities.getOrientations(); - - // If the orientations changed, we update the adapter and the spinner. - boolean orientationsChanged = false; - if (Integer.bitCount(orientations) != mOrientationSpinnerAdapter.getCount()) { - orientationsChanged = true; - } else { - int remainingOrientations = orientations; - int adapterIndex = 0; - while (remainingOrientations != 0) { - final int orientationBitOffset = Integer.numberOfTrailingZeros( - remainingOrientations); - final int orientation = 1 << orientationBitOffset; - remainingOrientations &= ~orientation; - if (orientation != mOrientationSpinnerAdapter.getItem( - adapterIndex).value) { - orientationsChanged = true; - break; - } - adapterIndex++; - } - } - if (orientationsChanged) { - // Remember the old orientation to try selecting it again. - int oldOrientationNewIndex = AdapterView.INVALID_POSITION; - final int oldOrientation = mCurrPrintAttributes.getOrientation(); - - mOrientationSpinnerAdapter.clear(); - String[] orientationLabels = getResources().getStringArray( - R.array.orientation_labels); - int remainingOrientations = orientations; - while (remainingOrientations != 0) { - final int orientationBitOffset = Integer.numberOfTrailingZeros( - remainingOrientations); - final int orientation = 1 << orientationBitOffset; - if (orientation == oldOrientation) { - // Update the index of the old selection. - oldOrientationNewIndex = orientationBitOffset; - } - remainingOrientations &= ~orientation; - mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(orientation, - orientationLabels[orientationBitOffset])); - } - final int orientationCount = Integer.bitCount(orientations); - if (orientationCount <= 0) { - mOrientationSpinner.setEnabled(false); - mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION); - } else { - mOrientationSpinner.setEnabled(true); - if (oldOrientationNewIndex != AdapterView.INVALID_POSITION) { - // Select the old orientation - nothing really changed. - setOrientationSpinnerSelectionNoCallback(oldOrientationNewIndex); - } else { - final int selectedOrientationIndex = Integer.numberOfTrailingZeros( - (orientations & defaultAttributes.getOrientation())); - someAttributeSelectionChanged = - setOrientationSpinnerSelectionNoCallback( - selectedOrientationIndex); - } - } - } + // Orientation mOrientationSpinner.setEnabled(true); // Range options @@ -1858,15 +1741,6 @@ public class PrintJobConfigActivity extends Activity { return false; } - private boolean setOrientationSpinnerSelectionNoCallback(int position) { - if (mOrientationSpinner.getSelectedItemPosition() != position) { - mIgnoreNextOrientationChange = true; - mOrientationSpinner.setSelection(position); - return true; - } - return false; - } - private void updateUiForNewPrinterCapabilities() { // The printer changed so we want to start with a clean slate // for the print options and let them be populated from the @@ -1879,9 +1753,9 @@ public class PrintJobConfigActivity extends Activity { mIgnoreNextColorModeChange = true; mColorModeSpinnerAdapter.clear(); } - if (!mOrientationSpinnerAdapter.isEmpty()) { + if (mOrientationSpinner.getSelectedItemPosition() != 0) { mIgnoreNextOrientationChange = true; - mOrientationSpinnerAdapter.clear(); + mOrientationSpinner.setSelection(0); } if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) { mIgnoreNextRangeOptionChange = true; @@ -2102,18 +1976,13 @@ public class PrintJobConfigActivity extends Activity { PrinterCapabilitiesInfo capabilities = new PrinterCapabilitiesInfo.Builder(printerId) - .addMediaSize(MediaSize.createMediaSize(getPackageManager(), - MediaSize.ISO_A4), true) - .addMediaSize(MediaSize.createMediaSize(getPackageManager(), - MediaSize.NA_LETTER), false) + .addMediaSize(MediaSize.ISO_A4, true) + .addMediaSize(MediaSize.NA_LETTER, false) .addResolution(new Resolution("PDF resolution", "PDF resolution", 300, 300), true) .setColorModes(PrintAttributes.COLOR_MODE_COLOR | PrintAttributes.COLOR_MODE_MONOCHROME, PrintAttributes.COLOR_MODE_COLOR) - .setOrientations(PrintAttributes.ORIENTATION_PORTRAIT - | PrintAttributes.ORIENTATION_LANDSCAPE, - PrintAttributes.ORIENTATION_PORTRAIT) .create(); return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf), diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java index dd2598c83b98..7266af8adf57 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java @@ -36,12 +36,12 @@ import android.print.PrintAttributes; import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.MediaSize; import android.print.PrintAttributes.Resolution; -import android.print.PrintAttributes.Tray; import android.print.PrintDocumentInfo; import android.print.PrintJobInfo; import android.print.PrintManager; import android.print.PrinterId; import android.print.PrinterInfo; +import android.text.TextUtils; import android.util.AtomicFile; import android.util.Log; import android.util.Slog; @@ -51,8 +51,6 @@ import com.android.internal.os.HandlerCaller; import com.android.internal.os.SomeArgs; import com.android.internal.util.FastXmlSerializer; -import libcore.io.IoUtils; - import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; @@ -65,6 +63,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import libcore.io.IoUtils; + /** * Service for exposing some of the {@link PrintSpooler} functionality to * another process. @@ -676,6 +676,8 @@ public final class PrintSpoolerService extends Service { private static final String ATTR_ID = "id"; private static final String ATTR_LABEL = "label"; + private static final String ATTR_LABEL_RES_ID = "labelResId"; + private static final String ATTR_PACKAGE_NAME = "packageName"; private static final String ATTR_STATE = "state"; private static final String ATTR_APP_ID = "appId"; private static final String ATTR_USER_ID = "userId"; @@ -685,13 +687,8 @@ public final class PrintSpoolerService extends Service { private static final String TAG_MEDIA_SIZE = "mediaSize"; private static final String TAG_RESOLUTION = "resolution"; private static final String TAG_MARGINS = "margins"; - private static final String TAG_INPUT_TRAY = "inputTray"; - private static final String TAG_OUTPUT_TRAY = "outputTray"; - private static final String ATTR_DUPLEX_MODE = "duplexMode"; private static final String ATTR_COLOR_MODE = "colorMode"; - private static final String ATTR_FITTING_MODE = "fittingMode"; - private static final String ATTR_ORIENTATION = "orientation"; private static final String ATTR_LOCAL_ID = "printerName"; private static final String ATTR_SERVICE_NAME = "serviceName"; @@ -806,32 +803,30 @@ public final class PrintSpoolerService extends Service { if (attributes != null) { serializer.startTag(null, TAG_ATTRIBUTES); - final int duplexMode = attributes.getDuplexMode(); - serializer.attribute(null, ATTR_DUPLEX_MODE, - String.valueOf(duplexMode)); - final int colorMode = attributes.getColorMode(); serializer.attribute(null, ATTR_COLOR_MODE, String.valueOf(colorMode)); - final int fittingMode = attributes.getFittingMode(); - serializer.attribute(null, ATTR_FITTING_MODE, - String.valueOf(fittingMode)); - - final int orientation = attributes.getOrientation(); - serializer.attribute(null, ATTR_ORIENTATION, - String.valueOf(orientation)); - MediaSize mediaSize = attributes.getMediaSize(); if (mediaSize != null) { serializer.startTag(null, TAG_MEDIA_SIZE); serializer.attribute(null, ATTR_ID, mediaSize.getId()); - serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel() - .toString()); serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf( mediaSize.getWidthMils())); serializer.attribute(null, ATTR_HEIGHT_MILS, String.valueOf( mediaSize.getHeightMils())); + // We prefer to store only the package name and + // resource id and fallback to the label. + if (!TextUtils.isEmpty(mediaSize.mPackageName) + && mediaSize.mLabelResId > 0) { + serializer.attribute(null, ATTR_PACKAGE_NAME, + mediaSize.mPackageName); + serializer.attribute(null, ATTR_LABEL_RES_ID, + String.valueOf(mediaSize.mLabelResId)); + } else { + serializer.attribute(null, ATTR_LABEL, + mediaSize.getLabel(getPackageManager())); + } serializer.endTag(null, TAG_MEDIA_SIZE); } @@ -839,12 +834,22 @@ public final class PrintSpoolerService extends Service { if (resolution != null) { serializer.startTag(null, TAG_RESOLUTION); serializer.attribute(null, ATTR_ID, resolution.getId()); - serializer.attribute(null, ATTR_LABEL, resolution.getLabel() - .toString()); serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf( resolution.getHorizontalDpi())); serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf( resolution.getVerticalDpi())); + // We prefer to store only the package name and + // resource id and fallback to the label. + if (!TextUtils.isEmpty(mediaSize.mPackageName) + && resolution.mLabelResId > 0) { + serializer.attribute(null, ATTR_PACKAGE_NAME, + resolution.mPackageName); + serializer.attribute(null, ATTR_LABEL_RES_ID, + String.valueOf(resolution.mLabelResId)); + } else { + serializer.attribute(null, ATTR_LABEL, + resolution.getLabel(getPackageManager())); + } serializer.endTag(null, TAG_RESOLUTION); } @@ -862,24 +867,6 @@ public final class PrintSpoolerService extends Service { serializer.endTag(null, TAG_MARGINS); } - Tray inputTray = attributes.getInputTray(); - if (inputTray != null) { - serializer.startTag(null, TAG_INPUT_TRAY); - serializer.attribute(null, ATTR_ID, inputTray.getId()); - serializer.attribute(null, ATTR_LABEL, inputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_INPUT_TRAY); - } - - Tray outputTray = attributes.getOutputTray(); - if (outputTray != null) { - serializer.startTag(null, TAG_OUTPUT_TRAY); - serializer.attribute(null, ATTR_ID, outputTray.getId()); - serializer.attribute(null, ATTR_LABEL, outputTray.getLabel() - .toString()); - serializer.endTag(null, TAG_OUTPUT_TRAY); - } - serializer.endTag(null, TAG_ATTRIBUTES); } @@ -1026,18 +1013,9 @@ public final class PrintSpoolerService extends Service { PrintAttributes.Builder builder = new PrintAttributes.Builder(); - String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE); - builder.setDuplexMode(Integer.parseInt(duplexMode)); - String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE); builder.setColorMode(Integer.parseInt(colorMode)); - String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE); - builder.setFittingMode(Integer.parseInt(fittingMode)); - - String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION); - builder.setOrientation(Integer.parseInt(orientation)); - parser.next(); skipEmptyTextTags(parser); @@ -1048,7 +1026,12 @@ public final class PrintSpoolerService extends Service { ATTR_WIDTH_MILS)); final int heightMils = Integer.parseInt(parser.getAttributeValue(null, ATTR_HEIGHT_MILS)); - MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils); + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); + final int labelResId = Integer.parseInt(parser.getAttributeValue(null, + ATTR_LABEL_RES_ID)); + label = parser.getAttributeValue(null, ATTR_LABEL); + MediaSize mediaSize = new MediaSize(id, label, packageName, labelResId, + widthMils, heightMils); builder.setMediaSize(mediaSize); parser.next(); skipEmptyTextTags(parser); @@ -1064,7 +1047,11 @@ public final class PrintSpoolerService extends Service { ATTR_HORIZONTAL_DPI)); final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null, ATTR_VERTICAL_DPI)); - Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi); + String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME); + final int labelResId = Integer.parseInt( + parser.getAttributeValue(null, ATTR_LABEL_RES_ID)); + Resolution resolution = new Resolution(id, label, packageName, labelResId, + horizontalDpi, verticalDpi); builder.setResolution(resolution); parser.next(); skipEmptyTextTags(parser); @@ -1090,30 +1077,6 @@ public final class PrintSpoolerService extends Service { parser.next(); } - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setInputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY); - parser.next(); - } - - skipEmptyTextTags(parser); - if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) { - String id = parser.getAttributeValue(null, ATTR_ID); - label = parser.getAttributeValue(null, ATTR_LABEL); - Tray tray = new Tray(id, label); - builder.setOutputTray(tray); - parser.next(); - skipEmptyTextTags(parser); - expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY); - parser.next(); - } - printJob.setAttributes(builder.create()); skipEmptyTextTags(parser); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index a5dab33d0fdf..bc02b0db1e43 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -567,8 +567,7 @@ public class SettingsProvider extends ContentProvider { * Fast path that avoids the use of chatty remoted Cursors. */ @Override - public Bundle callFromPackage(String callingPackage, String method, String request, - Bundle args) { + public Bundle call(String method, String request, Bundle args) { int callingUser = UserHandle.getCallingUserId(); if (args != null) { int reqUser = args.getInt(Settings.CALL_METHOD_USER_KEY, callingUser); @@ -623,7 +622,7 @@ public class SettingsProvider extends ContentProvider { // Also need to take care of app op. if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SETTINGS, Binder.getCallingUid(), - callingPackage) != AppOpsManager.MODE_ALLOWED) { + getCallingPackage()) != AppOpsManager.MODE_ALLOWED) { return null; } diff --git a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png Binary files differindex fd33ef33ee57..a93916f99357 100644 --- a/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-hdpi/ic_notification_overlay.9.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 differdeleted file mode 100644 index 8b232c061d76..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 071f94a9d955..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index da419e67dca0..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index 728a3c185dd8..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index 0490ab333e4b..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 9a7c36a6549a..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png Binary files differindex be6bad3536cf..4ff22d2762ce 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png Binary files differindex 5382e0a8245e..612b3622176a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png Binary files differindex 4c60c68b1cad..c779e7e8df63 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png Binary files differindex f526262fe4d8..a6d47967bea1 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png Binary files differindex dffa104333ab..67a6a731ff14 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png Binary files differindex 5870080d22a7..f972ebd2e8f2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png Binary files differindex 017e5a1922a9..b707fa1de37c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png Binary files differindex 362b38ddb43b..82d654531e97 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png Binary files differindex b225e7f0503a..59edd98e81d2 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png Binary files differindex e676c2aca6dc..450dd70d80f3 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png Binary files differindex b76a124be2af..ae6fee5f2c0d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png Binary files differindex 843b833a5dbb..67fa3adc6264 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png Binary files differindex ac0b5eff04fe..ba367ea00f38 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png Binary files differindex 807fdc536665..3ce0c6e44e3f 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png Binary files differindex cdbdea25b4e5..d502d5d8ebf9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png Binary files differindex 269eab112853..2f4464318e20 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png Binary files differindex 1489b90043cd..7ed4c78de97c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0.png Binary files differindex 2bb9fd6fd0ca..432b16600928 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0_fully.png Binary files differindex 594e5e2a05e8..aa071c777cf1 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1.png Binary files differindex 7dce473bd83e..194698a05200 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1_fully.png Binary files differindex d005e04793ed..0b4b368f3656 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2.png Binary files differindex 7a7e4b65b9c8..8887f2e0f366 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2_fully.png Binary files differindex c5b1c7873c38..87c3244df27f 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3.png Binary files differindex 40b20ae0d585..8206cd85a192 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3_fully.png Binary files differindex f0553cd256f5..293f88cde239 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_disconnected.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_disconnected.png Binary files differindex 8712938692c7..cb9c8ac250f6 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_disconnected.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_disconnected.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_idle.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_idle.png Binary files differindex 8442a51710d5..88eafcbdc0fe 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_idle.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_wimax_signal_idle.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png Binary files differindex fe7d2808aa33..5ce8708db094 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png Binary files differindex a59c84409c17..8f17b724a1c9 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_roaming_cdma_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png Binary files differindex 6253d9a1606d..da941c8e0825 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png Binary files differindex 6253d9a1606d..0fd09d745daa 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png Binary files differindex 0bed6d98c090..cf07aae81803 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png Binary files differindex 0b273311aafc..cfe43dd42c3b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png Binary files differindex 6bb92a38e73b..50aa77fbaca5 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png Binary files differindex c77c37f0f28b..92a5b1c1e66e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png Binary files differindex 92e6837bf505..045182c19d4d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png Binary files differindex 269eae2caba9..9454cd8ab61a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png Binary files differindex ac2eaf08f3ab..5232169c729b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png Binary files differindex d9da0d9f5250..6cb18c74eb4e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index f3756abed921..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index 7fbdd59524d7..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png Binary files differindex e02a84b5d652..45ed7ca9f34b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index 7520e2d080db..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png Binary files differdeleted file mode 100644 index 70f839f903df..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_sync_error.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png Binary files differindex a2aadd926582..ece3450f3f4d 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png Binary files differdeleted file mode 100644 index 108972dc23c6..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png Binary files differdeleted file mode 100644 index bd4068729af0..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png Binary files differdeleted file mode 100644 index 7ecf80104a75..000000000000 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png Binary files differindex 986e7fb45993..0060eba9899a 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png Binary files differindex a5795ed4d79f..2b0da2cb78c6 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex b647f45bf720..faf4153b0883 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png Binary files differindex 02144e59a3da..24755d999ee0 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 7eb285fb4acf..6a257051c834 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png Binary files differindex 20364a33549c..3f30896aa52e 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 169d6846fc75..c6098479312c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png Binary files differindex 850150ae53dd..87da72bc5956 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 7279d5a648ad..6248cfd7b09b 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png Binary files differindex 546a222a3648..8c3e896fb37c 100644 --- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_open_normal.png Binary files differindex a2bb4d6b5a08..13f6b7f1c8bb 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_open_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_open_normal.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_quicksettings_normal.png Binary files differindex a528b9471068..ecdb24095eab 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_notify_quicksettings_normal.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 differdeleted file mode 100644 index fc06d8a9c610..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 3b8e49f4d03e..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index acf6e06b851f..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_silent.png Binary files differindex 6872ec83017b..f3e9da28c5a2 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_vibrate.png Binary files differindex 98520d36feea..a90aef9b9816 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png Binary files differindex 4ecb2a8d9764..b477332dbe97 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png Binary files differindex f0b0588df0a2..b477332dbe97 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png Binary files differindex 2c86ddf03fce..395adadf1dbd 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png Binary files differindex 508a0737b48f..36cb7e54b763 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png Binary files differindex 6232c94d8bb8..4ded92394645 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png Binary files differindex 73c5c2cc08ad..cc30aa1973d2 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png Binary files differindex 49c0c0b3c1ae..568c29671e90 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png Binary files differindex a03ac3873b28..6f0b419846ed 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png Binary files differindex 21e5ae83ad98..000f93dd5f41 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png Binary files differindex 8cfc0f84f1b0..01d47c57793c 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_flightmode.png Binary files differindex 44d1afbba312..5171333c3b7d 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_flightmode.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_flightmode.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index 4f97e349aebd..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index 2a3bb84d4fa7..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png Binary files differindex ecca5d53ee95..cd4056cdcc37 100644 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index e14818bcb08a..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png Binary files differindex 8f6f7b51d3aa..c98911c903cd 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_open_normal.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png Binary files differindex 8d2f5a2f1571..bb9902248db3 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_notify_quicksettings_normal.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 differdeleted file mode 100644 index 5df91d404df4..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 5838918f6d5a..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 7db6ac658a23..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_silent.png Binary files differindex 66b4741771b8..b05bf7822b40 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_vibrate.png Binary files differindex f8abf256effe..2f782cfc71d0 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png Binary files differindex bea4247c69d6..6f457e0be5ec 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png Binary files differindex 3fda61d18857..6f457e0be5ec 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png Binary files differindex 28dd0abdf2a9..33a35d055037 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png Binary files differindex 7c01b4061633..45d733e8aa03 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png Binary files differindex dbd3c59838cb..71e396e2f25c 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png Binary files differindex 2cf3eff277f3..093387af55b3 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png Binary files differindex 19cdc6138ac8..b61b1e037c9b 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png Binary files differindex 0478d4aeaa6a..2f32c4cdd53a 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png Binary files differindex 126e31d1c63e..7121abba0663 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png Binary files differindex d32e3096af29..8e9ba9c55d34 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_flightmode.png Binary files differindex 907035741ced..1b4576249a95 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_flightmode.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_flightmode.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index e275f6ace0cd..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index 1ab14f4c49d3..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png Binary files differindex b961902d49e7..c18d10317431 100644 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index c8fccba3b232..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png Binary files differindex aa87849d5d8b..d9d8b1371649 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_open_normal.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png Binary files differindex 634a0115d27c..09e0a3c4d28e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_notify_quicksettings_normal.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 differdeleted file mode 100644 index 20ef55a50e25..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 89bff85f5488..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 22b71f289e5d..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_silent.png Binary files differindex 629b5f8062cf..829930158e4b 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_silent.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_vibrate.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_vibrate.png Binary files differindex 8e3e8b4bcb30..e171d530f680 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_vibrate.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png Binary files differindex dca7457fbc47..60ede0a47687 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png Binary files differindex 474795c0f4db..a22fa28f10fe 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png Binary files differindex 8718fa8f3f60..ef913284a6a4 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png Binary files differindex 6710650fd825..26a0543f07a3 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png Binary files differindex dcfd2d192344..ffb3b559dd57 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png Binary files differindex caa4189bef5e..ec311628c36b 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png Binary files differindex 69cc6c493395..85eef224ac2d 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png Binary files differindex 7e0158f32d0f..26cd26f7cfbb 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png Binary files differindex 9d5b2c7767f1..5aeb91327f38 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png Binary files differindex 03b5c5537876..25ed6265c0b1 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_flightmode.png Binary files differindex 9ede64c84a51..fcbfac1890ae 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_flightmode.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_flightmode.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index 79a4bf9aaa79..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index 442a6c0bf388..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png Binary files differindex 2ef75ac429ed..37da33399f41 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index 8c5cd8f0aa41..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_open_normal.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_open_normal.png Binary files differindex 60579f916d5f..c0855b59e45f 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_open_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_open_normal.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_quicksettings_normal.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_quicksettings_normal.png Binary files differindex abb9b1801f74..e3fb992f5500 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_quicksettings_normal.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_notify_quicksettings_normal.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 differdeleted file mode 100644 index 858c379a93ae..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 5b63adc88d2f..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 3cb10f3e2acd..000000000000 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_ringer_silent.png Binary files differindex e90b0a7973b7..1c847da2adb9 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_inout.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_ringer_silent.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_ringer_vibrate.png Binary files differindex bf61435bd568..d0ab9106f614 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_out.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_ringer_vibrate.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png Binary files differindex db8d8c138c40..5950ef8ac36f 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png Binary files differindex db8d8c138c40..a930649fd852 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png Binary files differindex 1d21ea1ae436..dc4a01e6da95 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png Binary files differindex d1609d606aa3..9245462fb096 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png Binary files differindex fe80d3d5b6d8..bb6fd30f245e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png Binary files differindex ef7312360166..b5b8884fc38e 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png Binary files differindex a80d45abb7dd..b77c83385e25 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png Binary files differindex d40cb3f06c78..11b58327a1d2 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png Binary files differindex 880a7355e62f..448d79b0d3d5 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png Binary files differindex f11bffff6df4..ff8246ef7abc 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_flightmode.png Binary files differindex 148068282561..455573122e8d 100644 --- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_in.png +++ b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_flightmode.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png Binary files differindex 667b13d8ff31..7ae60792c199 100644 --- a/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-mdpi/ic_notification_overlay.9.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 differdeleted file mode 100644 index dd88339ae9a2..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index 9db534ad150f..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 69469c510bc6..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index af92e4c3a339..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index 2e00effdd5cf..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index f30a4fad2424..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png Binary files differindex 017023ed9d26..edcb1b3d9cdc 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png Binary files differindex 09f30c3bd2bb..8e0ec0f47c52 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png Binary files differindex 580a81c0237a..62807cdc1271 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png Binary files differindex 6b4383dc5dde..868bbbc28a1e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png Binary files differindex 9d304470e446..890129e94b0b 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png Binary files differindex 3c4c07f1eb79..86279af539d9 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png Binary files differindex b5436397331b..de2aa4e5c5b1 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png Binary files differindex 3c59cbb14e4a..c008d6f4c95c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png Binary files differindex 3ae122816228..62ab39a50b90 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png Binary files differindex cc4d343639a8..4082a2ced614 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png Binary files differindex e26142fbc6a4..8c1c15a76a3d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png Binary files differindex f088b6b76f1a..6ba3496df394 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png Binary files differindex bbbe14a0ca5d..4a91d65a9cea 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png Binary files differindex d4370fdbcdb6..18d61987725a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png Binary files differindex 82057f811513..a11e57ecec31 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png Binary files differindex faacde9723bf..5a3a627cba9c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png Binary files differindex a28235b1c92b..bd4e1ae0dfad 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0.png Binary files differindex 71862ff8a8c8..e5a8f9531dc5 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0_fully.png Binary files differindex a30bea65a561..c1c2b5c79b24 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1.png Binary files differindex 0791dd26c0cf..421eee828820 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1_fully.png Binary files differindex 988a3abbb135..bfd249491e6c 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2.png Binary files differindex 3fab09550b30..b1af67862c30 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2_fully.png Binary files differindex 179bd5c193cf..9ad245bb532a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3.png Binary files differindex 6c5e39752ca5..69a1a970bd6b 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3_fully.png Binary files differindex 5232f8286f6d..d86567348f92 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_disconnected.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_disconnected.png Binary files differindex fd7c4b5f70ba..6bd3189e4dfb 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_disconnected.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_disconnected.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_idle.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_idle.png Binary files differindex 52f89ddd3aff..f7f0e9396f65 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_idle.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_wimax_signal_idle.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png Binary files differindex 6a08773a9900..bdf0f67d546e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png Binary files differindex 876d9ee0b600..cb388960c54e 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_roaming_cdma_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png Binary files differindex 55173f8165af..ca0260573380 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png Binary files differindex 55173f8165af..2dcbe28aaf0d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png Binary files differindex 6649d7cf6b42..c3c6b9326b6a 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png Binary files differindex dcfe5b492ec5..fe7189308ed4 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png Binary files differindex be3fe62d2d80..bb2e9baec648 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png Binary files differindex 734c52ae76f0..a6c61fff5df1 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png Binary files differindex 0deb8686158e..6583922bf443 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png Binary files differindex d808990bc251..ba4a9d9b6c94 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png Binary files differindex f890c2b3fe56..9b1cbcce9c96 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png Binary files differindex 0e11ce84eaf7..79c2ec16a29d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index e6d1e906a9cf..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index c1e8095c68fc..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png Binary files differindex 1ffeaa35d9af..454861762cea 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index 9726124fa001..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png Binary files differdeleted file mode 100644 index 6db607dd452a..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_sync_error.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png Binary files differindex fb70ba874fd0..b4db0bb235bf 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png Binary files differdeleted file mode 100644 index be00a9026e5f..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png Binary files differdeleted file mode 100644 index 0fc02aea642f..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png Binary files differdeleted file mode 100644 index 5c80022c2af8..000000000000 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png Binary files differindex 716cc7c81186..3cc96ee3b447 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png Binary files differindex 5891ff0eba4d..3fb4427342db 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 188ea3d61b46..34ae3bf53884 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png Binary files differindex b42650f38125..abcc317ddbb4 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 17680cec3dd9..cb3623a68cbc 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png Binary files differindex add0a9325d3c..a3b267806aa2 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 7023c4f0b29c..4f9a8b05cf14 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png Binary files differindex 6f2a767cc3f4..b4278f2c6ab6 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 318bfd5002ca..441de0ce78f8 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png Binary files differindex 26ea7b64a6ed..34abc98e519d 100644 --- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-nodpi/lightning.png b/packages/SystemUI/res/drawable-nodpi/lightning.png Binary files differdeleted file mode 100644 index 29de3085a533..000000000000 --- a/packages/SystemUI/res/drawable-nodpi/lightning.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png Binary files differindex 8758b02fd664..aae807b72ff8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.png +++ b/packages/SystemUI/res/drawable-xhdpi/ic_notification_overlay.9.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 differdeleted file mode 100644 index 0d35fac77b93..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index d03dad640afd..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index 9abdce84e778..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index a3bb88414761..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index 4cd3c7a44996..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index ee607c17b8ac..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png Binary files differindex 11305ea47613..8ea54eee32ec 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png Binary files differindex 9cd3dbbb3a08..877abf42a3f0 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png Binary files differindex 2c6a018de777..1e68ac7846f9 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png Binary files differindex 045a0801a763..c4b77ec07659 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png Binary files differindex 91d96941e451..9983d60cf6d8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png Binary files differindex c87bbf21a84c..de09dc6f5217 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png Binary files differindex d6290959247a..99908696f08c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png Binary files differindex da7dc8f83a30..7a630f93f80b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png Binary files differindex 3350a2d978bf..4378a8954b13 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png Binary files differindex 8af85158e05f..dc144aacffbc 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png Binary files differindex af3f5f577152..722148ce3b33 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png Binary files differindex 919e71dfd947..a3d11f2333c1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png Binary files differindex 4d925032b2e5..9e63b786b069 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png Binary files differindex b7aa3d1feb47..74f912971bfd 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png Binary files differindex 0b25ab351dff..38838fe29491 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png Binary files differindex b6992963b550..28d26f2d28c2 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png Binary files differindex 0896225571d8..757dbf3be7c5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0.png Binary files differindex ecbe583bd7af..f64d58236b32 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0_fully.png Binary files differindex ddd955ebaec3..31f5b90159bd 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1.png Binary files differindex 0d2eafeb6ddf..881d5e83fad5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1_fully.png Binary files differindex 72bbbd5eff33..2d80c4d4a202 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2.png Binary files differindex 285ded61c6bb..ad85c83e6c48 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2_fully.png Binary files differindex 6533b5e37289..bde43c6e88bd 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3.png Binary files differindex 5d4b982a7283..914ac495de90 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3_fully.png Binary files differindex 8b3c4a658d8a..c83e9fe41495 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_disconnected.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_disconnected.png Binary files differindex da99575baffb..48bca909572b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_disconnected.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_disconnected.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_idle.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_idle.png Binary files differindex 0c15847b07b7..155143404c42 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_idle.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_wimax_signal_idle.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png Binary files differindex eeac6ade4622..461535cc24f3 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png Binary files differindex 8b34373471aa..659275f251dc 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png Binary files differindex 8b34373471aa..17c0d9994a3e 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png Binary files differindex 610e78f1e1dd..23288de8e0d9 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png Binary files differindex f682a0ee15c1..8a5a476cc425 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png Binary files differindex 5bb372e3b72c..32e05feb06c8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png Binary files differindex ef05975e9e3e..a6c12b2eb1db 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png Binary files differindex d556733a32a2..f2f88a12d5fa 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png Binary files differindex c5088b513ce5..3fdc60e7465b 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png Binary files differindex e1bd8bd29820..7a38994b24d1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png Binary files differindex c82a4350bcba..b09247e1aca5 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index 429fcbef3738..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index dc5e5b686ea0..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png Binary files differindex 298b27d693b1..3b94b6b94c64 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index cdc2fd9f0f3b..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png Binary files differdeleted file mode 100644 index 6276f47c8bf2..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_sync_error.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_tty_mode.png Binary files differindex d28972f0ed2e..8c48af41c9f1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_tty_mode.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png Binary files differdeleted file mode 100644 index 0a30a19a5ccf..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png Binary files differdeleted file mode 100644 index 4b6f64742457..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png Binary files differdeleted file mode 100644 index 1bd41546ecd7..000000000000 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png Binary files differindex 0ae59e3fd1fc..e402ff66322c 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png Binary files differindex 172ab5b9f22b..a93e3a87bef1 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 0368f1723963..313ce4e81239 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png Binary files differindex 669750f6b16a..24b47b2c9c53 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 2813464ef15d..546c7a8412e6 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png Binary files differindex 5e11523563d5..b4b3f0265747 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex 811038c3e5b1..ec45d867cabe 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png Binary files differindex b6b65553c83e..758ebe7117b8 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex b4821d7b93c4..459a1a2e83ce 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png Binary files differindex bdf7bcad215c..d6f752afc76a 100644 --- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.png b/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.png Binary files differnew file mode 100644 index 000000000000..fa7de0ed0d87 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/ic_notification_overlay.9.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 differdeleted file mode 100644 index 4beb41ed8ee3..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png +++ /dev/null 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 differdeleted file mode 100644 index df5a9ce04efa..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png +++ /dev/null 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 differdeleted file mode 100644 index a82aeadabf3c..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png +++ /dev/null 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 differdeleted file mode 100644 index dee5ae82d066..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png +++ /dev/null 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 differdeleted file mode 100644 index 2a364ba8927e..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png +++ /dev/null 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 differdeleted file mode 100644 index b6b2f95df88f..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png Binary files differindex 0795f3aa1cfe..2d916d7b7fd9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png Binary files differindex 5b002df789b2..fe3c7506bab7 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_100.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png Binary files differindex c03248aaf558..d02693668a7f 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_15.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png Binary files differindex e489d2c39134..224be03d419a 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_28.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png Binary files differindex 68a1be8db6cd..dabed32a8a60 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_43.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png Binary files differindex e5f639d7a6f2..82d04c5754e6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_57.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png Binary files differindex ddfa4241d882..1d403c6fccf3 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_71.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png Binary files differindex 3b3025bba45f..b917d37be165 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_85.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png Binary files differindex 7ece3af60498..3356733c8308 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png Binary files differindex 2f4cf038129c..080bdda83246 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim100.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png Binary files differindex 8179ebae54df..0d1e47a81a80 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim15.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png Binary files differindex 5c925c12580d..f5650463b217 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim28.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png Binary files differindex f52767975149..378d4335d105 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim43.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png Binary files differindex fab08f48c591..3bd5759b41f6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim57.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png Binary files differindex 1f8dc5ec83fd..3d56db460f70 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim71.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png Binary files differindex 7f1f977a558b..2d24d99983d9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_battery_charge_anim85.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png Binary files differindex b9825f905a3a..17ffdb9a4128 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_bluetooth.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0.png Binary files differindex 77ec7e48cd31..21daf5c16559 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0_fully.png Binary files differindex b1d4eb029317..3397570da08e 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1.png Binary files differindex 537725e6345b..87039c5bf639 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1_fully.png Binary files differindex 041e5d700cd3..a21f3c4d8e2d 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2.png Binary files differindex b98f4e50784a..65b323f559fa 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2_fully.png Binary files differindex 196c23d32845..c5c35500a55b 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3.png Binary files differindex a3d07bb06e83..801cb3cac528 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3_fully.png Binary files differindex c93de678c43a..149d22785a1c 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_disconnected.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_disconnected.png Binary files differindex c487d610ee98..6edb37a8b377 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_disconnected.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_disconnected.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_idle.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_idle.png Binary files differindex 6f96ba3c3895..2b01e9b59bca 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_idle.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_wimax_signal_idle.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png Binary files differindex 32415c22ee35..7b03a11d1acf 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_no_sim.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png Binary files differindex 361ff48f3295..3c9d3e6083dc 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png Binary files differindex 937839b9976d..065f1dabbe28 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png Binary files differindex d185a4d63582..afacef534517 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png Binary files differindex 2bd6eb10c3d2..da2da18dd3f0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png Binary files differindex 95946078c2f6..1b1c86351bf0 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png Binary files differindex aad369e1bc3c..30c5abfb8fa6 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png Binary files differindex 6f9f50c4549e..99094e3624f4 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png Binary files differindex c76e188e9c3d..e49fd0a05b10 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png Binary files differindex 75a182fc3cfd..8aff99988a94 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png Binary files differindex 1889813158a8..c5114e7f1d66 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_in.png Binary files differdeleted file mode 100644 index ab3a4c895524..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_inout.png Binary files differdeleted file mode 100644 index 1c84c2d2ed55..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_out.png Binary files differdeleted file mode 100644 index 09f21f7bb4a3..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png Binary files differdeleted file mode 100644 index 2f6a4c0a2725..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_sync_error.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_tty_mode.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_tty_mode.png Binary files differnew file mode 100644 index 000000000000..075208afb465 --- /dev/null +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_tty_mode.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_in.png Binary files differdeleted file mode 100644 index 0f5b5ef12368..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_in.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_inout.png Binary files differdeleted file mode 100644 index 312117609b0c..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_inout.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_out.png Binary files differdeleted file mode 100644 index 278636868e3a..000000000000 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_out.png +++ /dev/null diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png Binary files differindex 93fd9b6bc243..bc272edc09b4 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png Binary files differindex a8681ec7139b..3fe77d0838eb 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png Binary files differindex 47a04cbf6baa..d032db365661 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png Binary files differindex 343eef90e7dc..dec522d9c991 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png Binary files differindex 033bced28b53..562101b91b9a 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png Binary files differindex 168f8ffd7635..9e679c229e32 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png Binary files differindex c546e080c469..ceb416380983 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png Binary files differindex a7b32c92e8e8..f4c7250cb64d 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png Binary files differindex 1126d9bf31b7..494b005326d8 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png Binary files differindex 5f8e67b462bf..3da56adb9dc9 100644 --- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png +++ b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml index 66b06ef789df..2b9cef91b59f 100644 --- a/packages/SystemUI/res/layout/signal_cluster_view.xml +++ b/packages/SystemUI/res/layout/signal_cluster_view.xml @@ -39,12 +39,6 @@ android:layout_centerVertical="true" android:scaleType="center" /> - <ImageView - android:id="@+id/wifi_inout" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_gravity="center|bottom" - /> </FrameLayout> <View android:layout_height="6dp" @@ -66,12 +60,6 @@ android:layout_centerVertical="true" android:scaleType="center" /> - <ImageView - android:id="@+id/wimax_inout" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_gravity="center|bottom" - /> </FrameLayout> --> <FrameLayout @@ -98,12 +86,6 @@ android:layout_height="wrap_content" android:layout_width="wrap_content" /> - <ImageView - android:id="@+id/mobile_inout" - android:layout_height="wrap_content" - android:layout_width="wrap_content" - android:layout_gravity="end|bottom" - /> </FrameLayout> </FrameLayout> <ImageView diff --git a/packages/SystemUI/res/values/arrays.xml b/packages/SystemUI/res/values/arrays.xml index 174fb9e34081..b2c8aee4aaf6 100644 --- a/packages/SystemUI/res/values/arrays.xml +++ b/packages/SystemUI/res/values/arrays.xml @@ -47,9 +47,18 @@ <item>100</item> </array> <array name="batterymeter_color_values"> - <item>#FFFF0000</item> - <item>#FFFE6600</item> + <item>#FFFF3300</item> + <item>#FFFF3300</item> <item>#FFFFFFFF</item> </array> - + <array name="batterymeter_bolt_points"> + <item>88</item> <item>0</item> + <item>459</item><item>1</item> + <item>238</item><item>333</item> + <item>525</item><item>310</item> + <item>120</item><item>840</item> + <item>82</item> <item>818</item> + <item>246</item><item>373</item> + <item>0</item> <item>408</item> + </array> </resources> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 2c06aec1405c..67a932a8a3f2 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -34,8 +34,7 @@ <drawable name="heads_up_notification_bg_pressed">#ff33B5E5</drawable> <drawable name="notification_header_bg">#FF000000</drawable> <color name="notification_panel_scrim_color">#B0000000</color> - - <color name="batterymeter_frame_color">#33FFFFFF</color> - <color name="batterymeter_charge_color">#7FFFFFFF</color> + <color name="batterymeter_frame_color">#66FFFFFF</color><!-- 40% white --> + <color name="batterymeter_charge_color">#FFFFFFFF</color> <color name="status_bar_clock_color">#FFFFFFFF</color> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index e0b3bc62bb72..3076ab4c824a 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -89,7 +89,7 @@ <dimen name="status_bar_icon_drawing_size">18dip</dimen> <!-- opacity at which Notification icons will be drawn in the status bar --> - <item type="dimen" name="status_bar_icon_drawing_alpha">65%</item> + <item type="dimen" name="status_bar_icon_drawing_alpha">75%</item> <!-- gap on either side of status bar notification icons --> <dimen name="status_bar_icon_padding">0dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 1165b8d50e4f..2257617b5429 100755 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -24,16 +24,19 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Typeface; -import android.graphics.drawable.Drawable; import android.os.BatteryManager; +import android.os.Bundle; import android.provider.Settings; import android.util.AttributeSet; import android.view.View; -public class BatteryMeterView extends View { +public class BatteryMeterView extends View implements DemoMode { public static final String TAG = BatteryMeterView.class.getSimpleName(); public static final String ACTION_LEVEL_TEST = "com.android.systemui.BATTERY_LEVEL_TEST"; @@ -47,15 +50,21 @@ public class BatteryMeterView extends View { int[] mColors; boolean mShowPercent = true; - Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint; + Paint mFramePaint, mBatteryPaint, mWarningTextPaint, mTextPaint, mBoltPaint; int mButtonHeight; private float mTextHeight, mWarningTextHeight; - Drawable mLightning; private int mHeight; private int mWidth; private String mWarningString; private final int mChargeColor; + private final float[] mBoltPoints; + private final Path mBoltPath = new Path(); + + private final RectF mFrame = new RectF(); + private final RectF mButtonFrame = new RectF(); + private final RectF mClipFrame = new RectF(); + private final Rect mBoltFrame = new Rect(); private class BatteryTracker extends BroadcastReceiver { // current battery status @@ -168,7 +177,8 @@ public class BatteryMeterView extends View { mColors[2*i] = levels.getInt(i, 0); mColors[2*i+1] = colors.getColor(i, 0); } - + levels.recycle(); + colors.recycle(); mShowPercent = ENABLE_PERCENT && 0 != Settings.System.getInt( context.getContentResolver(), "status_bar_show_battery_percent", 0); @@ -191,8 +201,28 @@ public class BatteryMeterView extends View { mWarningTextPaint.setTypeface(font); mWarningTextPaint.setTextAlign(Paint.Align.CENTER); - mLightning = getResources().getDrawable(R.drawable.lightning); mChargeColor = getResources().getColor(R.color.batterymeter_charge_color); + + mBoltPaint = new Paint(); + mBoltPaint.setAntiAlias(true); + mBoltPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); // punch hole + setLayerType(LAYER_TYPE_HARDWARE, null); + mBoltPoints = loadBoltPoints(res); + } + + private static float[] loadBoltPoints(Resources res) { + final int[] pts = res.getIntArray(R.array.batterymeter_bolt_points); + int maxX = 0, maxY = 0; + for (int i = 0; i < pts.length; i += 2) { + maxX = Math.max(maxX, pts[i]); + maxY = Math.max(maxY, pts[i + 1]); + } + final float[] ptsF = new float[pts.length]; + for (int i = 0; i < pts.length; i += 2) { + ptsF[i] = (float)pts[i] / maxX; + ptsF[i + 1] = (float)pts[i + 1] / maxY; + } + return ptsF; } @Override @@ -204,7 +234,6 @@ public class BatteryMeterView extends View { } private int getColorForLevel(int percent) { - if (mTracker.plugged) return mChargeColor; int thresh, color = 0; for (int i=0; i<mColors.length; i+=2) { thresh = mColors[i]; @@ -216,7 +245,8 @@ public class BatteryMeterView extends View { @Override public void draw(Canvas c) { - final int level = mTracker.level; + BatteryTracker tracker = mDemoMode ? mDemoTracker : mTracker; + final int level = tracker.level; float drawFrac = (float) level / 100f; final int pt = getPaddingTop(); final int pl = getPaddingLeft(); @@ -227,26 +257,23 @@ public class BatteryMeterView extends View { mButtonHeight = (int) (height * 0.12f); - final RectF frame = new RectF(0, 0, width, height); - frame.offset(pl, pt); + mFrame.set(0, 0, width, height); + mFrame.offset(pl, pt); - // Log.v("BatteryGauge", String.format("canvas: %dx%d frame: %s", - // c.getWidth(), c.getHeight(), frame.toString())); + mButtonFrame.set( + mFrame.left + width * 0.25f, + mFrame.top, + mFrame.right - width * 0.25f, + mFrame.top + mButtonHeight); - final RectF buttonframe = new RectF( - frame.left + width * 0.25f, - frame.top, - frame.right - width * 0.25f, - frame.top + mButtonHeight); - - frame.top += mButtonHeight; + mFrame.top += mButtonHeight; // first, draw the battery shape - c.drawRect(frame, mFramePaint); + c.drawRect(mFrame, mFramePaint); // fill 'er up - final int pct = mTracker.level; - final int color = getColorForLevel(pct); + final int pct = tracker.level; + final int color = tracker.plugged ? mChargeColor : getColorForLevel(pct); mBatteryPaint.setColor(color); if (level >= FULL) { @@ -255,31 +282,47 @@ public class BatteryMeterView extends View { drawFrac = 0f; } - c.drawRect(buttonframe, - drawFrac == 1f ? mBatteryPaint : mFramePaint); + c.drawRect(mButtonFrame, drawFrac == 1f ? mBatteryPaint : mFramePaint); - RectF clip = new RectF(frame); - clip.top += (frame.height() * (1f - drawFrac)); + mClipFrame.set(mFrame); + mClipFrame.top += (mFrame.height() * (1f - drawFrac)); c.save(Canvas.CLIP_SAVE_FLAG); - c.clipRect(clip); - c.drawRect(frame, mBatteryPaint); + c.clipRect(mClipFrame); + c.drawRect(mFrame, mBatteryPaint); c.restore(); if (level <= EMPTY) { final float x = mWidth * 0.5f; final float y = (mHeight + mWarningTextHeight) * 0.48f; c.drawText(mWarningString, x, y, mWarningTextPaint); - } else if (mTracker.plugged) { - final Rect r = new Rect( - (int)frame.left + width / 4, (int)frame.top + height / 5, - (int)frame.right - width / 4, (int)frame.bottom - height / 6); - mLightning.setBounds(r); - mLightning.draw(c); - } else if (mShowPercent && !(mTracker.level == 100 && !SHOW_100_PERCENT)) { + } else if (tracker.plugged) { + // draw the bolt + final int bl = (int)(mFrame.left + width / 4f); + final int bt = (int)(mFrame.top + height / 6f); + final int br = (int)(mFrame.right - width / 5f); + final int bb = (int)(mFrame.bottom - height / 6f); + if (mBoltFrame.left != bl || mBoltFrame.top != bt + || mBoltFrame.right != br || mBoltFrame.bottom != bb) { + mBoltFrame.set(bl, bt, br, bb); + mBoltPath.reset(); + mBoltPath.moveTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + for (int i = 2; i < mBoltPoints.length; i += 2) { + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[i] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[i + 1] * mBoltFrame.height()); + } + mBoltPath.lineTo( + mBoltFrame.left + mBoltPoints[0] * mBoltFrame.width(), + mBoltFrame.top + mBoltPoints[1] * mBoltFrame.height()); + } + c.drawPath(mBoltPath, mBoltPaint); + } else if (mShowPercent && !(tracker.level == 100 && !SHOW_100_PERCENT)) { mTextPaint.setTextSize(height * (SINGLE_DIGIT_PERCENT ? 0.75f - : (mTracker.level == 100 ? 0.38f : 0.5f))); + : (tracker.level == 100 ? 0.38f : 0.5f))); mTextHeight = -mTextPaint.getFontMetrics().ascent; final String str = String.valueOf(SINGLE_DIGIT_PERCENT ? (pct/10) : pct); @@ -289,17 +332,31 @@ public class BatteryMeterView extends View { x, y, mTextPaint); + } + } + + private boolean mDemoMode; + private BatteryTracker mDemoTracker = new BatteryTracker(); -// Paint pt = new Paint(); -// pt.setStrokeWidth(1f); -// pt.setStyle(Paint.Style.STROKE); -// pt.setColor(0xFFFF0000); -// c.drawRect(x, y-mTextHeight, x+tw, y, pt); -// -// Slog.v(TAG, "tw=" + tw + " th=" + mTextHeight); -// -// pt.setColor(0xFFFF00FF); -// c.drawRect(1, 1, mWidth, mHeight, pt); + @Override + public void dispatchDemoCommand(String command, Bundle args) { + if (!mDemoMode && command.equals(COMMAND_ENTER)) { + mDemoMode = true; + mDemoTracker.level = mTracker.level; + mDemoTracker.plugged = mTracker.plugged; + } else if (mDemoMode && command.equals(COMMAND_EXIT)) { + mDemoMode = false; + postInvalidate(); + } else if (mDemoMode && command.equals(COMMAND_BATTERY)) { + String level = args.getString("level"); + String plugged = args.getString("plugged"); + if (level != null) { + mDemoTracker.level = Math.min(Math.max(Integer.parseInt(level), 0), 100); + } + if (plugged != null) { + mDemoTracker.plugged = Boolean.parseBoolean(plugged); + } + postInvalidate(); } } } diff --git a/packages/SystemUI/src/com/android/systemui/DemoMode.java b/packages/SystemUI/src/com/android/systemui/DemoMode.java new file mode 100644 index 000000000000..8d271e488eca --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/DemoMode.java @@ -0,0 +1,34 @@ +/* + * 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.systemui; + +import android.os.Bundle; + +public interface DemoMode { + + void dispatchDemoCommand(String command, Bundle args); + + public static final String ACTION_DEMO = "com.android.systemui.demo"; + + public static final String COMMAND_ENTER = "enter"; + public static final String COMMAND_EXIT = "exit"; + public static final String COMMAND_CLOCK = "clock"; + public static final String COMMAND_BATTERY = "battery"; + public static final String COMMAND_NETWORK = "network"; + public static final String COMMAND_BARS = "bars"; + public static final String COMMAND_STATUS = "status"; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index ff85cb4b479e..54c9f5d84c75 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -1097,7 +1097,7 @@ public abstract class BaseStatusBar extends SystemUI implements return km.inKeyguardRestrictedInputMode(); } - public void setInteracting(boolean interacting) { + public void setInteracting(int barWindow, boolean interacting) { // hook for subclasses } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index eef4f4456da8..900e1e08c8ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar; +import android.app.StatusBarManager; import android.graphics.RectF; import android.view.MotionEvent; import android.view.View; @@ -86,9 +87,9 @@ public class DelegateViewHelper { } if (action == MotionEvent.ACTION_DOWN) { - mBar.setInteracting(true); + mBar.setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, true); } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { - mBar.setInteracting(false); + mBar.setInteracting(StatusBarManager.WINDOW_NAVIGATION_BAR, false); } mDelegateView.getLocationOnScreen(mTempPoint); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java index ff84243c69f5..f1c8e0158fca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java @@ -39,15 +39,15 @@ public class SignalClusterView NetworkController mNC; private boolean mWifiVisible = false; - private int mWifiStrengthId = 0, mWifiActivityId = 0; + private int mWifiStrengthId = 0; private boolean mMobileVisible = false; - private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0; + private int mMobileStrengthId = 0, mMobileTypeId = 0; private boolean mIsAirplaneMode = false; private int mAirplaneIconId = 0; private String mWifiDescription, mMobileDescription, mMobileTypeDescription; ViewGroup mWifiGroup, mMobileGroup; - ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType, mAirplane; + ImageView mWifi, mMobile, mMobileType, mAirplane; View mSpacer; public SignalClusterView(Context context) { @@ -73,10 +73,8 @@ public class SignalClusterView mWifiGroup = (ViewGroup) findViewById(R.id.wifi_combo); mWifi = (ImageView) findViewById(R.id.wifi_signal); - mWifiActivity = (ImageView) findViewById(R.id.wifi_inout); mMobileGroup = (ViewGroup) findViewById(R.id.mobile_combo); mMobile = (ImageView) findViewById(R.id.mobile_signal); - mMobileActivity = (ImageView) findViewById(R.id.mobile_inout); mMobileType = (ImageView) findViewById(R.id.mobile_type); mSpacer = findViewById(R.id.spacer); mAirplane = (ImageView) findViewById(R.id.airplane); @@ -88,10 +86,8 @@ public class SignalClusterView protected void onDetachedFromWindow() { mWifiGroup = null; mWifi = null; - mWifiActivity = null; mMobileGroup = null; mMobile = null; - mMobileActivity = null; mMobileType = null; mSpacer = null; mAirplane = null; @@ -100,22 +96,19 @@ public class SignalClusterView } @Override - public void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon, - String contentDescription) { + public void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription) { mWifiVisible = visible; mWifiStrengthId = strengthIcon; - mWifiActivityId = activityIcon; mWifiDescription = contentDescription; apply(); } @Override - public void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon, + public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, String contentDescription, String typeContentDescription) { mMobileVisible = visible; mMobileStrengthId = strengthIcon; - mMobileActivityId = activityIcon; mMobileTypeId = typeIcon; mMobileDescription = contentDescription; mMobileTypeDescription = typeContentDescription; @@ -149,16 +142,11 @@ public class SignalClusterView if (mWifi != null) { mWifi.setImageDrawable(null); } - if (mWifiActivity != null) { - mWifiActivity.setImageDrawable(null); - } if (mMobile != null) { mMobile.setImageDrawable(null); } - if (mMobileActivity != null) { - mMobileActivity.setImageDrawable(null); - } + if (mMobileType != null) { mMobileType.setImageDrawable(null); } @@ -176,7 +164,6 @@ public class SignalClusterView if (mWifiVisible) { mWifi.setImageResource(mWifiStrengthId); - mWifiActivity.setImageResource(mWifiActivityId); mWifiGroup.setContentDescription(mWifiDescription); mWifiGroup.setVisibility(View.VISIBLE); @@ -185,13 +172,12 @@ public class SignalClusterView } if (DEBUG) Log.d(TAG, - String.format("wifi: %s sig=%d act=%d", + String.format("wifi: %s sig=%d", (mWifiVisible ? "VISIBLE" : "GONE"), - mWifiStrengthId, mWifiActivityId)); + mWifiStrengthId)); if (mMobileVisible && !mIsAirplaneMode) { mMobile.setImageResource(mMobileStrengthId); - mMobileActivity.setImageResource(mMobileActivityId); mMobileType.setImageResource(mMobileTypeId); mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription); @@ -214,9 +200,9 @@ public class SignalClusterView } if (DEBUG) Log.d(TAG, - String.format("mobile: %s sig=%d act=%d typ=%d", + String.format("mobile: %s sig=%d typ=%d", (mMobileVisible ? "VISIBLE" : "GONE"), - mMobileStrengthId, mMobileActivityId, mMobileTypeId)); + mMobileStrengthId, mMobileTypeId)); mMobileType.setVisibility( !mWifiVisible ? View.VISIBLE : View.GONE); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java new file mode 100644 index 000000000000..aba7afa16249 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DemoStatusIcons.java @@ -0,0 +1,151 @@ +/* + * 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.systemui.statusbar.phone; + +import android.os.Bundle; +import android.os.UserHandle; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import com.android.internal.statusbar.StatusBarIcon; +import com.android.systemui.DemoMode; +import com.android.systemui.R; +import com.android.systemui.statusbar.StatusBarIconView; +import com.android.systemui.statusbar.policy.LocationController; + +public class DemoStatusIcons extends LinearLayout implements DemoMode { + private final LinearLayout mStatusIcons; + private final int mIconSize; + + private boolean mDemoMode; + + public DemoStatusIcons(LinearLayout statusIcons, int iconSize) { + super(statusIcons.getContext()); + mStatusIcons = statusIcons; + mIconSize = iconSize; + + setLayoutParams(mStatusIcons.getLayoutParams()); + setOrientation(mStatusIcons.getOrientation()); + setGravity(Gravity.CENTER_VERTICAL); // no LL.getGravity() + ViewGroup p = (ViewGroup) mStatusIcons.getParent(); + p.addView(this, p.indexOfChild(mStatusIcons)); + } + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + if (!mDemoMode && command.equals(COMMAND_ENTER)) { + mDemoMode = true; + mStatusIcons.setVisibility(View.GONE); + setVisibility(View.VISIBLE); + } else if (mDemoMode && command.equals(COMMAND_EXIT)) { + mDemoMode = false; + mStatusIcons.setVisibility(View.VISIBLE); + setVisibility(View.GONE); + } else if (mDemoMode && command.equals(COMMAND_STATUS)) { + String volume = args.getString("volume"); + if (volume != null) { + int iconId = volume.equals("silent") ? R.drawable.stat_sys_ringer_silent + : volume.equals("vibrate") ? R.drawable.stat_sys_ringer_vibrate + : 0; + updateSlot("volume", null, iconId); + } + String bt = args.getString("bluetooth"); + if (bt != null) { + int iconId = bt.equals("disconnected") ? R.drawable.stat_sys_data_bluetooth + : bt.equals("connected") ? R.drawable.stat_sys_data_bluetooth_connected + : 0; + updateSlot("bluetooth", null, iconId); + } + String location = args.getString("location"); + if (location != null) { + int iconId = location.equals("show") ? LocationController.LOCATION_STATUS_ICON_ID + : 0; + updateSlot(LocationController.LOCATION_STATUS_ICON_PLACEHOLDER, null, iconId); + } + String alarm = args.getString("alarm"); + if (alarm != null) { + int iconId = alarm.equals("show") ? R.drawable.stat_sys_alarm + : 0; + updateSlot("alarm_clock", null, iconId); + } + String sync = args.getString("sync"); + if (sync != null) { + int iconId = sync.equals("show") ? R.drawable.stat_sys_sync + : 0; + updateSlot("sync_active", null, iconId); + } + String tty = args.getString("tty"); + if (tty != null) { + int iconId = tty.equals("show") ? R.drawable.stat_sys_tty_mode + : 0; + updateSlot("tty", null, iconId); + } + String eri = args.getString("eri"); + if (eri != null) { + int iconId = eri.equals("show") ? R.drawable.stat_sys_roaming_cdma_0 + : 0; + updateSlot("cdma_eri", null, iconId); + } + String mute = args.getString("mute"); + if (mute != null) { + int iconId = mute.equals("show") ? android.R.drawable.stat_notify_call_mute + : 0; + updateSlot("mute", null, iconId); + } + String speakerphone = args.getString("speakerphone"); + if (speakerphone != null) { + int iconId = speakerphone.equals("show") ? android.R.drawable.stat_sys_speakerphone + : 0; + updateSlot("speakerphone", null, iconId); + } + } + } + + private void updateSlot(String slot, String iconPkg, int iconId) { + if (!mDemoMode) return; + int removeIndex = -1; + for (int i = 0; i < getChildCount(); i++) { + StatusBarIconView v = (StatusBarIconView) getChildAt(i); + if (slot.equals(v.getTag())) { + if (iconId == 0) { + removeIndex = i; + break; + } else { + StatusBarIcon icon = v.getStatusBarIcon(); + icon.iconPackage = iconPkg; + icon.iconId = iconId; + v.set(icon); + v.updateDrawable(); + return; + } + } + } + if (iconId == 0) { + if (removeIndex != -1) { + removeViewAt(removeIndex); + return; + } + } + StatusBarIcon icon = new StatusBarIcon(iconPkg, UserHandle.CURRENT, iconId, 0, 0, "Demo"); + StatusBarIconView v = new StatusBarIconView(mContext, null); + v.setTag(slot); + v.set(icon); + addView(v, 0, new LinearLayout.LayoutParams(mIconSize, mIconSize)); + } +}
\ No newline at end of file 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 bde3795dc4ca..9db28051d294 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -47,6 +47,7 @@ import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.inputmethodservice.InputMethodService; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; @@ -79,6 +80,7 @@ import android.widget.ScrollView; import android.widget.TextView; import com.android.internal.statusbar.StatusBarIcon; +import com.android.systemui.DemoMode; import com.android.systemui.EventLogTags; import com.android.systemui.R; import com.android.systemui.statusbar.BaseStatusBar; @@ -102,7 +104,7 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; -public class PhoneStatusBar extends BaseStatusBar { +public class PhoneStatusBar extends BaseStatusBar implements DemoMode { static final String TAG = "PhoneStatusBar"; public static final boolean DEBUG = BaseStatusBar.DEBUG; public static final boolean SPEW = false; @@ -304,7 +306,7 @@ public class PhoneStatusBar extends BaseStatusBar { } }; - private boolean mInteracting; + private int mInteractingWindows; private boolean mAutohideSuspended; private int mStatusBarMode; private int mNavigationBarMode; @@ -363,7 +365,6 @@ public class PhoneStatusBar extends BaseStatusBar { mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar); mStatusBarView.setBar(this); - PanelHolder holder = (PanelHolder) mStatusBarWindow.findViewById(R.id.panel_holder); mStatusBarView.setPanelHolder(holder); @@ -605,18 +606,13 @@ public class PhoneStatusBar extends BaseStatusBar { } } -// final ImageView wimaxRSSI = -// (ImageView)sb.findViewById(R.id.wimax_signal); -// if (wimaxRSSI != null) { -// mNetworkController.addWimaxIconView(wimaxRSSI); -// } - // receive broadcasts IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(ACTION_DEMO); context.registerReceiver(mBroadcastReceiver, filter); // listen for USER_SETUP_COMPLETE setting (per-user) @@ -1382,7 +1378,7 @@ public class PhoneStatusBar extends BaseStatusBar { visibilityChanged(true); - setInteracting(true); + setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true); } public void animateCollapsePanels() { @@ -1666,7 +1662,7 @@ public class PhoneStatusBar extends BaseStatusBar { mPostCollapseCleanup = null; } - setInteracting(false); + setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false); } /** @@ -1742,7 +1738,7 @@ public class PhoneStatusBar extends BaseStatusBar { } if (mStatusBarWindowState == WINDOW_STATE_SHOWING) { - setInteracting(true); + setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true); } return false; } @@ -1874,7 +1870,9 @@ public class PhoneStatusBar extends BaseStatusBar { } private void checkBarModes() { - checkBarMode(mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions()); + if (mDemoMode) return; + checkBarMode((mInteractingWindows & StatusBarManager.WINDOW_STATUS_BAR) != 0 ? MODE_OPAQUE + : mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions()); if (mNavigationBarView != null) { checkBarMode(mNavigationBarMode, mNavigationBarWindowState, mNavigationBarView.getBarTransitions()); @@ -1883,7 +1881,7 @@ public class PhoneStatusBar extends BaseStatusBar { private void checkBarMode(int mode, int windowState, BarTransitions transitions) { final boolean imeVisible = (mNavigationIconHints & NAVIGATION_HINT_BACK_ALT) != 0; - final int finalMode = imeVisible || mInteracting ? MODE_OPAQUE : mode; + final int finalMode = imeVisible ? MODE_OPAQUE : mode; final boolean animate = windowState == WINDOW_STATE_SHOWING; transitions.transitionTo(finalMode, animate); } @@ -1895,9 +1893,11 @@ public class PhoneStatusBar extends BaseStatusBar { }}; @Override - public void setInteracting(boolean interacting) { - mInteracting = interacting; - if (mInteracting) { + public void setInteracting(int barWindow, boolean interacting) { + mInteractingWindows = interacting + ? (mInteractingWindows | barWindow) + : (mInteractingWindows & ~barWindow); + if (mInteractingWindows != 0) { suspendAutohide(); } else { resumeSuspendedAutohide(); @@ -2120,7 +2120,7 @@ public class PhoneStatusBar extends BaseStatusBar { + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); } - pw.print(" mInteracting="); pw.println(mInteracting); + pw.print(" mInteractingWindows="); pw.println(mInteractingWindows); pw.print(" mStatusBarWindowState="); pw.println(windowStateToString(mStatusBarWindowState)); pw.print(" mStatusBarMode="); @@ -2447,6 +2447,19 @@ public class PhoneStatusBar extends BaseStatusBar { repositionNavigationBar(); notifyNavigationBarScreenOn(true); } + else if (ACTION_DEMO.equals(action)) { + Bundle bundle = intent.getExtras(); + if (bundle != null) { + String command = bundle.getString("command", "").trim().toLowerCase(); + if (command.length() > 0) { + try { + dispatchDemoCommand(command, bundle); + } catch (Throwable t) { + Log.w(TAG, "Error running demo command, intent=" + intent, t); + } + } + } + } } }; @@ -2676,4 +2689,66 @@ public class PhoneStatusBar extends BaseStatusBar { } mContext.unregisterReceiver(mBroadcastReceiver); } + + private boolean mDemoModeAllowed; + private boolean mDemoMode; + private DemoStatusIcons mDemoStatusIcons; + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + if (!mDemoModeAllowed) { + mDemoModeAllowed = Settings.Global.getInt(mContext.getContentResolver(), + "sysui_demo_allowed", 0) != 0; + } + if (!mDemoModeAllowed) return; + if (command.equals(COMMAND_ENTER)) { + mDemoMode = true; + } else if (command.equals(COMMAND_EXIT)) { + mDemoMode = false; + checkBarModes(); + } else if (!mDemoMode) { + // automatically enter demo mode on first demo command + dispatchDemoCommand(COMMAND_ENTER, new Bundle()); + } + boolean modeChange = command.equals(COMMAND_ENTER) || command.equals(COMMAND_EXIT); + if (modeChange || command.equals(COMMAND_CLOCK)) { + dispatchDemoCommandToView(command, args, R.id.clock); + } + if (modeChange || command.equals(COMMAND_BATTERY)) { + dispatchDemoCommandToView(command, args, R.id.battery); + } + if (modeChange || command.equals(COMMAND_STATUS)) { + if (mDemoStatusIcons == null) { + mDemoStatusIcons = new DemoStatusIcons(mStatusIcons, mIconSize); + } + mDemoStatusIcons.dispatchDemoCommand(command, args); + } + if (mNetworkController != null && (modeChange || command.equals(COMMAND_NETWORK))) { + mNetworkController.dispatchDemoCommand(command, args); + } + if (command.equals(COMMAND_BARS)) { + String mode = args.getString("mode"); + int barMode = "opaque".equals(mode) ? MODE_OPAQUE : + "transparent".equals(mode) ? MODE_TRANSPARENT : + "semi-transparent".equals(mode) ? MODE_SEMI_TRANSPARENT : + -1; + if (barMode != -1) { + boolean animate = true; + if (mStatusBarView != null) { + mStatusBarView.getBarTransitions().transitionTo(barMode, animate); + } + if (mNavigationBarView != null) { + mNavigationBarView.getBarTransitions().transitionTo(barMode, animate); + } + } + } + } + + private void dispatchDemoCommandToView(String command, Bundle args, int id) { + if (mStatusBarView == null) return; + View v = mStatusBarView.findViewById(id); + if (v instanceof DemoMode) { + ((DemoMode)v).dispatchDemoCommand(command, args); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 4ee2a4b98bcc..159bc62cfb8b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -157,9 +157,8 @@ public class PhoneStatusBarPolicy { // Sync state mService.setIcon("sync_active", R.drawable.stat_sys_sync, 0, null); - mService.setIcon("sync_failing", R.drawable.stat_sys_sync_error, 0, null); mService.setIconVisibility("sync_active", false); - mService.setIconVisibility("sync_failing", false); + // "sync_failing" is obsolete: b/1297963 // volume mService.setIcon("volume", R.drawable.stat_sys_ringer_silent, 0, null); @@ -175,10 +174,7 @@ public class PhoneStatusBarPolicy { private final void updateSyncState(Intent intent) { if (!SHOW_SYNC_ICON) return; boolean isActive = intent.getBooleanExtra("active", false); - boolean isFailing = intent.getBooleanExtra("failing", false); mService.setIconVisibility("sync_active", isActive); - // Don't display sync failing icon: BUG 1297963 Set sync error timeout to "never" - //mService.setIconVisibility("sync_failing", isFailing && !isActive); } private final void updateSimState(Intent intent) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java index fa494c2ae705..b263a6ecbd04 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java @@ -16,10 +16,6 @@ package com.android.systemui.statusbar.phone; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; -import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; - -import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.app.ActivityManager; @@ -57,8 +53,7 @@ public class PhoneStatusBarView extends PanelBar { private final int mTransparent; private final float mAlphaWhenOpaque; private final float mAlphaWhenTransparent = 1; - private View mLeftSide; - private View mRightSide; + private View mLeftSide, mStatusIcons, mSignalCluster, mClock; public StatusBarTransitions(Context context) { super(context, PhoneStatusBarView.this); @@ -69,7 +64,9 @@ public class PhoneStatusBarView extends PanelBar { public void init() { mLeftSide = findViewById(R.id.notification_icon_area); - mRightSide = findViewById(R.id.system_icon_area); + mStatusIcons = findViewById(R.id.statusIcons); + mSignalCluster = findViewById(R.id.signal_battery_cluster); + mClock = findViewById(R.id.clock); applyMode(getMode(), false /*animate*/); } @@ -84,8 +81,11 @@ public class PhoneStatusBarView extends PanelBar { } public float getAlphaFor(int mode) { - final boolean isTransparent = mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; - return isTransparent ? mAlphaWhenTransparent : mAlphaWhenOpaque; + return isTransparent(mode) ? mAlphaWhenTransparent : mAlphaWhenOpaque; + } + + private boolean isTransparent(int mode) { + return mode == MODE_SEMI_TRANSPARENT || mode == MODE_TRANSPARENT; } @Override @@ -95,16 +95,22 @@ public class PhoneStatusBarView extends PanelBar { } private void applyMode(int mode, boolean animate) { + if (mLeftSide == null) return; // pre-init float newAlpha = getAlphaFor(mode); if (animate) { - ObjectAnimator lhs = animateTransitionTo(mLeftSide, newAlpha); - ObjectAnimator rhs = animateTransitionTo(mRightSide, newAlpha); - AnimatorSet set = new AnimatorSet(); - set.playTogether(lhs, rhs); - set.start(); + AnimatorSet anims = new AnimatorSet(); + anims.playTogether( + animateTransitionTo(mLeftSide, newAlpha), + animateTransitionTo(mStatusIcons, newAlpha), + animateTransitionTo(mSignalCluster, newAlpha), + animateTransitionTo(mClock, newAlpha) + ); + anims.start(); } else { mLeftSide.setAlpha(newAlpha); - mRightSide.setAlpha(newAlpha); + mStatusIcons.setAlpha(newAlpha); + mSignalCluster.setAlpha(newAlpha); + mClock.setAlpha(newAlpha); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java index fece57ee06c0..0e53f0d6eda4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BluetoothController.java @@ -23,10 +23,6 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.view.View; -import android.widget.ImageView; - -import com.android.systemui.R; import java.util.ArrayList; import java.util.HashSet; @@ -35,11 +31,6 @@ import java.util.Set; public class BluetoothController extends BroadcastReceiver { private static final String TAG = "StatusBar.BluetoothController"; - private Context mContext; - private ArrayList<ImageView> mIconViews = new ArrayList<ImageView>(); - - private int mIconId = R.drawable.stat_sys_data_bluetooth; - private int mContentDescriptionId = 0; private boolean mEnabled = false; private Set<BluetoothDevice> mBondedDevices = new HashSet<BluetoothDevice>(); @@ -48,7 +39,6 @@ public class BluetoothController extends BroadcastReceiver { new ArrayList<BluetoothStateChangeCallback>(); public BluetoothController(Context context) { - mContext = context; IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); @@ -59,16 +49,11 @@ public class BluetoothController extends BroadcastReceiver { final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter != null) { handleAdapterStateChange(adapter.getState()); - handleConnectionStateChange(adapter.getConnectionState()); } - refreshViews(); + fireCallbacks(); updateBondedBluetoothDevices(); } - public void addIconView(ImageView v) { - mIconViews.add(v); - } - public void addStateChangedCallback(BluetoothStateChangeCallback cb) { mChangeCallbacks.add(cb); } @@ -84,14 +69,8 @@ public class BluetoothController extends BroadcastReceiver { if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) { handleAdapterStateChange( intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR)); - } else if (action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) { - handleConnectionStateChange( - intent.getIntExtra(BluetoothAdapter.EXTRA_CONNECTION_STATE, - BluetoothAdapter.STATE_DISCONNECTED)); - } else if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED)) { - // Fall through and update bonded devices and refresh view } - refreshViews(); + fireCallbacks(); updateBondedBluetoothDevices(); } @@ -111,31 +90,11 @@ public class BluetoothController extends BroadcastReceiver { } } - public void handleAdapterStateChange(int adapterState) { + private void handleAdapterStateChange(int adapterState) { mEnabled = (adapterState == BluetoothAdapter.STATE_ON); } - public void handleConnectionStateChange(int connectionState) { - final boolean connected = (connectionState == BluetoothAdapter.STATE_CONNECTED); - if (connected) { - mIconId = R.drawable.stat_sys_data_bluetooth_connected; - mContentDescriptionId = R.string.accessibility_bluetooth_connected; - } else { - mIconId = R.drawable.stat_sys_data_bluetooth; - mContentDescriptionId = R.string.accessibility_bluetooth_disconnected; - } - } - - public void refreshViews() { - int N = mIconViews.size(); - for (int i=0; i<N; i++) { - ImageView v = mIconViews.get(i); - v.setImageResource(mIconId); - v.setVisibility(mEnabled ? View.VISIBLE : View.GONE); - v.setContentDescription((mContentDescriptionId == 0) - ? null - : mContext.getString(mContentDescriptionId)); - } + private void fireCallbacks() { for (BluetoothStateChangeCallback cb : mChangeCallbacks) { cb.onBluetoothStateChange(mEnabled); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java index 93fb14fc58c2..8ced1c9cc2c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/Clock.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Bundle; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.format.DateFormat; @@ -28,6 +29,8 @@ import android.text.style.RelativeSizeSpan; import android.util.AttributeSet; import android.widget.TextView; +import com.android.systemui.DemoMode; + import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; @@ -38,7 +41,7 @@ import libcore.icu.LocaleData; /** * Digital clock for the status bar. */ -public class Clock extends TextView { +public class Clock extends TextView implements DemoMode { private boolean mAttached; private Calendar mCalendar; private String mClockFormatString; @@ -121,6 +124,7 @@ public class Clock extends TextView { }; final void updateClock() { + if (mDemoMode) return; mCalendar.setTimeInMillis(System.currentTimeMillis()); setText(getSmallTime()); } @@ -196,5 +200,29 @@ public class Clock extends TextView { return result; } + + private boolean mDemoMode; + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + if (!mDemoMode && command.equals(COMMAND_ENTER)) { + mDemoMode = true; + } else if (mDemoMode && command.equals(COMMAND_EXIT)) { + mDemoMode = false; + updateClock(); + } else if (mDemoMode && command.equals(COMMAND_CLOCK)) { + String millis = args.getString("millis"); + String hhmm = args.getString("hhmm"); + if (millis != null) { + mCalendar.setTimeInMillis(Long.parseLong(millis)); + } else if (hhmm != null && hhmm.length() == 4) { + int hh = Integer.parseInt(hhmm.substring(0, 2)); + int mm = Integer.parseInt(hhmm.substring(2)); + mCalendar.set(Calendar.HOUR, hh); + mCalendar.set(Calendar.MINUTE, mm); + } + setText(getSmallTime()); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java index 3070a3acee96..312bba37725d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/LocationController.java @@ -42,8 +42,8 @@ import java.util.List; public class LocationController extends BroadcastReceiver { // The name of the placeholder corresponding to the location request status icon. // This string corresponds to config_statusBarIcons in core/res/res/values/config.xml. - private static final String LOCATION_STATUS_ICON_PLACEHOLDER = "location"; - private static final int LOCATION_STATUS_ICON_ID + public static final String LOCATION_STATUS_ICON_PLACEHOLDER = "location"; + public static final int LOCATION_STATUS_ICON_ID = R.drawable.stat_sys_device_access_location_found; private static final int[] mHighPowerRequestAppOpArray @@ -129,6 +129,8 @@ public class LocationController extends BroadcastReceiver { // setting won't be fully enabled until the user accepts the agreement. int mode = enabled ? Settings.Secure.LOCATION_MODE_HIGH_ACCURACY : Settings.Secure.LOCATION_MODE_OFF; + // QuickSettings always runs as the owner, so specifically set the settings + // for the current foreground user. return Settings.Secure .putIntForUser(cr, Settings.Secure.LOCATION_MODE, mode, currentUserId); } @@ -137,14 +139,11 @@ public class LocationController extends BroadcastReceiver { * Returns true if location isn't disabled in settings. */ public boolean isLocationEnabled() { - int currentUserId = ActivityManager.getCurrentUser(); - if (isUserLocationRestricted(currentUserId)) { - return false; - } - ContentResolver resolver = mContext.getContentResolver(); + // QuickSettings always runs as the owner, so specifically retrieve the settings + // for the current foreground user. int mode = Settings.Secure.getIntForUser(resolver, Settings.Secure.LOCATION_MODE, - Settings.Secure.LOCATION_MODE_OFF, currentUserId); + Settings.Secure.LOCATION_MODE_OFF, ActivityManager.getCurrentUser()); return mode != Settings.Secure.LOCATION_MODE_OFF; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java index 34e3013503f4..1e7e6927b2e6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java @@ -27,6 +27,7 @@ import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wimax.WimaxManagerConstants; +import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Messenger; @@ -37,13 +38,13 @@ import android.telephony.SignalStrength; import android.telephony.TelephonyManager; import android.util.Log; import android.view.View; -import android.widget.ImageView; import android.widget.TextView; import com.android.internal.telephony.IccCardConstants; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cdma.EriInfo; import com.android.internal.util.AsyncChannel; +import com.android.systemui.DemoMode; import com.android.systemui.R; import java.io.FileDescriptor; @@ -52,12 +53,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Locale; -public class NetworkController extends BroadcastReceiver { +public class NetworkController extends BroadcastReceiver implements DemoMode { // debug static final String TAG = "StatusBar.NetworkController"; static final boolean DEBUG = false; static final boolean CHATTY = false; // additional diagnostics, but not logspew + private static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_signal_flightmode; + // telephony boolean mHspaDataDistinguishable; final TelephonyManager mPhone; @@ -81,7 +84,6 @@ public class NetworkController extends BroadcastReceiver { int mQSDataTypeIconId; int mAirplaneIconId; boolean mDataActive; - int mMobileActivityIconId; // overlay arrows for data direction int mLastSignalLevel; boolean mShowPhoneRSSIForData = false; boolean mShowAtLeastThreeGees = false; @@ -101,7 +103,6 @@ public class NetworkController extends BroadcastReceiver { String mWifiSsid; int mWifiIconId = 0; int mQSWifiIconId = 0; - int mWifiActivityIconId = 0; // overlay arrows for wifi direction int mWifiActivity = WifiManager.DATA_ACTIVITY_NONE; // bluetooth @@ -135,13 +136,6 @@ public class NetworkController extends BroadcastReceiver { // our ui Context mContext; - ArrayList<ImageView> mPhoneSignalIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mDataDirectionIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mDataDirectionOverlayIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mWifiIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mWimaxIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mCombinedSignalIconViews = new ArrayList<ImageView>(); - ArrayList<ImageView> mDataTypeIconViews = new ArrayList<ImageView>(); ArrayList<TextView> mCombinedLabelViews = new ArrayList<TextView>(); ArrayList<TextView> mMobileLabelViews = new ArrayList<TextView>(); ArrayList<TextView> mWifiLabelViews = new ArrayList<TextView>(); @@ -151,7 +145,6 @@ public class NetworkController extends BroadcastReceiver { new ArrayList<NetworkSignalChangedCallback>(); int mLastPhoneSignalIconId = -1; int mLastDataDirectionIconId = -1; - int mLastDataDirectionOverlayIconId = -1; int mLastWifiIconId = -1; int mLastWimaxIconId = -1; int mLastCombinedSignalIconId = -1; @@ -163,9 +156,9 @@ public class NetworkController extends BroadcastReceiver { boolean mDataAndWifiStacked = false; public interface SignalCluster { - void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon, + void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription); - void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon, + void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon, String contentDescription, String typeContentDescription); void setIsAirplaneMode(boolean is, int airplaneIcon); } @@ -261,33 +254,6 @@ public class NetworkController extends BroadcastReceiver { return (mServiceState != null && mServiceState.isEmergencyOnly()); } - public void addPhoneSignalIconView(ImageView v) { - mPhoneSignalIconViews.add(v); - } - - public void addDataDirectionIconView(ImageView v) { - mDataDirectionIconViews.add(v); - } - - public void addDataDirectionOverlayIconView(ImageView v) { - mDataDirectionOverlayIconViews.add(v); - } - - public void addWifiIconView(ImageView v) { - mWifiIconViews.add(v); - } - public void addWimaxIconView(ImageView v) { - mWimaxIconViews.add(v); - } - - public void addCombinedSignalIconView(ImageView v) { - mCombinedSignalIconViews.add(v); - } - - public void addDataTypeIconView(ImageView v) { - mDataTypeIconViews.add(v); - } - public void addCombinedLabelView(TextView v) { mCombinedLabelViews.add(v); } @@ -315,11 +281,11 @@ public class NetworkController extends BroadcastReceiver { } public void refreshSignalCluster(SignalCluster cluster) { + if (mDemoMode) return; cluster.setWifiIndicators( // only show wifi in the cluster if connected or if wifi-only mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature), mWifiIconId, - mWifiActivityIconId, mContentDescriptionWifi); if (mIsWimaxEnabled && mWimaxConnected) { @@ -327,7 +293,6 @@ public class NetworkController extends BroadcastReceiver { cluster.setMobileDataIndicators( true, mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId, - mMobileActivityIconId, mDataTypeIconId, mContentDescriptionWimax, mContentDescriptionDataType); @@ -336,7 +301,6 @@ public class NetworkController extends BroadcastReceiver { cluster.setMobileDataIndicators( mHasMobileDataFeature, mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId, - mMobileActivityIconId, mDataTypeIconId, mContentDescriptionPhoneSignal, mContentDescriptionDataType); @@ -1008,7 +972,6 @@ public class NetworkController extends BroadcastReceiver { Context context = mContext; int combinedSignalIconId = 0; - int combinedActivityIconId = 0; String combinedLabel = ""; String wifiLabel = ""; String mobileLabel = ""; @@ -1046,56 +1009,23 @@ public class NetworkController extends BroadcastReceiver { // Now for things that should only be shown when actually using mobile data. if (mDataConnected) { combinedSignalIconId = mDataSignalIconId; - switch (mDataActivity) { - case TelephonyManager.DATA_ACTIVITY_IN: - mMobileActivityIconId = R.drawable.stat_sys_signal_in; - break; - case TelephonyManager.DATA_ACTIVITY_OUT: - mMobileActivityIconId = R.drawable.stat_sys_signal_out; - break; - case TelephonyManager.DATA_ACTIVITY_INOUT: - mMobileActivityIconId = R.drawable.stat_sys_signal_inout; - break; - default: - mMobileActivityIconId = 0; - break; - } combinedLabel = mobileLabel; - combinedActivityIconId = mMobileActivityIconId; combinedSignalIconId = mDataSignalIconId; // set by updateDataIcon() mContentDescriptionCombinedSignal = mContentDescriptionDataType; - } else { - mMobileActivityIconId = 0; } } if (mWifiConnected) { if (mWifiSsid == null) { wifiLabel = context.getString(R.string.status_bar_settings_signal_meter_wifi_nossid); - mWifiActivityIconId = 0; // no wifis, no bits } else { wifiLabel = mWifiSsid; if (DEBUG) { wifiLabel += "xxxxXXXXxxxxXXXX"; } - switch (mWifiActivity) { - case WifiManager.DATA_ACTIVITY_IN: - mWifiActivityIconId = R.drawable.stat_sys_wifi_in; - break; - case WifiManager.DATA_ACTIVITY_OUT: - mWifiActivityIconId = R.drawable.stat_sys_wifi_out; - break; - case WifiManager.DATA_ACTIVITY_INOUT: - mWifiActivityIconId = R.drawable.stat_sys_wifi_inout; - break; - case WifiManager.DATA_ACTIVITY_NONE: - mWifiActivityIconId = 0; - break; - } } - combinedActivityIconId = mWifiActivityIconId; combinedLabel = wifiLabel; combinedSignalIconId = mWifiIconId; // set by updateWifiIcons() mContentDescriptionCombinedSignal = mContentDescriptionWifi; @@ -1126,7 +1056,7 @@ public class NetworkController extends BroadcastReceiver { // look again; your radios are now airplanes mContentDescriptionPhoneSignal = mContext.getString( R.string.accessibility_airplane_mode); - mAirplaneIconId = R.drawable.stat_sys_signal_flightmode; + mAirplaneIconId = FLIGHT_MODE_ICON; mPhoneSignalIconId = mDataSignalIconId = mDataTypeIconId = mQSDataTypeIconId = 0; mQSPhoneSignalIconId = 0; @@ -1178,7 +1108,6 @@ public class NetworkController extends BroadcastReceiver { + " combinedSignalIconId=0x" + Integer.toHexString(combinedSignalIconId) + "/" + getResourceName(combinedSignalIconId) - + " combinedActivityIconId=0x" + Integer.toHexString(combinedActivityIconId) + " mobileLabel=" + mobileLabel + " wifiLabel=" + wifiLabel + " emergencyOnly=" + emergencyOnly @@ -1197,7 +1126,6 @@ public class NetworkController extends BroadcastReceiver { } if (mLastPhoneSignalIconId != mPhoneSignalIconId - || mLastDataDirectionOverlayIconId != combinedActivityIconId || mLastWifiIconId != mWifiIconId || mLastWimaxIconId != mWimaxIconId || mLastDataTypeIconId != mDataTypeIconId @@ -1224,105 +1152,30 @@ public class NetworkController extends BroadcastReceiver { // the phone icon on phones if (mLastPhoneSignalIconId != mPhoneSignalIconId) { mLastPhoneSignalIconId = mPhoneSignalIconId; - N = mPhoneSignalIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mPhoneSignalIconViews.get(i); - if (mPhoneSignalIconId == 0) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - v.setImageResource(mPhoneSignalIconId); - v.setContentDescription(mContentDescriptionPhoneSignal); - } - } } // the data icon on phones if (mLastDataDirectionIconId != mDataDirectionIconId) { mLastDataDirectionIconId = mDataDirectionIconId; - N = mDataDirectionIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mDataDirectionIconViews.get(i); - v.setImageResource(mDataDirectionIconId); - v.setContentDescription(mContentDescriptionDataType); - } } // the wifi icon on phones if (mLastWifiIconId != mWifiIconId) { mLastWifiIconId = mWifiIconId; - N = mWifiIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mWifiIconViews.get(i); - if (mWifiIconId == 0) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - v.setImageResource(mWifiIconId); - v.setContentDescription(mContentDescriptionWifi); - } - } } // the wimax icon on phones if (mLastWimaxIconId != mWimaxIconId) { mLastWimaxIconId = mWimaxIconId; - N = mWimaxIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mWimaxIconViews.get(i); - if (mWimaxIconId == 0) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - v.setImageResource(mWimaxIconId); - v.setContentDescription(mContentDescriptionWimax); - } - } } // the combined data signal icon if (mLastCombinedSignalIconId != combinedSignalIconId) { mLastCombinedSignalIconId = combinedSignalIconId; - N = mCombinedSignalIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mCombinedSignalIconViews.get(i); - v.setImageResource(combinedSignalIconId); - v.setContentDescription(mContentDescriptionCombinedSignal); - } } // the data network type overlay if (mLastDataTypeIconId != mDataTypeIconId) { mLastDataTypeIconId = mDataTypeIconId; - N = mDataTypeIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mDataTypeIconViews.get(i); - if (mDataTypeIconId == 0) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - v.setImageResource(mDataTypeIconId); - v.setContentDescription(mContentDescriptionDataType); - } - } - } - - // the data direction overlay - if (mLastDataDirectionOverlayIconId != combinedActivityIconId) { - if (DEBUG) { - Log.d(TAG, "changing data overlay icon id to " + combinedActivityIconId); - } - mLastDataDirectionOverlayIconId = combinedActivityIconId; - N = mDataDirectionOverlayIconViews.size(); - for (int i=0; i<N; i++) { - final ImageView v = mDataDirectionOverlayIconViews.get(i); - if (combinedActivityIconId == 0) { - v.setVisibility(View.GONE); - } else { - v.setVisibility(View.VISIBLE); - v.setImageResource(combinedActivityIconId); - v.setContentDescription(mContentDescriptionDataType); - } - } } // the combinedLabel in the notification panel @@ -1481,10 +1334,6 @@ public class NetworkController extends BroadcastReceiver { pw.print(Integer.toHexString(mLastDataDirectionIconId)); pw.print("/"); pw.println(getResourceName(mLastDataDirectionIconId)); - pw.print(" mLastDataDirectionOverlayIconId=0x"); - pw.print(Integer.toHexString(mLastDataDirectionOverlayIconId)); - pw.print("/"); - pw.println(getResourceName(mLastDataDirectionOverlayIconId)); pw.print(" mLastWifiIconId=0x"); pw.print(Integer.toHexString(mLastWifiIconId)); pw.print("/"); @@ -1515,4 +1364,87 @@ public class NetworkController extends BroadcastReceiver { } } + private boolean mDemoMode; + private int mDemoInetCondition; + private int mDemoWifiLevel; + private int mDemoDataTypeIconId; + private int mDemoMobileLevel; + + @Override + public void dispatchDemoCommand(String command, Bundle args) { + if (!mDemoMode && command.equals(COMMAND_ENTER)) { + mDemoMode = true; + mDemoWifiLevel = mWifiLevel; + mDemoInetCondition = mInetCondition; + mDemoDataTypeIconId = mDataTypeIconId; + mDemoMobileLevel = mLastSignalLevel; + } else if (mDemoMode && command.equals(COMMAND_EXIT)) { + mDemoMode = false; + for (SignalCluster cluster : mSignalClusters) { + refreshSignalCluster(cluster); + } + } else if (mDemoMode && command.equals(COMMAND_NETWORK)) { + String airplane = args.getString("airplane"); + if (airplane != null) { + boolean show = airplane.equals("show"); + for (SignalCluster cluster : mSignalClusters) { + cluster.setIsAirplaneMode(show, FLIGHT_MODE_ICON); + } + } + String fully = args.getString("fully"); + if (fully != null) { + mDemoInetCondition = Boolean.parseBoolean(fully) ? 1 : 0; + } + String wifi = args.getString("wifi"); + if (wifi != null) { + boolean show = wifi.equals("show"); + String level = args.getString("level"); + if (level != null) { + mDemoWifiLevel = level.equals("null") ? -1 + : Math.min(Integer.parseInt(level), WifiIcons.WIFI_LEVEL_COUNT - 1); + } + int iconId = mDemoWifiLevel < 0 ? R.drawable.stat_sys_wifi_signal_null + : WifiIcons.WIFI_SIGNAL_STRENGTH[mDemoInetCondition][mDemoWifiLevel]; + for (SignalCluster cluster : mSignalClusters) { + cluster.setWifiIndicators( + show, + iconId, + "Demo"); + } + } + String mobile = args.getString("mobile"); + if (mobile != null) { + boolean show = mobile.equals("show"); + String datatype = args.getString("datatype"); + if (datatype != null) { + mDemoDataTypeIconId = + datatype.equals("1x") ? R.drawable.stat_sys_data_connected_1x : + datatype.equals("3g") ? R.drawable.stat_sys_data_connected_3g : + datatype.equals("4g") ? R.drawable.stat_sys_data_connected_4g : + datatype.equals("e") ? R.drawable.stat_sys_data_connected_e : + datatype.equals("g") ? R.drawable.stat_sys_data_connected_g : + datatype.equals("h") ? R.drawable.stat_sys_data_connected_h : + datatype.equals("lte") ? R.drawable.stat_sys_data_connected_lte : + datatype.equals("roam") ? R.drawable.stat_sys_data_connected_roam : + 0; + } + int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH; + String level = args.getString("level"); + if (level != null) { + mDemoMobileLevel = level.equals("null") ? -1 + : Math.min(Integer.parseInt(level), icons[0].length - 1); + } + int iconId = mDemoMobileLevel < 0 ? R.drawable.stat_sys_signal_null : + icons[mDemoInetCondition][mDemoMobileLevel]; + for (SignalCluster cluster : mSignalClusters) { + cluster.setMobileDataIndicators( + show, + iconId, + mDemoDataTypeIconId, + "Demo", + "Demo"); + } + } + } + } } diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index c58ed6fc2449..27bf38cc3d9f 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -460,6 +460,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { PowerManager.WakeLock mBroadcastWakeLock; boolean mHavePendingMediaKeyRepeatWithWakeLock; + private int mCurrentUserId; + // Maps global key codes to the components that will handle them. private GlobalKeyManager mGlobalKeyManager; @@ -3334,7 +3336,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisibleOrBehindKeyguardLw=" + win.isVisibleOrBehindKeyguardLw()); if (mTopFullscreenOpaqueWindowState == null && (win.getAttrs().privateFlags - &WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR) != 0) { + &WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_SHOW_NAV_BAR) != 0 + || (win.isVisibleLw() && attrs.type == TYPE_INPUT_METHOD)) { if (mForcingShowNavBarLayer < 0) { mForcingShowNavBar = true; mForcingShowNavBarLayer = win.getSurfaceLayer(); @@ -4812,7 +4815,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { ResolveInfo info = mContext.getPackageManager().resolveActivityAsUser( intent, PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA, - getCurrentUserId()); + mCurrentUserId); if (info != null) { ai = info.activityInfo; } @@ -4827,16 +4830,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { return null; } - private int getCurrentUserId() { - try { - UserInfo user = ActivityManagerNative.getDefault().getCurrentUser(); - return user != null ? user.id : UserHandle.USER_NULL; - } catch (RemoteException e) { - // noop - } - return UserHandle.USER_NULL; - } - void startDockOrHome() { awakenDreams(); @@ -5055,7 +5048,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (statusBarHasFocus) { int flags = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - | View.SYSTEM_UI_FLAG_IMMERSIVE; + | View.SYSTEM_UI_FLAG_IMMERSIVE + | View.SYSTEM_UI_FLAG_TRANSPARENT_STATUS + | View.SYSTEM_UI_FLAG_TRANSPARENT_NAVIGATION; vis = (vis & ~flags) | (mLastSystemUiFlags & flags); } @@ -5090,9 +5085,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean oldTransientNav = isTransientNavigationAllowed(oldVis); boolean isTransientNav = isTransientNavigationAllowed(vis); if (mFocusedWindow != null && oldTransientNav != isTransientNav) { - final int uid = getCurrentUserId(); final String pkg = mFocusedWindow.getOwningPackage(); - mTransientNavigationConfirmation.transientNavigationChanged(uid, pkg, isTransientNav); + mTransientNavigationConfirmation.transientNavigationChanged(mCurrentUserId, pkg, + isTransientNav); } vis = mNavigationBarController.updateVisibilityLw(isTransientNav, oldVis, vis); @@ -5171,6 +5166,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void setCurrentUserLw(int newUserId) { + mCurrentUserId = newUserId; if (mKeyguardDelegate != null) { mKeyguardDelegate.setCurrentUser(newUserId); } diff --git a/services/java/com/android/server/AlarmManagerService.java b/services/java/com/android/server/AlarmManagerService.java index 212796c6ab38..98b5f664fd82 100644 --- a/services/java/com/android/server/AlarmManagerService.java +++ b/services/java/com/android/server/AlarmManagerService.java @@ -91,7 +91,7 @@ class AlarmManagerService extends IAlarmManager.Stub { = new Intent().addFlags(Intent.FLAG_FROM_BACKGROUND); private static final IncreasingTimeOrder sIncreasingTimeOrder = new IncreasingTimeOrder(); - private static final boolean WAKEUP_STATS = true; + private static final boolean WAKEUP_STATS = false; private final Context mContext; diff --git a/services/java/com/android/server/AppOpsService.java b/services/java/com/android/server/AppOpsService.java index 7af95f3f84e6..c6c4a94177b4 100644 --- a/services/java/com/android/server/AppOpsService.java +++ b/services/java/com/android/server/AppOpsService.java @@ -552,6 +552,17 @@ public class AppOpsService extends IAppOpsService.Stub { } @Override + public int checkPackage(int uid, String packageName) { + synchronized (this) { + if (getOpsLocked(uid, packageName, true) != null) { + return AppOpsManager.MODE_ALLOWED; + } else { + return AppOpsManager.MODE_ERRORED; + } + } + } + + @Override public int noteOperation(int code, int uid, String packageName) { verifyIncomingUid(uid); verifyIncomingOp(code); @@ -560,7 +571,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (ops == null) { if (DEBUG) Log.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + " package " + packageName); - return AppOpsManager.MODE_IGNORED; + return AppOpsManager.MODE_ERRORED; } Op op = getOpLocked(ops, code, true); if (op.duration == -1) { @@ -594,7 +605,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (ops == null) { if (DEBUG) Log.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + packageName); - return AppOpsManager.MODE_IGNORED; + return AppOpsManager.MODE_ERRORED; } Op op = getOpLocked(ops, code, true); final int switchCode = AppOpsManager.opToSwitch(code); diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index ad9192a570ca..c4eb7a433d3a 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -5358,47 +5358,53 @@ class BackupManagerService extends IBackupManager.Stub { } // Enable/disable the backup service + @Override public void setBackupEnabled(boolean enable) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupEnabled"); Slog.i(TAG, "Backup enabled => " + enable); - boolean wasEnabled = mEnabled; - synchronized (this) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.BACKUP_ENABLED, enable ? 1 : 0); - mEnabled = enable; - } + long oldId = Binder.clearCallingIdentity(); + try { + boolean wasEnabled = mEnabled; + synchronized (this) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.BACKUP_ENABLED, enable ? 1 : 0); + mEnabled = enable; + } - synchronized (mQueueLock) { - if (enable && !wasEnabled && mProvisioned) { - // if we've just been enabled, start scheduling backup passes - startBackupAlarmsLocked(BACKUP_INTERVAL); - } else if (!enable) { - // No longer enabled, so stop running backups - if (DEBUG) Slog.i(TAG, "Opting out of backup"); - - mAlarmManager.cancel(mRunBackupIntent); - - // This also constitutes an opt-out, so we wipe any data for - // this device from the backend. We start that process with - // an alarm in order to guarantee wakelock states. - if (wasEnabled && mProvisioned) { - // NOTE: we currently flush every registered transport, not just - // the currently-active one. - HashSet<String> allTransports; - synchronized (mTransports) { - allTransports = new HashSet<String>(mTransports.keySet()); - } - // build the set of transports for which we are posting an init - for (String transport : allTransports) { - recordInitPendingLocked(true, transport); + synchronized (mQueueLock) { + if (enable && !wasEnabled && mProvisioned) { + // if we've just been enabled, start scheduling backup passes + startBackupAlarmsLocked(BACKUP_INTERVAL); + } else if (!enable) { + // No longer enabled, so stop running backups + if (DEBUG) Slog.i(TAG, "Opting out of backup"); + + mAlarmManager.cancel(mRunBackupIntent); + + // This also constitutes an opt-out, so we wipe any data for + // this device from the backend. We start that process with + // an alarm in order to guarantee wakelock states. + if (wasEnabled && mProvisioned) { + // NOTE: we currently flush every registered transport, not just + // the currently-active one. + HashSet<String> allTransports; + synchronized (mTransports) { + allTransports = new HashSet<String>(mTransports.keySet()); + } + // build the set of transports for which we are posting an init + for (String transport : allTransports) { + recordInitPendingLocked(true, transport); + } + mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), + mRunInitIntent); } - mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), - mRunInitIntent); } } + } finally { + Binder.restoreCallingIdentity(oldId); } } diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 9c146549a158..02a78dea3320 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -58,7 +58,7 @@ import android.net.INetworkPolicyManager; import android.net.INetworkStatsService; import android.net.LinkAddress; import android.net.LinkProperties; -import android.net.LinkInfo; +import android.net.LinkQualityInfo; import android.net.LinkProperties.CompareResult; import android.net.MobileDataStateTracker; import android.net.NetworkConfig; @@ -184,7 +184,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { private static final String ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED = "android.net.ConnectivityService.action.PKT_CNT_SAMPLE_INTERVAL_ELAPSED"; - private static final int SAMPLE_INTERVAL_ELAPSED_REQURST_CODE = 0; + private static final int SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE = 0; private PendingIntent mSampleIntervalElapsedIntent; @@ -661,7 +661,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // start network sampling .. Intent intent = new Intent(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED, null); mSampleIntervalElapsedIntent = PendingIntent.getBroadcast(mContext, - SAMPLE_INTERVAL_ELAPSED_REQURST_CODE, intent, 0); + SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE, intent, 0); mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); setAlarm(DEFAULT_START_SAMPLING_INTERVAL_IN_SECONDS * 1000, mSampleIntervalElapsedIntent); @@ -965,8 +965,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // Find the first Provisioning Network NetworkInfo provNi = null; for (NetworkInfo ni : getAllNetworkInfo()) { - if (ni.getDetailedState() - == NetworkInfo.DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) { + if (ni.isConnectedToProvisioningNetwork()) { provNi = ni; break; } @@ -2300,6 +2299,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } thisNet.setTeardownRequested(false); updateNetworkSettings(thisNet); + updateMtuSizeSettings(thisNet); handleConnectivityChange(newNetType, false); sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay()); @@ -2637,6 +2637,26 @@ public class ConnectivityService extends IConnectivityManager.Stub { return routesChanged; } + /** + * Reads the network specific MTU size from reources. + * and set it on it's iface. + */ + private void updateMtuSizeSettings(NetworkStateTracker nt) { + final String iface = nt.getLinkProperties().getInterfaceName(); + final int mtu = nt.getLinkProperties().getMtu(); + + if (mtu < 68 || mtu > 10000) { + loge("Unexpected mtu value: " + nt); + return; + } + + try { + if (VDBG) log("Setting MTU size: " + iface + ", " + mtu); + mNetd.setMtu(iface, mtu); + } catch (Exception e) { + Slog.e(TAG, "exception in setMtu()" + e); + } + } /** * Reads the network specific TCP buffer sizes from SystemProperties @@ -2919,7 +2939,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { NetworkInfo.State state = info.getState(); if (VDBG || (state == NetworkInfo.State.CONNECTED) || - (state == NetworkInfo.State.DISCONNECTED)) { + (state == NetworkInfo.State.DISCONNECTED) || + (state == NetworkInfo.State.SUSPENDED)) { log("ConnectivityChange for " + info.getTypeName() + ": " + state + "/" + info.getDetailedState()); @@ -2934,7 +2955,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { if (ConnectivityManager.isNetworkTypeMobile(info.getType()) && (0 != Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0)) - && (state == NetworkInfo.State.CONNECTED)) { + && ((state == NetworkInfo.State.CONNECTED) + || info.isConnectedToProvisioningNetwork())) { checkMobileProvisioning(CheckMp.MAX_TIMEOUT_MS); } @@ -2947,8 +2969,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } else if (info.getDetailedState() == DetailedState.CAPTIVE_PORTAL_CHECK) { handleCaptivePortalTrackerCheck(info); - } else if (info.getDetailedState() == - DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) { + } else if (info.isConnectedToProvisioningNetwork()) { /** * TODO: Create ConnectivityManager.TYPE_MOBILE_PROVISIONING * for now its an in between network, its a network that @@ -3017,7 +3038,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { public void handleMessage(Message msg) { NetworkInfo info; switch (msg.what) { - case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: + case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: { String causedBy = null; synchronized (ConnectivityService.this) { if (msg.arg1 == mNetTransitionWakeLockSerialNumber && @@ -3030,49 +3051,44 @@ public class ConnectivityService extends IConnectivityManager.Stub { log("NetTransition Wakelock for " + causedBy + " released by timeout"); } break; - case EVENT_RESTORE_DEFAULT_NETWORK: + } + case EVENT_RESTORE_DEFAULT_NETWORK: { FeatureUser u = (FeatureUser)msg.obj; u.expire(); break; - case EVENT_INET_CONDITION_CHANGE: - { + } + case EVENT_INET_CONDITION_CHANGE: { int netType = msg.arg1; int condition = msg.arg2; handleInetConditionChange(netType, condition); break; } - case EVENT_INET_CONDITION_HOLD_END: - { + case EVENT_INET_CONDITION_HOLD_END: { int netType = msg.arg1; int sequence = msg.arg2; handleInetConditionHoldEnd(netType, sequence); break; } - case EVENT_SET_NETWORK_PREFERENCE: - { + case EVENT_SET_NETWORK_PREFERENCE: { int preference = msg.arg1; handleSetNetworkPreference(preference); break; } - case EVENT_SET_MOBILE_DATA: - { + case EVENT_SET_MOBILE_DATA: { boolean enabled = (msg.arg1 == ENABLED); handleSetMobileData(enabled); break; } - case EVENT_APPLY_GLOBAL_HTTP_PROXY: - { + case EVENT_APPLY_GLOBAL_HTTP_PROXY: { handleDeprecatedGlobalHttpProxy(); break; } - case EVENT_SET_DEPENDENCY_MET: - { + case EVENT_SET_DEPENDENCY_MET: { boolean met = (msg.arg1 == ENABLED); handleSetDependencyMet(msg.arg2, met); break; } - case EVENT_SEND_STICKY_BROADCAST_INTENT: - { + case EVENT_SEND_STICKY_BROADCAST_INTENT: { Intent intent = (Intent)msg.obj; sendStickyBroadcast(intent); break; @@ -3101,10 +3117,12 @@ public class ConnectivityService extends IConnectivityManager.Stub { log("EVENT_ENABLE_FAIL_FAST_MOBILE_DATA: stale arg1:" + msg.arg1 + " != tag:" + tag); } + break; } - case EVENT_SAMPLE_INTERVAL_ELAPSED: + case EVENT_SAMPLE_INTERVAL_ELAPSED: { handleNetworkSamplingTimeout(); break; + } } } } @@ -3911,39 +3929,41 @@ public class ConnectivityService extends IConnectivityManager.Stub { /** * No connection was possible to the network. + * This is NOT a warm sim. */ - public static final int CMP_RESULT_CODE_NO_CONNECTION = 0; + private static final int CMP_RESULT_CODE_NO_CONNECTION = 0; /** * A connection was made to the internet, all is well. + * This is NOT a warm sim. */ - public static final int CMP_RESULT_CODE_CONNECTABLE = 1; + private static final int CMP_RESULT_CODE_CONNECTABLE = 1; /** - * A connection was made but there was a redirection, we appear to be in walled garden. - * This is an indication of a warm sim on a mobile network. + * A connection was made but no dns server was available to resolve a name to address. + * This is NOT a warm sim since provisioning network is supported. */ - public static final int CMP_RESULT_CODE_REDIRECTED = 2; + private static final int CMP_RESULT_CODE_NO_DNS = 2; /** - * A connection was made but no dns server was available to resolve a name to address. - * This is an indication of a warm sim on a mobile network. + * A connection was made but could not open a TCP connection. + * This is NOT a warm sim since provisioning network is supported. */ - public static final int CMP_RESULT_CODE_NO_DNS = 3; + private static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 3; /** - * A connection was made but could not open a TCP connection. - * This is an indication of a warm sim on a mobile network. + * A connection was made but there was a redirection, we appear to be in walled garden. + * This is an indication of a warm sim on a mobile network such as T-Mobile. */ - public static final int CMP_RESULT_CODE_NO_TCP_CONNECTION = 4; + private static final int CMP_RESULT_CODE_REDIRECTED = 4; /** * The mobile network is a provisioning network. - * This is an indication of a warm sim on a mobile network. + * This is an indication of a warm sim on a mobile network such as AT&T. */ - public static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5; + private static final int CMP_RESULT_CODE_PROVISIONING_NETWORK = 5; - AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false); + private AtomicBoolean mIsCheckingMobileProvisioning = new AtomicBoolean(false); @Override public int checkMobileProvisioning(int suggestedTimeOutMs) { @@ -4018,7 +4038,9 @@ public class ConnectivityService extends IConnectivityManager.Stub { mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI].getNetworkInfo(); switch(result) { case CMP_RESULT_CODE_CONNECTABLE: - case CMP_RESULT_CODE_NO_CONNECTION: { + case CMP_RESULT_CODE_NO_CONNECTION: + case CMP_RESULT_CODE_NO_DNS: + case CMP_RESULT_CODE_NO_TCP_CONNECTION: { if (DBG) log("CheckMp.onComplete: ignore, connected or no connection"); break; } @@ -4037,8 +4059,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { } break; } - case CMP_RESULT_CODE_NO_DNS: - case CMP_RESULT_CODE_NO_TCP_CONNECTION: { + case CMP_RESULT_CODE_PROVISIONING_NETWORK: { String url = getMobileProvisioningUrl(); if (TextUtils.isEmpty(url) == false) { if (DBG) log("CheckMp.onComplete: warm (no dns/tcp), url=" + url); @@ -4204,8 +4225,8 @@ public class ConnectivityService extends IConnectivityManager.Stub { MobileDataStateTracker mdst = (MobileDataStateTracker) mCs.mNetTrackers[ConnectivityManager.TYPE_MOBILE_HIPRI]; if (mdst.isProvisioningNetwork()) { - if (DBG) log("isMobileOk: isProvisioningNetwork is true, no TCP conn"); - result = CMP_RESULT_CODE_NO_TCP_CONNECTION; + if (DBG) log("isMobileOk: isProvisioningNetwork is true"); + result = CMP_RESULT_CODE_PROVISIONING_NETWORK; return result; } else { if (DBG) log("isMobileOk: isProvisioningNetwork is false, continue"); @@ -4285,25 +4306,37 @@ public class ConnectivityService extends IConnectivityManager.Stub { urlConn.setAllowUserInteraction(false); urlConn.setRequestProperty("Connection", "close"); int responseCode = urlConn.getResponseCode(); + + // For debug display the headers + Map<String, List<String>> headers = urlConn.getHeaderFields(); + log("isMobileOk: headers=" + headers); + + // Close the connection + urlConn.disconnect(); + urlConn = null; + if (responseCode == 204) { + // Return + log("isMobileOk: expected responseCode=" + responseCode); result = CMP_RESULT_CODE_CONNECTABLE; + return result; } else { + // Retry to be sure this was redirected, we've gotten + // occasions where a server returned 200 even though + // the device didn't have a "warm" sim. + log("isMobileOk: not expected responseCode=" + responseCode); result = CMP_RESULT_CODE_REDIRECTED; } - log("isMobileOk: connected responseCode=" + responseCode); - urlConn.disconnect(); - urlConn = null; - return result; } catch (Exception e) { log("isMobileOk: HttpURLConnection Exception e=" + e); + result = CMP_RESULT_CODE_NO_TCP_CONNECTION; if (urlConn != null) { urlConn.disconnect(); urlConn = null; } } } - result = CMP_RESULT_CODE_NO_TCP_CONNECTION; - log("isMobileOk: loops|timed out"); + log("isMobileOk: loops|timed out result=" + result); return result; } catch (Exception e) { log("isMobileOk: Exception e=" + e); @@ -4418,8 +4451,7 @@ public class ConnectivityService extends IConnectivityManager.Stub { // If provisioning network handle as a special case, // otherwise launch browser with the intent directly. NetworkInfo ni = getProvisioningNetworkInfo(); - if ((ni != null) && ni.getDetailedState() == - NetworkInfo.DetailedState.CONNECTED_TO_PROVISIONING_NETWORK) { + if ((ni != null) && ni.isConnectedToProvisioningNetwork()) { if (DBG) log("handleMobileProvisioningAction: on provisioning network"); MobileDataStateTracker mdst = (MobileDataStateTracker) mNetTrackers[ConnectivityManager.TYPE_MOBILE]; @@ -4689,39 +4721,39 @@ public class ConnectivityService extends IConnectivityManager.Stub { }; @Override - public LinkInfo getLinkInfo(int networkType) { + public LinkQualityInfo getLinkQualityInfo(int networkType) { enforceAccessPermission(); if (isNetworkTypeValid(networkType)) { - return mNetTrackers[networkType].getLinkInfo(); + return mNetTrackers[networkType].getLinkQualityInfo(); } else { return null; } } @Override - public LinkInfo getActiveLinkInfo() { + public LinkQualityInfo getActiveLinkQualityInfo() { enforceAccessPermission(); if (isNetworkTypeValid(mActiveDefaultNetwork)) { - return mNetTrackers[mActiveDefaultNetwork].getLinkInfo(); + return mNetTrackers[mActiveDefaultNetwork].getLinkQualityInfo(); } else { return null; } } @Override - public LinkInfo[] getAllLinkInfo() { + public LinkQualityInfo[] getAllLinkQualityInfo() { enforceAccessPermission(); - final ArrayList<LinkInfo> result = Lists.newArrayList(); + final ArrayList<LinkQualityInfo> result = Lists.newArrayList(); for (NetworkStateTracker tracker : mNetTrackers) { if (tracker != null) { - LinkInfo li = tracker.getLinkInfo(); + LinkQualityInfo li = tracker.getLinkQualityInfo(); if (li != null) { result.add(li); } } } - return result.toArray(new LinkInfo[result.size()]); + return result.toArray(new LinkQualityInfo[result.size()]); } /* Infrastructure for network sampling */ @@ -4775,4 +4807,3 @@ public class ConnectivityService extends IConnectivityManager.Stub { mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, wakeupTime, intent); } } - diff --git a/services/java/com/android/server/CountryDetectorService.java b/services/java/com/android/server/CountryDetectorService.java index 4956dd5bd80a..a478b2f47637 100644 --- a/services/java/com/android/server/CountryDetectorService.java +++ b/services/java/com/android/server/CountryDetectorService.java @@ -97,11 +97,12 @@ public class CountryDetectorService extends ICountryDetector.Stub implements Run } @Override - public Country detectCountry() throws RemoteException { + public Country detectCountry() { if (!mSystemReady) { - throw new RemoteException(); + return null; // server not yet active + } else { + return mCountryDetector.detectCountry(); } - return mCountryDetector.detectCountry(); } /** diff --git a/services/java/com/android/server/DropBoxManagerService.java b/services/java/com/android/server/DropBoxManagerService.java index 5008270db770..29b04da9c564 100644 --- a/services/java/com/android/server/DropBoxManagerService.java +++ b/services/java/com/android/server/DropBoxManagerService.java @@ -24,6 +24,7 @@ import android.content.IntentFilter; import android.content.pm.PackageManager; import android.database.ContentObserver; import android.net.Uri; +import android.os.Binder; import android.os.Debug; import android.os.DropBoxManager; import android.os.FileUtils; @@ -265,8 +266,13 @@ public final class DropBoxManagerService extends IDropBoxManagerService.Stub { } public boolean isTagEnabled(String tag) { - return !"disabled".equals(Settings.Global.getString( - mContentResolver, Settings.Global.DROPBOX_TAG_PREFIX + tag)); + final long token = Binder.clearCallingIdentity(); + try { + return !"disabled".equals(Settings.Global.getString( + mContentResolver, Settings.Global.DROPBOX_TAG_PREFIX + tag)); + } finally { + Binder.restoreCallingIdentity(token); + } } public synchronized DropBoxManager.Entry getNextEntry(String tag, long millis) { diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index dfcab292d653..82cc54007e4d 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -838,6 +838,18 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override + public void setMtu(String iface, int mtu) { + mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + + final NativeDaemonEvent event; + try { + event = mConnector.execute("interface", "setmtu", iface, mtu); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } + } + + @Override public void shutdown() { // TODO: remove from aidl if nobody calls externally mContext.enforceCallingOrSelfPermission(SHUTDOWN, TAG); diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index d677f2497cbd..162add425cf5 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -821,6 +821,11 @@ class WallpaperManagerService extends IWallpaperManager.Stub { int serviceUserId = wallpaper.userId; ServiceInfo si = mIPackageManager.getServiceInfo(componentName, PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS, serviceUserId); + if (si == null) { + // The wallpaper component we're trying to use doesn't exist + Slog.w(TAG, "Attempted wallpaper " + componentName + " is unavailable"); + return false; + } if (!android.Manifest.permission.BIND_WALLPAPER.equals(si.permission)) { String msg = "Selected service does not require " + android.Manifest.permission.BIND_WALLPAPER diff --git a/services/java/com/android/server/Watchdog.java b/services/java/com/android/server/Watchdog.java index ec573f947a50..616090ebe13b 100644 --- a/services/java/com/android/server/Watchdog.java +++ b/services/java/com/android/server/Watchdog.java @@ -129,7 +129,12 @@ public class Watchdog extends Thread { } public String describeBlockedStateLocked() { - return mCurrentMonitor == null ? mName : mCurrentMonitor.getClass().getName(); + if (mCurrentMonitor == null) { + return "Blocked in handler on " + mName + " (" + getThread().getName() + ")"; + } else { + return "Blocked in monitor " + mCurrentMonitor.getClass().getName() + + " on " + mName + " (" + getThread().getName() + ")"; + } } @Override @@ -291,7 +296,7 @@ public class Watchdog extends Thread { boolean waitedHalf = false; while (true) { final ArrayList<HandlerChecker> blockedCheckers; - final String name; + final String subject; final boolean allowRestart; synchronized (this) { long timeout = TIME_TO_WAIT; @@ -336,14 +341,14 @@ public class Watchdog extends Thread { } blockedCheckers = getBlockedCheckersLocked(); - name = describeCheckersLocked(blockedCheckers); + subject = describeCheckersLocked(blockedCheckers); allowRestart = mAllowRestart; } // If we got here, that means that the system is most likely hung. // First collect stack traces from all threads of the system process. // Then kill this process so that the system will restart. - EventLog.writeEvent(EventLogTags.WATCHDOG, name); + EventLog.writeEvent(EventLogTags.WATCHDOG, subject); ArrayList<Integer> pids = new ArrayList<Integer>(); pids.add(Process.myPid()); @@ -379,7 +384,7 @@ public class Watchdog extends Thread { public void run() { mActivity.addErrorToDropBox( "watchdog", null, "system_server", null, null, - name, null, stack, null); + subject, null, stack, null); } }; dropboxThread.start(); @@ -396,7 +401,7 @@ public class Watchdog extends Thread { try { Binder.setDumpDisabled("Service dumps disabled due to hung system process."); // 1 = keep waiting, -1 = kill system - int res = controller.systemNotResponding(name); + int res = controller.systemNotResponding(subject); if (res >= 0) { Slog.i(TAG, "Activity controller requested to coninue to wait"); waitedHalf = false; @@ -412,7 +417,7 @@ public class Watchdog extends Thread { } else if (!allowRestart) { Slog.w(TAG, "Restart not allowed: Watchdog is *not* killing the system process"); } else { - Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name); + Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + subject); for (int i=0; i<blockedCheckers.size(); i++) { Slog.w(TAG, blockedCheckers.get(i).getName() + " stack trace:"); StackTraceElement[] stackTrace diff --git a/services/java/com/android/server/am/BatteryStatsService.java b/services/java/com/android/server/am/BatteryStatsService.java index 12cad7be19a4..0dd950e1c566 100644 --- a/services/java/com/android/server/am/BatteryStatsService.java +++ b/services/java/com/android/server/am/BatteryStatsService.java @@ -481,7 +481,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub { private void dumpHelp(PrintWriter pw) { pw.println("Battery stats (batterystats) dump options:"); - pw.println(" [--checkin] [--unplugged] [--reset] [--write] [-h] [<package.name>]"); + pw.println(" [--checkin] [-c] [--unplugged] [--reset] [--write] [-h] [<package.name>]"); pw.println(" --checkin: format output for a checkin report."); pw.println(" --unplugged: only output data since last unplugged."); pw.println(" --reset: reset the stats, clearing all current data."); @@ -501,6 +501,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub { } boolean isCheckin = false; + boolean includeHistory = false; boolean isUnpluggedOnly = false; boolean noOutput = false; int reqUid = -1; @@ -508,6 +509,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub { for (String arg : args) { if ("--checkin".equals(arg)) { isCheckin = true; + } else if ("-c".equals(arg)) { + isCheckin = true; + includeHistory = true; } else if ("--unplugged".equals(arg)) { isUnpluggedOnly = true; } else if ("--reset".equals(arg)) { @@ -550,7 +554,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub { if (isCheckin) { List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); synchronized (mStats) { - mStats.dumpCheckinLocked(pw, apps, isUnpluggedOnly); + mStats.dumpCheckinLocked(pw, apps, isUnpluggedOnly, includeHistory); } } else { synchronized (mStats) { diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java index 55409c2018d7..43ae46fd33c4 100644 --- a/services/java/com/android/server/am/ProcessStatsService.java +++ b/services/java/com/android/server/am/ProcessStatsService.java @@ -413,6 +413,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { mWriteLock.lock(); try { synchronized (mAm) { + mProcessStats.mTimePeriodEndRealtime = SystemClock.elapsedRealtime(); mProcessStats.writeToParcel(current, 0); } if (historic != null) { diff --git a/services/java/com/android/server/am/ReceiverList.java b/services/java/com/android/server/am/ReceiverList.java index b19cc5d361b2..fa8c1dfc4fda 100644 --- a/services/java/com/android/server/am/ReceiverList.java +++ b/services/java/com/android/server/am/ReceiverList.java @@ -69,7 +69,7 @@ final class ReceiverList extends ArrayList<BroadcastFilter> } void dumpLocal(PrintWriter pw, String prefix) { - pw.print(prefix); pw.print("app="); pw.print(app.toShortString()); + pw.print(prefix); pw.print("app="); pw.print(app != null ? app.toShortString() : null); pw.print(" pid="); pw.print(pid); pw.print(" uid="); pw.print(uid); pw.print(" user="); pw.println(userId); if (curBroadcast != null || linkedToDeath) { diff --git a/services/java/com/android/server/display/WifiDisplayController.java b/services/java/com/android/server/display/WifiDisplayController.java index cd201f5bd4e4..9a4cfb77775a 100644 --- a/services/java/com/android/server/display/WifiDisplayController.java +++ b/services/java/com/android/server/display/WifiDisplayController.java @@ -150,6 +150,8 @@ final class WifiDisplayController implements DumpUtils.Dump { // Certification private boolean mWifiDisplayCertMode; + private int mWifiDisplayWpsConfig = WpsInfo.INVALID; + private WifiP2pDevice mThisDevice; public WifiDisplayController(Context context, Handler handler, Listener listener) { @@ -179,6 +181,8 @@ final class WifiDisplayController implements DumpUtils.Dump { Settings.Global.WIFI_DISPLAY_ON), false, settingsObserver); resolver.registerContentObserver(Settings.Global.getUriFor( Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON), false, settingsObserver); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.WIFI_DISPLAY_WPS_CONFIG), false, settingsObserver); updateSettings(); } @@ -189,6 +193,12 @@ final class WifiDisplayController implements DumpUtils.Dump { mWifiDisplayCertMode = Settings.Global.getInt(resolver, Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 0) != 0; + mWifiDisplayWpsConfig = WpsInfo.INVALID; + if (mWifiDisplayCertMode) { + mWifiDisplayWpsConfig = Settings.Global.getInt(resolver, + Settings.Global.WIFI_DISPLAY_WPS_CONFIG, WpsInfo.INVALID); + } + updateWfdEnableState(); } @@ -286,6 +296,25 @@ final class WifiDisplayController implements DumpUtils.Dump { } } else { // WFD should be disabled. + if (mWfdEnabled || mWfdEnabling) { + WifiP2pWfdInfo wfdInfo = new WifiP2pWfdInfo(); + wfdInfo.setWfdEnabled(false); + mWifiP2pManager.setWFDInfo(mWifiP2pChannel, wfdInfo, new ActionListener() { + @Override + public void onSuccess() { + if (DEBUG) { + Slog.d(TAG, "Successfully set WFD info."); + } + } + + @Override + public void onFailure(int reason) { + if (DEBUG) { + Slog.d(TAG, "Failed to set WFD info with reason " + reason + "."); + } + } + }); + } mWfdEnabling = false; mWfdEnabled = false; reportFeatureState(); @@ -589,7 +618,9 @@ final class WifiDisplayController implements DumpUtils.Dump { mConnectingDevice = mDesiredDevice; WifiP2pConfig config = new WifiP2pConfig(); WpsInfo wps = new WpsInfo(); - if (mConnectingDevice.wpsPbcSupported()) { + if (mWifiDisplayWpsConfig != WpsInfo.INVALID) { + wps.setup = mWifiDisplayWpsConfig; + } else if (mConnectingDevice.wpsPbcSupported()) { wps.setup = WpsInfo.PBC; } else if (mConnectingDevice.wpsDisplaySupported()) { // We do keypad if peer does display diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java index af60f8467f51..d0e9fe1fd813 100644 --- a/services/java/com/android/server/pm/UserManagerService.java +++ b/services/java/com/android/server/pm/UserManagerService.java @@ -416,12 +416,6 @@ public class UserManagerService extends IUserManager.Stub { if (restrictions == null) return; synchronized (mPackagesLock) { - // If the user has restrictions already and call is trying to disallow restrictions, - // don't modify the flag. - if (hasRestrictionsPinLocked(userId) - && restrictions.getBoolean(UserManager.DISALLOW_APP_RESTRICTIONS, false)) { - restrictions.putBoolean(UserManager.DISALLOW_APP_RESTRICTIONS, false); - } mUserRestrictions.get(userId).clear(); mUserRestrictions.get(userId).putAll(restrictions); writeUserLocked(mUsers.get(userId)); @@ -686,7 +680,6 @@ public class UserManagerService extends IUserManager.Stub { writeBoolean(serializer, restrictions, UserManager.DISALLOW_USB_FILE_TRANSFER); writeBoolean(serializer, restrictions, UserManager.DISALLOW_CONFIG_CREDENTIALS); writeBoolean(serializer, restrictions, UserManager.DISALLOW_REMOVE_USER); - writeBoolean(serializer, restrictions, UserManager.DISALLOW_APP_RESTRICTIONS); serializer.endTag(null, TAG_RESTRICTIONS); } serializer.endTag(null, TAG_USER); @@ -817,7 +810,6 @@ public class UserManagerService extends IUserManager.Stub { readBoolean(parser, restrictions, UserManager.DISALLOW_USB_FILE_TRANSFER); readBoolean(parser, restrictions, UserManager.DISALLOW_CONFIG_CREDENTIALS); readBoolean(parser, restrictions, UserManager.DISALLOW_REMOVE_USER); - readBoolean(parser, restrictions, UserManager.DISALLOW_APP_RESTRICTIONS); } } } @@ -1130,7 +1122,7 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public boolean changeRestrictionsPin(String newPin) { + public boolean setRestrictionsChallenge(String newPin) { checkManageUsersPermission("Only system can modify the restrictions pin"); int userId = UserHandle.getCallingUserId(); synchronized (mPackagesLock) { @@ -1157,7 +1149,7 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public int checkRestrictionsPin(String pin) { + public int checkRestrictionsChallenge(String pin) { checkManageUsersPermission("Only system can verify the restrictions pin"); int userId = UserHandle.getCallingUserId(); synchronized (mPackagesLock) { @@ -1200,7 +1192,7 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public boolean hasRestrictionsPin() { + public boolean hasRestrictionsChallenge() { int userId = UserHandle.getCallingUserId(); synchronized (mPackagesLock) { return hasRestrictionsPinLocked(userId); @@ -1227,7 +1219,7 @@ public class UserManagerService extends IUserManager.Stub { // Remove all user restrictions setUserRestrictions(new Bundle(), userHandle); // Remove restrictions pin - changeRestrictionsPin(null); + setRestrictionsChallenge(null); // Remove any app restrictions cleanAppRestrictions(userHandle, true); } diff --git a/services/java/com/android/server/power/ElectronBeam.java b/services/java/com/android/server/power/ElectronBeam.java index 379e704ab1d9..0d92f660b6ca 100644 --- a/services/java/com/android/server/power/ElectronBeam.java +++ b/services/java/com/android/server/power/ElectronBeam.java @@ -319,10 +319,10 @@ final class ElectronBeam { /** * Draws a frame where the electron beam has been stretched out into - * a thin white horizontal line that fades as it expands outwards. + * a thin white horizontal line that fades as it collapses inwards. * - * @param stretch The stretch factor. 0.0 is no stretch / no fade, - * 1.0 is maximum stretch / maximum fade. + * @param stretch The stretch factor. 0.0 is maximum stretch / no fade, + * 1.0 is collapsed / maximum fade. */ private void drawHStretch(float stretch) { // compute interpolation scale factor @@ -338,7 +338,7 @@ final class ElectronBeam { // draw narrow fading white line setHStretchQuad(mVertexBuffer, mDisplayWidth, mDisplayHeight, ag); - GLES10.glColor4f(1.0f - ag, 1.0f - ag, 1.0f - ag, 1.0f); + GLES10.glColor4f(1.0f - ag*0.75f, 1.0f - ag*0.75f, 1.0f - ag*0.75f, 1.0f); GLES10.glDrawArrays(GLES10.GL_TRIANGLE_FAN, 0, 4); // clean up @@ -355,7 +355,7 @@ final class ElectronBeam { } private static void setHStretchQuad(FloatBuffer vtx, float dw, float dh, float a) { - final float w = dw + (dw * a); + final float w = 2 * dw * (1.0f - a); final float h = 1.0f; final float x = (dw - w) * 0.5f; final float y = (dh - h) * 0.5f; diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java index 3c67aa9babd6..2ded2024d48b 100644 --- a/services/java/com/android/server/print/RemotePrintService.java +++ b/services/java/com/android/server/print/RemotePrintService.java @@ -684,20 +684,6 @@ final class RemotePrintService implements DeathRecipient { } } - @Override - public void onPrintersUpdated(List<PrinterInfo> printers) { - RemotePrintService service = mWeakService.get(); - if (service != null) { - throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers); - final long identity = Binder.clearCallingIdentity(); - try { - service.mUserState.onPrintersUpdated(printers); - } finally { - Binder.restoreCallingIdentity(identity); - } - } - } - private void throwIfPrinterIdsForPrinterInfoTampered(ComponentName serviceName, List<PrinterInfo> printerInfos) { final int printerInfoCount = printerInfos.size(); diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java index b9c676d0e28d..b37a0d91d4bd 100644 --- a/services/java/com/android/server/print/UserState.java +++ b/services/java/com/android/server/print/UserState.java @@ -276,22 +276,6 @@ final class UserState implements PrintSpoolerCallbacks { } } - public void onPrintersUpdated(List<PrinterInfo> printers) { - synchronized (mLock) { - throwIfDestroyedLocked(); - // No services - nothing to do. - if (mActiveServices.isEmpty()) { - return; - } - // No session - nothing to do. - if (mPrinterDiscoverySession == null) { - return; - } - // Request an updated. - mPrinterDiscoverySession.onPrintersUpdatedLocked(printers); - } - } - public void updateIfNeededLocked() { throwIfDestroyedLocked(); if (readConfigurationLocked()) { @@ -746,8 +730,8 @@ final class UserState implements PrintSpoolerCallbacks { final int addedPrinterCount = printers.size(); for (int i = 0; i < addedPrinterCount; i++) { PrinterInfo printer = printers.get(i); - if (!mPrinters.containsKey(printer.getId())) { - mPrinters.put(printer.getId(), printer); + PrinterInfo oldPrinter = mPrinters.put(printer.getId(), printer); + if (oldPrinter == null || !oldPrinter.equals(printer)) { if (addedPrinters == null) { addedPrinters = new ArrayList<PrinterInfo>(); } @@ -785,32 +769,6 @@ final class UserState implements PrintSpoolerCallbacks { } } - public void onPrintersUpdatedLocked(List<PrinterInfo> printers) { - if (DEBUG) { - Log.i(LOG_TAG, "onPrintersUpdatedLocked()"); - } - if (mIsDestroyed) { - Log.w(LOG_TAG, "Not updating printers - session destroyed"); - return; - } - List<PrinterInfo> updatedPrinters = null; - final int updatedPrinterCount = printers.size(); - for (int i = 0; i < updatedPrinterCount; i++) { - PrinterInfo updatedPrinter = printers.get(i); - if (mPrinters.containsKey(updatedPrinter.getId())) { - mPrinters.put(updatedPrinter.getId(), updatedPrinter); - if (updatedPrinters == null) { - updatedPrinters = new ArrayList<PrinterInfo>(); - } - updatedPrinters.add(updatedPrinter); - } - } - if (updatedPrinters != null) { - mHandler.obtainMessage(SessionHandler.MSG_DISPATCH_PRINTERS_UPDATED, - updatedPrinters).sendToTarget(); - } - } - public void onServiceRemovedLocked(ComponentName serviceName) { if (mIsDestroyed) { Log.w(LOG_TAG, "Not updating removed service - session destroyed"); @@ -821,21 +779,21 @@ final class UserState implements PrintSpoolerCallbacks { return; } // Remove the printers for that service. - List<PrinterInfo> removedPrinters = null; + List<PrinterId> removedPrinterIds = null; final int printerCount = mPrinters.size(); for (int i = 0; i < printerCount; i++) { - PrinterInfo printer = mPrinters.get(i); - if (printer.getId().getServiceName().equals(serviceName)) { - if (removedPrinters == null) { - removedPrinters = new ArrayList<PrinterInfo>(); + PrinterId printerId = mPrinters.keyAt(i); + if (printerId.getServiceName().equals(serviceName)) { + if (removedPrinterIds == null) { + removedPrinterIds = new ArrayList<PrinterId>(); } - removedPrinters.add(printer); + removedPrinterIds.add(printerId); } } - if (!removedPrinters.isEmpty()) { + if (!removedPrinterIds.isEmpty()) { mHandler.obtainMessage( SessionHandler.MSG_DISPATCH_PRINTERS_REMOVED, - removedPrinters).sendToTarget(); + removedPrinterIds).sendToTarget(); } } @@ -874,15 +832,6 @@ final class UserState implements PrintSpoolerCallbacks { mDiscoveryObservers.finishBroadcast(); } - private void handleDispatchPrintersUpdated(List<PrinterInfo> updatedPrinters) { - final int observerCount = mDiscoveryObservers.beginBroadcast(); - for (int i = 0; i < observerCount; i++) { - IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i); - handlePrintersUpdated(observer, updatedPrinters); - } - mDiscoveryObservers.finishBroadcast(); - } - private void handleDispatchCreatePrinterDiscoverySession( List<RemotePrintService> services) { final int serviceCount = services.size(); @@ -976,43 +925,21 @@ final class UserState implements PrintSpoolerCallbacks { } } - private void handlePrintersUpdated(IPrinterDiscoveryObserver observer, - List<PrinterInfo> updatedPrinters) { - try { - final int printerCount = updatedPrinters.size(); - if (printerCount <= MAX_ITEMS_PER_CALLBACK) { - observer.onPrintersUpdated(updatedPrinters); - } else { - // Send the added printers in chunks avoiding the binder transaction limit. - final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1; - for (int i = 0; i < transactionCount; i++) { - final int start = i * MAX_ITEMS_PER_CALLBACK; - final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount); - List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end); - observer.onPrintersUpdated(subPrinters); - } - } - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error sending updated printers", re); - } - } - private final class SessionHandler extends Handler { public static final int MSG_PRINTERS_ADDED = 1; public static final int MSG_PRINTERS_REMOVED = 2; public static final int MSG_DISPATCH_PRINTERS_ADDED = 3; public static final int MSG_DISPATCH_PRINTERS_REMOVED = 4; - public static final int MSG_DISPATCH_PRINTERS_UPDATED = 5; - - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 6; - public static final int MSG_START_PRINTER_DISCOVERY = 7; - public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 8; - public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 9; - public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 10; - public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 11; - public static final int MSG_VALIDATE_PRINTERS = 12; - public static final int MSG_START_PRINTER_STATE_TRACKING = 13; - public static final int MSG_STOP_PRINTER_STATE_TRACKING = 14; + + public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 5; + public static final int MSG_START_PRINTER_DISCOVERY = 6; + public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 7; + public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 8; + public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 9; + public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 10; + public static final int MSG_VALIDATE_PRINTERS = 11; + public static final int MSG_START_PRINTER_STATE_TRACKING = 12; + public static final int MSG_STOP_PRINTER_STATE_TRACKING = 13; SessionHandler(Looper looper) { super(looper, null, false); @@ -1048,11 +975,6 @@ final class UserState implements PrintSpoolerCallbacks { handleDispatchPrintersRemoved(removedPrinterIds); } break; - case MSG_DISPATCH_PRINTERS_UPDATED: { - List<PrinterInfo> updatedPrinters = (List<PrinterInfo>) message.obj; - handleDispatchPrintersUpdated(updatedPrinters); - } break; - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { RemotePrintService service = (RemotePrintService) message.obj; service.createPrinterDiscoverySession(); diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 4185aea5278d..40201ada54b8 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -412,12 +412,12 @@ public class TelephonyManager { case RILConstants.NETWORK_MODE_GSM_UMTS: case RILConstants.NETWORK_MODE_LTE_GSM_WCDMA: case RILConstants.NETWORK_MODE_LTE_WCDMA: + case RILConstants.NETWORK_MODE_LTE_CMDA_EVDO_GSM_WCDMA: return PhoneConstants.PHONE_TYPE_GSM; // Use CDMA Phone for the global mode including CDMA case RILConstants.NETWORK_MODE_GLOBAL: case RILConstants.NETWORK_MODE_LTE_CDMA_EVDO: - case RILConstants.NETWORK_MODE_LTE_CMDA_EVDO_GSM_WCDMA: return PhoneConstants.PHONE_TYPE_CDMA; case RILConstants.NETWORK_MODE_LTE_ONLY: diff --git a/telephony/java/com/android/internal/telephony/DctConstants.java b/telephony/java/com/android/internal/telephony/DctConstants.java index c661b00ceeb6..4be11b879230 100644 --- a/telephony/java/com/android/internal/telephony/DctConstants.java +++ b/telephony/java/com/android/internal/telephony/DctConstants.java @@ -96,6 +96,7 @@ public class DctConstants { public static final int CMD_SET_ENABLE_FAIL_FAST_MOBILE_DATA = BASE + 36; public static final int CMD_ENABLE_MOBILE_PROVISIONING = BASE + 37; public static final int CMD_IS_PROVISIONING_APN = BASE + 38; + public static final int EVENT_PROVISIONING_APN_ALARM = BASE + 39; /***** Constants *****/ diff --git a/test-runner/src/android/test/mock/MockContentProvider.java b/test-runner/src/android/test/mock/MockContentProvider.java index 596ea0aee6a6..28d52b005de3 100644 --- a/test-runner/src/android/test/mock/MockContentProvider.java +++ b/test-runner/src/android/test/mock/MockContentProvider.java @@ -137,6 +137,16 @@ public class MockContentProvider extends ContentProvider { public ICancellationSignal createCancellationSignal() throws RemoteException { return null; } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + return MockContentProvider.this.canonicalize(uri); + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + return MockContentProvider.this.uncanonicalize(uri); + } } private final InversionIContentProvider mIContentProvider = new InversionIContentProvider(); diff --git a/test-runner/src/android/test/mock/MockIContentProvider.java b/test-runner/src/android/test/mock/MockIContentProvider.java index b14ce4935120..c0dc7c3ca316 100644 --- a/test-runner/src/android/test/mock/MockIContentProvider.java +++ b/test-runner/src/android/test/mock/MockIContentProvider.java @@ -114,4 +114,14 @@ public class MockIContentProvider implements IContentProvider { public ICancellationSignal createCancellationSignal() throws RemoteException { throw new UnsupportedOperationException("unimplemented mock method"); } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + throw new UnsupportedOperationException("unimplemented mock method"); + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + throw new UnsupportedOperationException("unimplemented mock method"); + } } diff --git a/tests/TransitionTests/res/scene/incorrect_password_scene.xml b/tests/TransitionTests/res/scene/incorrect_password_scene.xml deleted file mode 100644 index a31ad2202c34..000000000000 --- a/tests/TransitionTests/res/scene/incorrect_password_scene.xml +++ /dev/null @@ -1,2 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/incorrect_password"/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/login_scene.xml b/tests/TransitionTests/res/scene/login_scene.xml deleted file mode 100644 index b25830385cc4..000000000000 --- a/tests/TransitionTests/res/scene/login_scene.xml +++ /dev/null @@ -1,2 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/activity_login"/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/new_user_scene.xml b/tests/TransitionTests/res/scene/new_user_scene.xml deleted file mode 100644 index d6e5f0f47da0..000000000000 --- a/tests/TransitionTests/res/scene/new_user_scene.xml +++ /dev/null @@ -1,2 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/new_user"/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/password_scene.xml b/tests/TransitionTests/res/scene/password_scene.xml deleted file mode 100644 index 99a003887f11..000000000000 --- a/tests/TransitionTests/res/scene/password_scene.xml +++ /dev/null @@ -1,2 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/login_password"/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/results_scene.xml b/tests/TransitionTests/res/scene/results_scene.xml deleted file mode 100644 index 9c9fc6954349..000000000000 --- a/tests/TransitionTests/res/scene/results_scene.xml +++ /dev/null @@ -1,3 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/results_screen"> -</scene>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/search_scene.xml b/tests/TransitionTests/res/scene/search_scene.xml deleted file mode 100644 index 742cd572d51a..000000000000 --- a/tests/TransitionTests/res/scene/search_scene.xml +++ /dev/null @@ -1,3 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/search_screen"> -</scene>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/success_scene.xml b/tests/TransitionTests/res/scene/success_scene.xml deleted file mode 100644 index 3d76d891726a..000000000000 --- a/tests/TransitionTests/res/scene/success_scene.xml +++ /dev/null @@ -1,2 +0,0 @@ -<scene xmlns:android="http://schemas.android.com/apk/res/android" - android:layout="@layout/success"/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/transition/colorizer_transition.xml b/tests/TransitionTests/res/transition/colorizer_transition.xml index 731d7ee58fe6..12f4be778aba 100644 --- a/tests/TransitionTests/res/transition/colorizer_transition.xml +++ b/tests/TransitionTests/res/transition/colorizer_transition.xml @@ -1,6 +1,6 @@ -<recolor xmlns:android="http://schemas.android.com/apk/res/android">> +<recolor xmlns:android="http://schemas.android.com/apk/res/android"> <targets> - <target android:targetID="@id/password"/> - <target android:targetID="@id/passwordEdit"/> + <target android:targetId="@id/password"/> + <target android:targetId="@id/passwordEdit"/> </targets> </recolor>
\ No newline at end of file diff --git a/tests/TransitionTests/res/transition/login_slider_transition.xml b/tests/TransitionTests/res/transition/login_slider_transition.xml index dbdd6e9156c6..2317857105d3 100644 --- a/tests/TransitionTests/res/transition/login_slider_transition.xml +++ b/tests/TransitionTests/res/transition/login_slider_transition.xml @@ -1,21 +1,21 @@ -<transitionGroup xmlns:android="http://schemas.android.com/apk/res/android"> +<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <slide> <targets> - <target android:targetID="@id/retype"/> - <target android:targetID="@id/retypeEdit"/> + <target android:targetId="@id/retype"/> + <target android:targetId="@id/retypeEdit"/> </targets> </slide> <recolor> <targets> - <target android:targetID="@id/password"/> - <target android:targetID="@id/passwordEdit"/> + <target android:targetId="@id/password"/> + <target android:targetId="@id/passwordEdit"/> </targets> </recolor> <fade/> -</transitionGroup> +</transitionSet> <!-- - TransitionGroup slider = new TransitionGroup(); + TransitionSet slider = new TransitionSet(); slider.addTransition(new Slide(R.id.retype, R.id.retypeEdit)); slider.addTransition(new Recolor(R.id.password, R.id.passwordEdit)); slider.addTransition(new Fade()); diff --git a/tests/TransitionTests/res/transition/login_transition_mgr.xml b/tests/TransitionTests/res/transition/login_transition_mgr.xml index 8a8b9e9842e5..5d07be00720b 100644 --- a/tests/TransitionTests/res/transition/login_transition_mgr.xml +++ b/tests/TransitionTests/res/transition/login_transition_mgr.xml @@ -1,39 +1,14 @@ <transitionManager xmlns:android="http://schemas.android.com/apk/res/android"> - <transition fromScene="@scene/login_scene" toScene="@scene/new_user_scene" - transition="@transition/login_slider_transition"/> - <transition fromScene="@scene/password_scene" toScene="@scene/new_user_scene" - transition="@transition/login_slider_transition"/> - <transition fromScene="@scene/new_user_scene" toScene="@scene/login_scene" - transition="@transition/login_slider_transition"/> - <transition fromScene="@scene/new_user_scene" toScene="@scene/password_scene" - transition="@transition/login_slider_transition"/> - <transition fromScene="@scene/login_scene" toScene="@scene/password_scene" - transition="@transition/colorizer_transition"/> - <transition fromScene="@scene/password_scene" toScene="@scene/login_scene" - transition="@transition/colorizer_transition"/> + <transition android:fromScene="@layout/activity_login" android:toScene="@layout/new_user" + android:transition="@transition/login_slider_transition"/> + <transition android:fromScene="@layout/login_password" android:toScene="@layout/new_user" + android:transition="@transition/login_slider_transition"/> + <transition android:fromScene="@layout/new_user" android:toScene="@layout/activity_login" + android:transition="@transition/login_slider_transition"/> + <transition android:fromScene="@layout/new_user" android:toScene="@layout/login_password" + android:transition="@transition/login_slider_transition"/> + <transition android:fromScene="@layout/activity_login" android:toScene="@layout/login_password" + android:transition="@transition/colorizer_transition"/> + <transition android:fromScene="@layout/login_password" android:toScene="@layout/activity_login" + android:transition="@transition/colorizer_transition"/> </transitionManager> - - <!-- - mLoginScene = new Scene(this, mSceneRoot, R.layout.activity_login); - mPasswordScene = new Scene(this, mSceneRoot, R.layout.login_password); - mIncorrectPasswordScene = new Scene(this, mSceneRoot, R.layout.incorrect_password); - mUsernameTakenScene = new Scene(this, mSceneRoot, R.layout.username_taken); - mSuccessScene = new Scene(this, mSceneRoot, R.layout.success); - mNewUserScene = new Scene(this, mSceneRoot, R.layout.new_user); - - mTransitionManager = new TransitionManager(); - // Custom transitions in/out of NewUser screen - slide in the 2nd password UI - TransitionGroup slider = new TransitionGroup(); - slider.addTransition(new Slide(R.id.retype, R.id.retypeEdit)); - slider.addTransition(new Recolor(R.id.password, R.id.passwordEdit)); - slider.addTransition(new Fade()); - mTransitionManager.setTransition(mLoginScene, mNewUserScene, slider); - mTransitionManager.setTransition(mPasswordScene, mNewUserScene, slider); - mTransitionManager.setTransition(mNewUserScene, mLoginScene, slider); - mTransitionManager.setTransition(mNewUserScene, mPasswordScene, slider); - - // Custom transitions with recoloring password field - Transition colorizer = new Recolor(R.id.password, R.id.passwordEdit); - mTransitionManager.setTransition(mLoginScene, mPasswordScene, colorizer); - mTransitionManager.setTransition(mPasswordScene, mLoginScene, colorizer); --->
\ No newline at end of file diff --git a/tests/TransitionTests/res/transition/mover.xml b/tests/TransitionTests/res/transition/mover.xml index 3c476069f528..b23d2a5124ad 100644 --- a/tests/TransitionTests/res/transition/mover.xml +++ b/tests/TransitionTests/res/transition/mover.xml @@ -1 +1 @@ -<move/>
\ No newline at end of file +<changeBounds/>
\ No newline at end of file diff --git a/tests/TransitionTests/res/transition/mover_fader.xml b/tests/TransitionTests/res/transition/mover_fader.xml index 8b805e94b423..ef116761feed 100644 --- a/tests/TransitionTests/res/transition/mover_fader.xml +++ b/tests/TransitionTests/res/transition/mover_fader.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<transitionGroup xmlns:android="http://schemas.android.com/apk/res/android"> +<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <fade/> - <move/> -</transitionGroup>
\ No newline at end of file + <changeBounds/> +</transitionSet>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/my_scene.xml b/tests/TransitionTests/res/transition/my_scene.xml index b8278c91d1f6..b8278c91d1f6 100644 --- a/tests/TransitionTests/res/scene/my_scene.xml +++ b/tests/TransitionTests/res/transition/my_scene.xml diff --git a/tests/TransitionTests/res/transition/my_transition.xml b/tests/TransitionTests/res/transition/my_transition.xml index 14c91b9c7c6b..022313c360e6 100644 --- a/tests/TransitionTests/res/transition/my_transition.xml +++ b/tests/TransitionTests/res/transition/my_transition.xml @@ -1,20 +1,20 @@ -<transitionGroup xmlns:android="http://schemas.android.com/apk/res/android"> +<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <fade></fade> - <transitionGroup> - <move android:duration="500"> + <transitionSet> + <changeBounds android:duration="500"> <targets> - <target android:targetID="@id/container"/> - <target android:targetID="@id/resultsList"/> + <target android:targetId="@id/container"/> + <target android:targetId="@id/resultsList"/> </targets> - </move> - <transitionGroup> + </changeBounds> + <transitionSet> <targets> - <target android:targetID="@id/container"/> - <target android:targetID="@id/resultsList"/> + <target android:targetId="@id/container"/> + <target android:targetId="@id/resultsList"/> </targets> <fade android:startOffset="25"/> - </transitionGroup> + </transitionSet> <recolor/> - </transitionGroup> - <move/> -</transitionGroup>
\ No newline at end of file + </transitionSet> + <changeBounds/> +</transitionSet>
\ No newline at end of file diff --git a/tests/TransitionTests/res/transition/my_transition_mgr.xml b/tests/TransitionTests/res/transition/my_transition_mgr.xml index ca9705a2fb0b..5d8f7995b5aa 100644 --- a/tests/TransitionTests/res/transition/my_transition_mgr.xml +++ b/tests/TransitionTests/res/transition/my_transition_mgr.xml @@ -1,6 +1,6 @@ <transitionManager xmlns:android="http://schemas.android.com/apk/res/android"> - <transition fromScene="@scene/search_scene" toScene="@scene/results_scene" - transition="@transition/mover_fader"/> - <transition fromScene="@scene/results_scene" toScene="@scene/search_scene" - transition="@transition/mover_fader"/> + <transition android:fromScene="@layout/search_screen" android:toScene="@layout/results_screen" + android:transition="@transition/mover_fader"/> + <transition android:fromScene="@layout/results_screen" android:toScene="@layout/search_screen" + android:transition="@transition/mover_fader"/> </transitionManager>
\ No newline at end of file diff --git a/tests/TransitionTests/res/scene/username_taken_scene.xml b/tests/TransitionTests/res/transition/username_taken_scene.xml index b2f050eb1b63..b2f050eb1b63 100644 --- a/tests/TransitionTests/res/scene/username_taken_scene.xml +++ b/tests/TransitionTests/res/transition/username_taken_scene.xml diff --git a/tests/TransitionTests/src/com/android/transitiontests/ChangingText.java b/tests/TransitionTests/src/com/android/transitiontests/ChangingText.java index 05bed5fc17ad..a1ddd7456139 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ChangingText.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ChangingText.java @@ -19,42 +19,43 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.widget.Button; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.TextChange; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.ChangeBounds; +import android.transition.TextChange; +import android.transition.TransitionManager; public class ChangingText extends Activity { Scene mScene1, mScene2; ViewGroup mSceneRoot; - TransitionGroup mChanger; + TransitionSet mChanger; + Scene mCurrentScene; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.changing_text_1); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mScene1 = new Scene(mSceneRoot, R.layout.changing_text_1, this); - mScene2 = new Scene(mSceneRoot, R.layout.changing_text_2, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.changing_text_1, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.changing_text_2, this); - mChanger = new TransitionGroup(TransitionGroup.TOGETHER); - mChanger.addTransitions(new Move(), new TextChange()); + mChanger = new TransitionSet().setOrdering(TransitionSet.ORDERING_TOGETHER); + mChanger.addTransition(new ChangeBounds()).addTransition(new TextChange()); - mSceneRoot.setCurrentScene(mScene1); + mCurrentScene = mScene1; } public void sendMessage(View view) { - if (mSceneRoot.getCurrentScene() == mScene1) { + if (mCurrentScene == mScene1) { TransitionManager.go(mScene2, mChanger); + mCurrentScene = mScene2; } else { TransitionManager.go(mScene1, mChanger); + mCurrentScene = mScene1; } } } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java b/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java index c3201f28e0c2..85702fa53a9d 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ClippingText.java @@ -17,15 +17,15 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; +import android.transition.Scene; import android.widget.Button; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.TextChange; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.TextChange; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class ClippingText extends Activity { @@ -34,7 +34,8 @@ public class ClippingText extends Activity { ViewGroup mSceneRoot; // static Fade sFade = new Fade(R.id.removingButton, R.id.invisibleButton, R.id.goneButton); Fade fader; - TransitionGroup mChanger; + TransitionSet mChanger; + Scene mCurrentScene; @Override public void onCreate(Bundle savedInstanceState) { @@ -44,22 +45,24 @@ public class ClippingText extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mScene1 = new Scene(mSceneRoot, R.layout.clipping_text_1, this); - mScene2 = new Scene(mSceneRoot, R.layout.clipping_text_2, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.clipping_text_1, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.clipping_text_2, this); - mChanger = new TransitionGroup(TransitionGroup.TOGETHER); - Move move = new Move(); - move.setResizeClip(true); - mChanger.addTransitions(move, new TextChange()); + mChanger = new TransitionSet().setOrdering(TransitionSet.ORDERING_TOGETHER); + ChangeBounds changeBounds = new ChangeBounds(); + changeBounds.setResizeClip(true); + mChanger.addTransition(changeBounds).addTransition(new TextChange()); - mSceneRoot.setCurrentScene(mScene1); + mCurrentScene = mScene1; } public void sendMessage(View view) { - if (mSceneRoot.getCurrentScene() == mScene1) { + if (mCurrentScene == mScene1) { TransitionManager.go(mScene2, mChanger); + mCurrentScene = mScene2; } else { TransitionManager.go(mScene1, mChanger); + mCurrentScene = mScene1; } } } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java b/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java index c7da6a3263a0..482dc051afb5 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ContactsExpansion.java @@ -18,19 +18,19 @@ package com.android.transitiontests; import android.app.Activity; import android.content.Context; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Scene; -import android.view.transition.Transition; +import android.transition.Fade; +import android.transition.Scene; +import android.transition.Transition; +import android.transition.TransitionSet; import android.widget.ImageView; import android.widget.TextView; -import android.view.transition.Crossfade; -import android.view.transition.Move; -import android.view.transition.Rotate; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Crossfade; +import android.transition.Rotate; +import android.transition.TransitionManager; public class ContactsExpansion extends Activity { @@ -42,7 +42,8 @@ public class ContactsExpansion extends Activity { View currentItem = null; - TransitionGroup mMyAutoTransition = new TransitionGroup(TransitionGroup.SEQUENTIALLY); + TransitionSet mMyAutoTransition = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); @Override protected void onCreate(Bundle savedInstanceState) { @@ -73,11 +74,12 @@ public class ContactsExpansion extends Activity { ((TextView)contactItem.findViewById(R.id.contact_email)).setText(contactsData[dataIndex++]); container.addView(contactItem); - final TransitionGroup myTransition = new TransitionGroup(); - myTransition.addTransitions(new Fade(Fade.IN), - new Rotate().setTargetIds(R.id.contact_arrow), - new Move(), new Fade(Fade.OUT), - new Crossfade().setTargetIds(R.id.contact_picture)); + final TransitionSet myTransition = new TransitionSet(); + myTransition.addTransition(new Fade(Fade.IN)). + addTransition(new Rotate().addTargetId(R.id.contact_arrow)). + addTransition(new ChangeBounds()). + addTransition(new Fade(Fade.OUT)). + addTransition(new Crossfade().addTargetId(R.id.contact_picture)); final ToggleScene toggleScene = new ToggleScene(container, myTransition); contactItem.setOnClickListener(new View.OnClickListener() { @Override diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java b/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java index d5f6a2833395..eb799ec4e867 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossFadeDemo.java @@ -17,13 +17,13 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Crossfade; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Crossfade; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class CrossFadeDemo extends Activity { @@ -41,16 +41,17 @@ public class CrossFadeDemo extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mScene1 = new Scene(mSceneRoot, R.layout.crossfade, this); - mScene2 = new Scene(mSceneRoot, R.layout.crossfade_1, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.crossfade, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.crossfade_1, this); Crossfade crossfade = new Crossfade(); crossfade.setFadeBehavior(Crossfade.FADE_BEHAVIOR_CROSSFADE); crossfade.setResizeBehavior(Crossfade.RESIZE_BEHAVIOR_NONE); - crossfade.setTargetIds(R.id.textview, R.id.textview1, R.id.textview2); + crossfade.addTargetId(R.id.textview).addTargetId(R.id.textview1). + addTargetId(R.id.textview2); mTransitionManager = new TransitionManager(); - TransitionGroup moveCrossFade = new TransitionGroup(); - moveCrossFade.addTransitions(crossfade, new Move()); + TransitionSet moveCrossFade = new TransitionSet(); + moveCrossFade.addTransition(crossfade).addTransition(new ChangeBounds()); mTransitionManager.setTransition(mScene1, moveCrossFade); mTransitionManager.setTransition(mScene2, moveCrossFade); mCurrentScene = 1; diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java index 28e055f704fe..09b495fecf48 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeImage.java @@ -19,12 +19,12 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Crossfade; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Crossfade; +import android.transition.ChangeBounds; +import android.transition.Scene; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import android.widget.ImageView; public class CrossfadeImage extends Activity { @@ -48,11 +48,11 @@ public class CrossfadeImage extends Activity { mImageView.setScaleType(ImageView.ScaleType.FIT_CENTER); Crossfade mCrossfade = new Crossfade(); - mCrossfade.setTargetIds(R.id.contact_picture); + mCrossfade.addTargetId(R.id.contact_picture); - TransitionGroup group = new TransitionGroup(); + TransitionSet group = new TransitionSet(); group.setDuration(1500); - group.addTransitions(mCrossfade, new Move()); + group.addTransition(mCrossfade).addTransition(new ChangeBounds()); mTransition = group; } diff --git a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java index b82dbd8b831a..c11839879b18 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java +++ b/tests/TransitionTests/src/com/android/transitiontests/CrossfadeMultiple.java @@ -17,14 +17,14 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Crossfade; -import android.view.transition.Move; -import android.view.transition.TextChange; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Crossfade; +import android.transition.TextChange; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; @@ -40,9 +40,9 @@ public class CrossfadeMultiple extends Activity { TextView mTextView; Button mButton; Crossfade mCrossfade; - TransitionGroup mCrossfadeGroup; - TransitionGroup mTextChangeGroup1, mTextChangeGroup2; - TransitionGroup mInOutGroup; + TransitionSet mCrossfadeGroup; + TransitionSet mTextChangeGroup1, mTextChangeGroup2; + TransitionSet mInOutGroup; @Override public void onCreate(Bundle savedInstanceState) { @@ -57,34 +57,35 @@ public class CrossfadeMultiple extends Activity { mTextView = (TextView) findViewById(R.id.textview); mCrossfade = new Crossfade(); - mCrossfade.setTargetIds(R.id.button, R.id.textview, R.id.imageview); + mCrossfade.addTargetId(R.id.button).addTargetId(R.id.textview).addTargetId(R.id.imageview); - mCrossfadeGroup = new TransitionGroup(); + mCrossfadeGroup = new TransitionSet(); mCrossfadeGroup.setDuration(300); - mCrossfadeGroup.addTransitions(mCrossfade, new Move()); + mCrossfadeGroup.addTransition(mCrossfade).addTransition(new ChangeBounds()); mTransition = mCrossfadeGroup; - mInOutGroup = new TransitionGroup(); + mInOutGroup = new TransitionSet(); Crossfade inOut = new Crossfade(); inOut.setDuration(300); inOut.setFadeBehavior(Crossfade.FADE_BEHAVIOR_OUT_IN); - Move move = new Move(); - move.setStartDelay(150); - move.setDuration(0); - mInOutGroup.addTransitions(inOut, move); + ChangeBounds changeBounds = new ChangeBounds(); + changeBounds.setStartDelay(150); + changeBounds.setDuration(0); + mInOutGroup.addTransition(inOut).addTransition(changeBounds); - mTextChangeGroup1 = new TransitionGroup(); + mTextChangeGroup1 = new TransitionSet(); TextChange textChangeInOut = new TextChange(); textChangeInOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT_IN); - mTextChangeGroup1.addTransitions(textChangeInOut, new Move()); + mTextChangeGroup1.addTransition(textChangeInOut).addTransition(new ChangeBounds()); - mTextChangeGroup2 = new TransitionGroup(); - mTextChangeGroup2.setOrdering(TransitionGroup.SEQUENTIALLY); + mTextChangeGroup2 = new TransitionSet(); + mTextChangeGroup2.setOrdering(TransitionSet.ORDERING_SEQUENTIAL); TextChange textChangeOut = new TextChange(); textChangeOut.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT); TextChange textChangeIn = new TextChange(); textChangeIn.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_IN); - mTextChangeGroup2.addTransitions(textChangeOut, new Move(), textChangeIn); + mTextChangeGroup2.addTransition(textChangeOut).addTransition(new ChangeBounds()). + addTransition(textChangeIn); } public void sendMessage(View view) { diff --git a/tests/TransitionTests/src/com/android/transitiontests/DelayedTransition.java b/tests/TransitionTests/src/com/android/transitiontests/DelayedTransition.java index f05ea782bdf2..fe5f05a3c777 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/DelayedTransition.java +++ b/tests/TransitionTests/src/com/android/transitiontests/DelayedTransition.java @@ -19,7 +19,7 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.TransitionManager; +import android.transition.TransitionManager; import android.widget.Button; import android.widget.LinearLayout; import static android.widget.LinearLayout.LayoutParams; diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo1.java b/tests/TransitionTests/src/com/android/transitiontests/Demo1.java index ce7f439df8d7..5c0cd45c0426 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo1.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo1.java @@ -21,11 +21,11 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.ChangeBounds; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class Demo1 extends Activity { @@ -69,9 +69,10 @@ public class Demo1 extends Activity { public void sendMessage(View view) { if (mFirstTime) { mFirstTime = false; - TransitionGroup transition = new TransitionGroup(); - transition.addTransitions(new Fade().setTargetIds(R.id.resultsText, R.id.resultsList), - new Move().setTargetIds(R.id.searchContainer)); + TransitionSet transition = new TransitionSet(); + transition.addTransition(new Fade().addTargetId(R.id.resultsText). + addTargetId(R.id.resultsList)). + addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transition); mTransitionManager.setTransition(mResultsScreen, transition); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo2.java b/tests/TransitionTests/src/com/android/transitiontests/Demo2.java index 7e1afab8a36c..334b777851b1 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo2.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo2.java @@ -19,13 +19,12 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Recolor; -import android.view.transition.Scene; -import android.view.transition.TransitionInflater; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.ChangeBounds; +import android.transition.Recolor; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class Demo2 extends Activity { ViewGroup mSceneRoot; @@ -51,18 +50,17 @@ public class Demo2 extends Activity { // mSearchScreen = new Scene(this, mSceneRoot, R.layout.search_screen); // mResultsScreen = new Scene(this, mSceneRoot, R.layout.results_screen); try { - mSearchScreen = TransitionInflater.from(this). - inflateScene(R.scene.search_scene, mSceneRoot); - mResultsScreen = TransitionInflater.from(this). - inflateScene(R.scene.results_scene, mSceneRoot); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); } catch (Exception e) { System.out.println("Problem loading scene resource: " + e); } - TransitionGroup transition = new TransitionGroup(); - transition.addTransitions(new Fade().setTargetIds(R.id.resultsText, R.id.resultsList), - new Move().setTargetIds(R.id.searchContainer), - new Recolor().setTargetIds(R.id.container)); + TransitionSet transition = new TransitionSet(); + transition.addTransition(new Fade().addTargetId(R.id.resultsText). + addTargetId(R.id.resultsList)). + addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)). + addTransition(new Recolor().addTargetId(R.id.container)); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transition); mTransitionManager.setTransition(mResultsScreen, transition); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo3.java b/tests/TransitionTests/src/com/android/transitiontests/Demo3.java index b8daff551bb4..0ffa1f534834 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo3.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo3.java @@ -17,14 +17,14 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Recolor; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Recolor; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class Demo3 extends Activity { @@ -41,11 +41,11 @@ public class Demo3 extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); - TransitionGroup transition = new TransitionGroup(); - transition.addTransitions(new Fade(), new Move(), new Recolor()); + TransitionSet transition = new TransitionSet(); + transition.addTransition(new Fade()).addTransition(new ChangeBounds()).addTransition(new Recolor()); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transition); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo4.java b/tests/TransitionTests/src/com/android/transitiontests/Demo4.java index 8be54f52d9b4..d1c33586fc2e 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo4.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo4.java @@ -17,14 +17,14 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Recolor; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Recolor; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class Demo4 extends Activity { @@ -41,20 +41,22 @@ public class Demo4 extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); - TransitionGroup transitionToResults = new TransitionGroup(); + TransitionSet transitionToResults = new TransitionSet(); Fade fade = new Fade(); - fade.setTargetIds(R.id.resultsText, R.id.resultsList); + fade.addTargetId(R.id.resultsText).addTargetId(R.id.resultsList); fade.setStartDelay(300); fade.setDuration(1000); - transitionToResults.addTransitions(fade, new Move().setTargetIds(R.id.searchContainer), - new Recolor().setTargetIds(R.id.container)); + transitionToResults.addTransition(fade). + addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)). + addTransition(new Recolor().addTargetId(R.id.container)); - TransitionGroup transitionToSearch = new TransitionGroup(); - transitionToSearch.addTransitions(fade, new Move().setTargetIds(R.id.searchContainer), - new Recolor().setTargetIds(R.id.container)); + TransitionSet transitionToSearch = new TransitionSet(); + transitionToSearch.addTransition(fade). + addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)). + addTransition(new Recolor().addTargetId(R.id.container)); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transitionToSearch); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Demo5.java b/tests/TransitionTests/src/com/android/transitiontests/Demo5.java index e64511e85c38..c36abda081b3 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Demo5.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Demo5.java @@ -19,8 +19,8 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionManager; public class Demo5 extends Activity { @@ -36,8 +36,8 @@ public class Demo5 extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java b/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java index e0fe379f1589..d497abe8d3d9 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java +++ b/tests/TransitionTests/src/com/android/transitiontests/FadingHierarchy.java @@ -19,8 +19,7 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.TransitionManager; +import android.transition.TransitionManager; import android.widget.Button; public class FadingHierarchy extends Activity { diff --git a/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java b/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java index 400e99488405..000ea9b10b92 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/FadingTest.java @@ -19,10 +19,10 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; +import android.transition.Scene; import android.widget.Button; -import android.view.transition.Fade; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.TransitionManager; public class FadingTest extends Activity { @@ -31,9 +31,11 @@ public class FadingTest extends Activity { Scene mScene1, mScene2; ViewGroup mSceneRoot; static Fade sFade = new Fade(); + Scene mCurrentScene; static { - sFade.setTargetIds(R.id.removingButton, R.id.invisibleButton, R.id.goneButton); + sFade.addTargetId(R.id.removingButton).addTargetId(R.id.invisibleButton). + addTargetId(R.id.goneButton); } @Override @@ -56,17 +58,19 @@ public class FadingTest extends Activity { } }); - mScene1 = new Scene(mSceneRoot, R.layout.fading_test, this); - mScene2 = new Scene(mSceneRoot, R.layout.fading_test_scene_2, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_scene_2, this); - mSceneRoot.setCurrentScene(mScene1); + mCurrentScene = mScene1; } public void sendMessage(View view) { - if (mSceneRoot.getCurrentScene() == mScene1) { + if (mCurrentScene == mScene1) { TransitionManager.go(mScene2); + mCurrentScene = mScene2; } else { TransitionManager.go(mScene1); + mCurrentScene = mScene1; } } diff --git a/tests/TransitionTests/src/com/android/transitiontests/HierarchicalMove.java b/tests/TransitionTests/src/com/android/transitiontests/HierarchicalMove.java index 093d7c1931a0..1146e20270c4 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/HierarchicalMove.java +++ b/tests/TransitionTests/src/com/android/transitiontests/HierarchicalMove.java @@ -17,12 +17,12 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Move; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import android.widget.Button; import static android.widget.LinearLayout.LayoutParams; @@ -59,33 +59,37 @@ public class HierarchicalMove extends Activity { // group (sequentially) // Move 3 // Move 4/5 - TransitionGroup rootTransition = new TransitionGroup(TransitionGroup.SEQUENTIALLY); + TransitionSet rootTransition = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); // button0 - Transition move0 = new Move(); - move0.setTargets(buttons[0]); + Transition move0 = new ChangeBounds(); + move0.addTarget(buttons[0]); // buttons 1/2/3/4/5 - TransitionGroup group12345 = new TransitionGroup(TransitionGroup.SEQUENTIALLY); + TransitionSet group12345 = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); // buttons 1/2 - TransitionGroup group12 = new TransitionGroup(TransitionGroup.TOGETHER); - Move move1 = new Move(); - move1.setTargets(buttons[1]); - Move move2 = new Move(); - move2.setTargets(buttons[2]); - group12.addTransitions(move1, move2); - - TransitionGroup group345 = new TransitionGroup(TransitionGroup.SEQUENTIALLY); - Move move3 = new Move(); - move3.setTargets(buttons[3]); - Move move45 = new Move(); - move45.setTargets(buttons[4], buttons[5]); - group345.addTransitions(move3, move45); - - group12345.addTransitions(move0, group12, group345); - - rootTransition.addTransitions(group12345); + TransitionSet group12 = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_TOGETHER); + ChangeBounds changeBounds1 = new ChangeBounds(); + changeBounds1.addTarget(buttons[1]); + ChangeBounds changeBounds2 = new ChangeBounds(); + changeBounds2.addTarget(buttons[2]); + group12.addTransition(changeBounds1).addTransition(changeBounds2); + + TransitionSet group345 = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); + ChangeBounds changeBounds3 = new ChangeBounds(); + changeBounds3.addTarget(buttons[3]); + ChangeBounds changeBounds45 = new ChangeBounds(); + changeBounds45.addTarget(buttons[4]).addTarget(buttons[5]); + group345.addTransition(changeBounds3).addTransition(changeBounds45); + + group12345.addTransition(move0).addTransition(group12).addTransition(group345); + + rootTransition.addTransition(group12345); rootTransition.setDuration(1000); mTransition = rootTransition; diff --git a/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java b/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java index cf4ea9ad66a5..a06ba8fb61d1 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java +++ b/tests/TransitionTests/src/com/android/transitiontests/InstanceTargets.java @@ -16,16 +16,12 @@ package com.android.transitiontests; import android.app.Activity; -import android.content.Context; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TransitionManager; +import android.transition.ChangeBounds; +import android.transition.TransitionManager; import android.widget.Button; -import android.widget.RelativeLayout; import static android.widget.RelativeLayout.ALIGN_PARENT_LEFT; import static android.widget.RelativeLayout.ALIGN_PARENT_RIGHT; @@ -46,23 +42,19 @@ public class InstanceTargets extends Activity { } public void sendMessage(final View view) { - TransitionManager.go(mSceneRoot, new Runnable() { - @Override - public void run() { - for (int i = 0; i < mSceneRoot.getChildCount(); ++i) { - Button button = (Button) mSceneRoot.getChildAt(i); - LayoutParams params = (LayoutParams) button.getLayoutParams(); - int rules[] = params.getRules(); - if (rules[ALIGN_PARENT_RIGHT] != 0) { - params.removeRule(ALIGN_PARENT_RIGHT); - params.addRule(ALIGN_PARENT_LEFT); - } else { - params.removeRule(ALIGN_PARENT_LEFT); - params.addRule(ALIGN_PARENT_RIGHT); - } - button.setLayoutParams(params); - } + TransitionManager.beginDelayedTransition(mSceneRoot, new ChangeBounds().addTarget(view)); + for (int i = 0; i < mSceneRoot.getChildCount(); ++i) { + Button button = (Button) mSceneRoot.getChildAt(i); + LayoutParams params = (LayoutParams) button.getLayoutParams(); + int rules[] = params.getRules(); + if (rules[ALIGN_PARENT_RIGHT] != 0) { + params.removeRule(ALIGN_PARENT_RIGHT); + params.addRule(ALIGN_PARENT_LEFT); + } else { + params.removeRule(ALIGN_PARENT_LEFT); + params.addRule(ALIGN_PARENT_RIGHT); } - }, new Move().setTargets(view)); + button.setLayoutParams(params); + } } } diff --git a/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java b/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java index b380225b8839..70257bb28f9d 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/InterruptionTest.java @@ -17,15 +17,12 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.AutoTransition; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TextChange; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import android.widget.RadioButton; public class InterruptionTest extends Activity { @@ -35,7 +32,8 @@ public class InterruptionTest extends Activity { private Scene mScene2; private Scene mScene3; private Scene mScene4; - TransitionGroup mSequencedMove = new TransitionGroup(TransitionGroup.SEQUENTIALLY); + TransitionSet mSequencedMove = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); @Override public void onCreate(Bundle savedInstanceState) { @@ -44,24 +42,22 @@ public class InterruptionTest extends Activity { ViewGroup sceneRoot = (ViewGroup) findViewById(R.id.sceneRoot); - mScene1 = new Scene(sceneRoot, R.layout.interruption_inner_1, this); - mScene2 = new Scene(sceneRoot, R.layout.interruption_inner_2, this); - mScene3 = new Scene(sceneRoot, R.layout.interruption_inner_3, this); - mScene4 = new Scene(sceneRoot, R.layout.interruption_inner_4, this); + mScene1 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_1, this); + mScene2 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_2, this); + mScene3 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_3, this); + mScene4 = Scene.getSceneForLayout(sceneRoot, R.layout.interruption_inner_4, this); mScene1RB = (RadioButton) findViewById(R.id.scene1RB); mScene2RB = (RadioButton) findViewById(R.id.scene2RB); mScene3RB = (RadioButton) findViewById(R.id.scene3RB); mScene4RB = (RadioButton) findViewById(R.id.scene4RB); - sceneRoot.setCurrentScene(mScene1); + ChangeBounds changeBounds1 = new ChangeBounds(); + changeBounds1.addTargetId(R.id.button); + ChangeBounds changeBounds2 = new ChangeBounds(); + changeBounds2.addTargetId(R.id.button1); - Move move1 = new Move(); - move1.setTargetIds(R.id.button); - Move move2 = new Move(); - move2.setTargetIds(R.id.button1); - - mSequencedMove.addTransitions(move1, move2); + mSequencedMove.addTransition(changeBounds1).addTransition(changeBounds2); mSequencedMove.setDuration(1000); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java b/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java index 87ee874a55f8..6629770ec6b4 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ListViewAddRemove.java @@ -20,18 +20,18 @@ import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.ViewTreeObserver; -import android.view.transition.Fade; -import android.view.transition.Scene; +import android.transition.Fade; +import android.transition.Scene; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; -import android.view.transition.AutoTransition; -import android.view.transition.Move; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.AutoTransition; +import android.transition.ChangeBounds; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import java.util.ArrayList; import java.util.HashMap; @@ -78,10 +78,11 @@ public class ListViewAddRemove extends Activity { } }); final Transition myTransition = new AutoTransition(); - final TransitionGroup noFadeIn = new TransitionGroup(TransitionGroup.SEQUENTIALLY); + final TransitionSet noFadeIn = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); Fade fadeIn = new Fade(Fade.IN); fadeIn.setDuration(50); - noFadeIn.addTransitions(new Fade(Fade.OUT), new Move(), fadeIn); + noFadeIn.addTransition(new Fade(Fade.OUT)).addTransition(new ChangeBounds()).addTransition(fadeIn); myTransition.addListener(new Transition.TransitionListenerAdapter() { @Override diff --git a/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java b/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java index 06fa9f4654da..34ec6ccf4ab9 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java +++ b/tests/TransitionTests/src/com/android/transitiontests/LoginActivity.java @@ -19,14 +19,14 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; +import android.transition.Scene; import android.widget.TextView; -import android.view.transition.Fade; -import android.view.transition.Recolor; -import android.view.transition.Slide; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Recolor; +import android.transition.Slide; +import android.transition.Transition; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class LoginActivity extends Activity { @@ -43,32 +43,33 @@ public class LoginActivity extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mLoginScene = new Scene(mSceneRoot, R.layout.activity_login, this); - mPasswordScene = new Scene(mSceneRoot, R.layout.login_password, this); - mIncorrectPasswordScene = new Scene(mSceneRoot, R.layout.incorrect_password, this); - mUsernameTakenScene = new Scene(mSceneRoot, R.layout.username_taken, this); - mSuccessScene = new Scene(mSceneRoot, R.layout.success, this); - mNewUserScene = new Scene(mSceneRoot, R.layout.new_user, this); + mLoginScene = Scene.getSceneForLayout(mSceneRoot, R.layout.activity_login, this); + mPasswordScene = Scene.getSceneForLayout(mSceneRoot, R.layout.login_password, this); + mIncorrectPasswordScene = Scene.getSceneForLayout(mSceneRoot, R.layout.incorrect_password, this); + mUsernameTakenScene = Scene.getSceneForLayout(mSceneRoot, R.layout.username_taken, this); + mSuccessScene = Scene.getSceneForLayout(mSceneRoot, R.layout.success, this); + mNewUserScene = Scene.getSceneForLayout(mSceneRoot, R.layout.new_user, this); mTransitionManager = new TransitionManager(); // Custom transitions in/out of NewUser screen - slide in the 2nd password UI - TransitionGroup slider = new TransitionGroup(); - slider.addTransitions(new Slide().setTargetIds(R.id.retype, R.id.retypeEdit)); - slider.addTransitions(new Recolor().setTargetIds(R.id.password, R.id.passwordEdit)); - slider.addTransitions(new Fade()); + TransitionSet slider = new TransitionSet(); + slider.addTransition(new Slide().addTargetId(R.id.retype).addTargetId(R.id.retypeEdit)); + slider.addTransition(new Recolor().addTargetId(R.id.password). + addTargetId(R.id.passwordEdit)); + slider.addTransition(new Fade()); mTransitionManager.setTransition(mLoginScene, mNewUserScene, slider); mTransitionManager.setTransition(mPasswordScene, mNewUserScene, slider); mTransitionManager.setTransition(mNewUserScene, mLoginScene, slider); mTransitionManager.setTransition(mNewUserScene, mPasswordScene, slider); // Custom transitions with recoloring password field - Transition colorizer = new Recolor().setTargetIds(R.id.password, R.id.passwordEdit); + Transition colorizer = new Recolor().addTargetId(R.id.password). + addTargetId(R.id.passwordEdit); mTransitionManager.setTransition(mLoginScene, mPasswordScene, colorizer); mTransitionManager.setTransition(mPasswordScene, mLoginScene, colorizer); mCurrentScene = mLoginScene; - mSceneRoot.setCurrentScene(mLoginScene); } public void applyScene(Scene scene) { diff --git a/tests/TransitionTests/src/com/android/transitiontests/LoginActivityFromResources.java b/tests/TransitionTests/src/com/android/transitiontests/LoginActivityFromResources.java index ff617aa4f593..600c79153c9b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/LoginActivityFromResources.java +++ b/tests/TransitionTests/src/com/android/transitiontests/LoginActivityFromResources.java @@ -19,10 +19,10 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.TransitionInflater; +import android.transition.Scene; +import android.transition.TransitionInflater; import android.widget.TextView; -import android.view.transition.TransitionManager; +import android.transition.TransitionManager; public class LoginActivityFromResources extends Activity { @@ -36,7 +36,7 @@ public class LoginActivityFromResources extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); - View container = (View) findViewById(R.id.container); + View container = findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); } @@ -50,21 +50,19 @@ public class LoginActivityFromResources extends Activity { if (mTransitionManager == null) { TransitionInflater inflater = TransitionInflater.from(this); - mLoginScene = inflater.inflateScene(R.scene.login_scene, mSceneRoot); - mPasswordScene = inflater.inflateScene(R.scene.password_scene, mSceneRoot); - mIncorrectPasswordScene = - inflater.inflateScene(R.scene.incorrect_password_scene,mSceneRoot); - mUsernameTakenScene = - inflater.inflateScene(R.scene.username_taken_scene, mSceneRoot); - mSuccessScene = inflater.inflateScene(R.scene.success_scene, mSceneRoot); - mNewUserScene = inflater.inflateScene(R.scene.new_user_scene, mSceneRoot); + mLoginScene = Scene.getSceneForLayout(mSceneRoot, R.layout.activity_login, this); + mPasswordScene = Scene.getSceneForLayout(mSceneRoot, R.layout.login_password, this); + mIncorrectPasswordScene = Scene.getSceneForLayout(mSceneRoot, R.layout + .incorrect_password, this); + mUsernameTakenScene = Scene.getSceneForLayout(mSceneRoot, R.layout.username_taken, this); + mSuccessScene = Scene.getSceneForLayout(mSceneRoot, R.layout.success, this); + mNewUserScene = Scene.getSceneForLayout(mSceneRoot, R.layout.new_user, this); mTransitionManager = inflater.inflateTransitionManager(R.transition.login_transition_mgr, mSceneRoot); mCurrentScene = mLoginScene; - mSceneRoot.setCurrentScene(mLoginScene); } TextView textView = (TextView) view; CharSequence text = textView.getText(); diff --git a/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java b/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java index e559c7209fc1..1ee862177e23 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java +++ b/tests/TransitionTests/src/com/android/transitiontests/Reparenting.java @@ -17,11 +17,11 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionManager; import android.widget.Button; public class Reparenting extends Activity { @@ -67,7 +67,7 @@ public class Reparenting extends Activity { newParent.addView(v); } }); - Move reparent = new Move(); + ChangeBounds reparent = new ChangeBounds(); reparent.setReparent(true); TransitionManager.go(newScene, reparent); } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java b/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java index 3d7bd9b44e87..1aee258343c4 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ResourceLoadingTest.java @@ -19,10 +19,10 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.TransitionInflater; -import android.view.transition.Transition; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionInflater; +import android.transition.Transition; +import android.transition.TransitionManager; public class ResourceLoadingTest extends Activity { @@ -54,7 +54,7 @@ public class ResourceLoadingTest extends Activity { mTransitionManager = inflater.inflateTransitionManager(R.transition.my_transition_mgr, mSceneRoot); - Scene loadedScene = inflater.inflateScene(R.scene.my_scene, mSceneRoot); + Scene loadedScene = new Scene(mSceneRoot); System.out.println("loadedScene = " + loadedScene); Transition loadedTransition = inflater.inflateTransition(R.transition.my_transition); System.out.println("loadedTransition = " + loadedTransition); @@ -63,11 +63,11 @@ public class ResourceLoadingTest extends Activity { } } if (mCurrentScene == RESULTS_SCREEN) { - Scene scene = mInflater.inflateScene(R.scene.search_scene, mSceneRoot); + Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); mTransitionManager.transitionTo(scene); mCurrentScene = SEARCH_SCREEN; } else { - Scene scene = mInflater.inflateScene(R.scene.results_scene, mSceneRoot); + Scene scene = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); mTransitionManager.transitionTo(scene); mCurrentScene = RESULTS_SCREEN; } diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java index 374a9abb3003..7504058d315b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTargets.java @@ -18,14 +18,14 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Recolor; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Recolor; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class ScenesTestAutoTargets extends Activity { @@ -42,11 +42,11 @@ public class ScenesTestAutoTargets extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); - TransitionGroup transition = new TransitionGroup(); - transition.addTransitions(new Fade(), new Move(), new Recolor()); + TransitionSet transition = new TransitionSet(); + transition.addTransition(new Fade()).addTransition(new ChangeBounds()).addTransition(new Recolor()); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transition); diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java index fb1ba07b498c..23b28ec0fb2b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition.java @@ -20,10 +20,10 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.AutoTransition; -import android.view.transition.Scene; -import android.view.transition.Transition; -import android.view.transition.TransitionManager; +import android.transition.AutoTransition; +import android.transition.Scene; +import android.transition.Transition; +import android.transition.TransitionManager; public class ScenesTestAutoTransition extends Activity { @@ -40,8 +40,8 @@ public class ScenesTestAutoTransition extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); } public void sendMessage(View view) { diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition2.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition2.java index c75d41947221..5a9fa9d25201 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition2.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestAutoTransition2.java @@ -20,8 +20,8 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.TransitionManager; +import android.transition.Scene; +import android.transition.TransitionManager; public class ScenesTestAutoTransition2 extends Activity { @@ -38,8 +38,8 @@ public class ScenesTestAutoTransition2 extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); } public void sendMessage(View view) { diff --git a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java index 399c2beeb44a..c6011f25ecb9 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java +++ b/tests/TransitionTests/src/com/android/transitiontests/ScenesTestv21.java @@ -18,14 +18,14 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Recolor; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Recolor; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; public class ScenesTestv21 extends Activity { @@ -42,21 +42,22 @@ public class ScenesTestv21 extends Activity { View container = (View) findViewById(R.id.container); mSceneRoot = (ViewGroup) container.getParent(); - mSearchScreen = new Scene(mSceneRoot, R.layout.search_screen, this); - mResultsScreen = new Scene(mSceneRoot, R.layout.results_screen, this); + mSearchScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.search_screen, this); + mResultsScreen = Scene.getSceneForLayout(mSceneRoot, R.layout.results_screen, this); - TransitionGroup transitionToResults = new TransitionGroup(); + TransitionSet transitionToResults = new TransitionSet(); Fade fade = new Fade(); - fade.setTargetIds(R.id.resultsText, R.id.resultsList); + fade.addTargetId(R.id.resultsText).addTargetId(R.id.resultsList); fade.setStartDelay(300); - transitionToResults.addTransitions(fade); - transitionToResults.addTransitions(new Move().setTargetIds(R.id.searchContainer)); - transitionToResults.addTransitions(new Recolor().setTargetIds(R.id.container)); + transitionToResults.addTransition(fade); + transitionToResults.addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)); + transitionToResults.addTransition(new Recolor().addTargetId(R.id.container)); - TransitionGroup transitionToSearch = new TransitionGroup(); - transitionToSearch.addTransitions(new Fade().setTargetIds(R.id.resultsText, R.id.resultsList)); - transitionToSearch.addTransitions(new Move().setTargetIds(R.id.searchContainer)); - transitionToSearch.addTransitions(new Recolor().setTargetIds(R.id.container)); + TransitionSet transitionToSearch = new TransitionSet(); + transitionToSearch.addTransition(new Fade().addTargetId(R.id.resultsText). + addTargetId(R.id.resultsList)); + transitionToSearch.addTransition(new ChangeBounds().addTargetId(R.id.searchContainer)); + transitionToSearch.addTransition(new Recolor().addTargetId(R.id.container)); mTransitionManager = new TransitionManager(); mTransitionManager.setTransition(mSearchScreen, transitionToSearch); mTransitionManager.setTransition(mResultsScreen, transitionToResults); diff --git a/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java b/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java index 6b3442032fe2..ab1dc263831d 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SequenceTest.java @@ -19,13 +19,13 @@ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.Transition; +import android.transition.Scene; +import android.transition.Transition; +import android.transition.TransitionSet; import android.widget.Button; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.ChangeBounds; +import android.transition.TransitionManager; public class SequenceTest extends Activity { @@ -33,7 +33,8 @@ public class SequenceTest extends Activity { Button mRemovingButton, mInvisibleButton, mGoneButton; Scene mScene1, mScene2; ViewGroup mSceneRoot; - TransitionGroup sequencedFade, reverseSequencedFade; + TransitionSet sequencedFade, reverseSequencedFade; + Scene mCurrentScene; @Override public void onCreate(Bundle savedInstanceState) { @@ -47,27 +48,33 @@ public class SequenceTest extends Activity { mInvisibleButton = (Button) findViewById(R.id.invisibleButton); mGoneButton = (Button) findViewById(R.id.goneButton); - mScene1 = new Scene(mSceneRoot, R.layout.fading_test, this); - mScene2 = new Scene(mSceneRoot, R.layout.fading_test_scene_2, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_scene_2, this); - Transition fade1 = new Fade().setTargetIds(R.id.removingButton); - Transition fade2 = new Fade().setTargetIds(R.id.invisibleButton); - Transition fade3 = new Fade().setTargetIds(R.id.goneButton); - TransitionGroup fader = new TransitionGroup(TransitionGroup.SEQUENTIALLY); - fader.addTransitions(fade1, fade2, fade3, new Move()); + Transition fade1 = new Fade().addTargetId(R.id.removingButton); + Transition fade2 = new Fade().addTargetId(R.id.invisibleButton); + Transition fade3 = new Fade().addTargetId(R.id.goneButton); + TransitionSet fader = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); + fader.addTransition(fade1).addTransition(fade2).addTransition(fade3). + addTransition(new ChangeBounds()); sequencedFade = fader; - reverseSequencedFade = new TransitionGroup(TransitionGroup.SEQUENTIALLY); - reverseSequencedFade.addTransitions(new Move(), fade3, fade2, fade1); + reverseSequencedFade = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); + reverseSequencedFade.addTransition(new ChangeBounds()).addTransition(fade3).addTransition(fade2). + addTransition(fade1); - mSceneRoot.setCurrentScene(mScene1); + mCurrentScene = mScene1; } public void sendMessage(View view) { - if (mSceneRoot.getCurrentScene() == mScene1) { + if (mCurrentScene == mScene1) { TransitionManager.go(mScene2, sequencedFade); + mCurrentScene = mScene2; } else { TransitionManager.go(mScene1, reverseSequencedFade); + mCurrentScene = mScene1; } } } diff --git a/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java b/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java index 972d30e8bea0..52c21c99e515 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SequenceTestSimple.java @@ -17,15 +17,15 @@ package com.android.transitiontests; import android.app.Activity; import android.os.Bundle; +import android.transition.ChangeBounds; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; +import android.transition.Scene; +import android.transition.TransitionSet; import android.widget.Button; -import android.view.transition.Fade; -import android.view.transition.Move; -import android.view.transition.Transition; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Fade; +import android.transition.Transition; +import android.transition.TransitionManager; public class SequenceTestSimple extends Activity { @@ -34,7 +34,8 @@ public class SequenceTestSimple extends Activity { Scene mScene1, mScene2; ViewGroup mSceneRoot; Transition sequencedFade; - TransitionGroup sequencedFadeReverse; + TransitionSet sequencedFadeReverse; + Scene mCurrentScene; @Override public void onCreate(Bundle savedInstanceState) { @@ -46,25 +47,29 @@ public class SequenceTestSimple extends Activity { mRemovingButton = (Button) findViewById(R.id.removingButton); - mScene1 = new Scene(mSceneRoot, R.layout.fading_test_simple, this); - mScene2 = new Scene(mSceneRoot, R.layout.fading_test_simple2, this); + mScene1 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_simple, this); + mScene2 = Scene.getSceneForLayout(mSceneRoot, R.layout.fading_test_simple2, this); - TransitionGroup fader = new TransitionGroup(TransitionGroup.SEQUENTIALLY); - fader.addTransitions(new Fade().setTargetIds(R.id.removingButton)); - fader.addTransitions(new Move().setTargetIds(R.id.sceneSwitchButton)); + TransitionSet fader = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); + fader.addTransition(new Fade().addTargetId(R.id.removingButton)); + fader.addTransition(new ChangeBounds().addTargetId(R.id.sceneSwitchButton)); sequencedFade = fader; - sequencedFadeReverse = new TransitionGroup(TransitionGroup.SEQUENTIALLY); - sequencedFadeReverse.addTransitions(new Move().setTargetIds(R.id.sceneSwitchButton)); - sequencedFadeReverse.addTransitions(new Fade().setTargetIds(R.id.removingButton)); + sequencedFadeReverse = new TransitionSet(). + setOrdering(TransitionSet.ORDERING_SEQUENTIAL); + sequencedFadeReverse.addTransition(new ChangeBounds().addTargetId(R.id.sceneSwitchButton)); + sequencedFadeReverse.addTransition(new Fade().addTargetId(R.id.removingButton)); - mSceneRoot.setCurrentScene(mScene1); + mCurrentScene = mScene1; } public void sendMessage(View view) { - if (mSceneRoot.getCurrentScene() == mScene1) { + if (mCurrentScene == mScene1) { TransitionManager.go(mScene2, sequencedFade); + mCurrentScene = mScene2; } else { TransitionManager.go(mScene1, sequencedFadeReverse); + mCurrentScene = mScene1; } }} diff --git a/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java b/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java index aa76923f8203..05af0440149c 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java +++ b/tests/TransitionTests/src/com/android/transitiontests/SurfaceAndTextureViews.java @@ -27,11 +27,11 @@ import android.view.SurfaceView; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Crossfade; -import android.view.transition.Move; -import android.view.transition.Scene; -import android.view.transition.TransitionGroup; -import android.view.transition.TransitionManager; +import android.transition.Crossfade; +import android.transition.ChangeBounds; +import android.transition.Scene; +import android.transition.TransitionSet; +import android.transition.TransitionManager; import android.widget.Button; import static android.widget.LinearLayout.LayoutParams; @@ -66,8 +66,9 @@ public class SurfaceAndTextureViews extends Activity { mTextureView.setLayoutParams(new LayoutParams(SMALL_SIZE, SMALL_SIZE)); container.addView(mTextureView); - final TransitionGroup transition = new TransitionGroup(); - transition.addTransitions(new Move(), new Crossfade().setTargetIds(0, 1, 2)); + final TransitionSet transition = new TransitionSet(); + transition.addTransition(new ChangeBounds()).addTransition(new Crossfade().addTargetId(0). + addTargetId(1).addTargetId(2)); toggleButton.setOnClickListener(new View.OnClickListener() { @Override diff --git a/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java b/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java index 433a91c4e55f..c8249561ef2b 100644 --- a/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java +++ b/tests/TransitionTests/src/com/android/transitiontests/UniqueIds.java @@ -20,11 +20,11 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.transition.Scene; -import android.view.transition.Transition; +import android.transition.Scene; +import android.transition.Transition; import android.widget.Button; import android.widget.LinearLayout; -import android.view.transition.TransitionManager; +import android.transition.TransitionManager; import java.util.HashMap; diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp index cadac02f1e04..1e3b05899d08 100644 --- a/tools/aapt/Command.cpp +++ b/tools/aapt/Command.cpp @@ -621,6 +621,7 @@ int doDump(Bundle* bundle) bool isLauncherActivity = false; bool isSearchable = false; bool withinApplication = false; + bool withinSupportsInput = false; bool withinReceiver = false; bool withinService = false; bool withinIntentFilter = false; @@ -711,11 +712,26 @@ int doDump(Bundle* bundle) String8 activityIcon; String8 receiverName; String8 serviceName; + Vector<String8> supportedInput; while ((code=tree.next()) != ResXMLTree::END_DOCUMENT && code != ResXMLTree::BAD_DOCUMENT) { if (code == ResXMLTree::END_TAG) { depth--; if (depth < 2) { + if (withinSupportsInput && !supportedInput.isEmpty()) { + printf("supports-input: '"); + const size_t N = supportedInput.size(); + for (size_t i=0; i<N; i++) { + printf("%s", supportedInput[i].string()); + if (i != N - 1) { + printf("' '"); + } else { + printf("'\n"); + } + } + supportedInput.clear(); + } withinApplication = false; + withinSupportsInput = false; } else if (depth < 3) { if (withinActivity && isMainActivity && isLauncherActivity) { const char *aName = getComponentName(pkg, activityName); @@ -910,6 +926,8 @@ int doDump(Bundle* bundle) printf(" reqFiveWayNav='%d'", reqFiveWayNav); } printf("\n"); + } else if (tag == "supports-input") { + withinSupportsInput = true; } else if (tag == "supports-screens") { smallScreen = getIntegerAttribute(tree, SMALL_SCREEN_ATTR, NULL, 1); @@ -1086,66 +1104,85 @@ int doDump(Bundle* bundle) } } } - } else if (depth == 3 && withinApplication) { + } else if (depth == 3) { withinActivity = false; withinReceiver = false; withinService = false; hasIntentFilter = false; - if(tag == "activity") { - withinActivity = true; - activityName = getAttribute(tree, NAME_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", error.string()); - goto bail; - } + if (withinApplication) { + if(tag == "activity") { + withinActivity = true; + activityName = getAttribute(tree, NAME_ATTR, &error); + if (error != "") { + fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", + error.string()); + goto bail; + } - activityLabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n", error.string()); - goto bail; - } + activityLabel = getResolvedAttribute(&res, tree, LABEL_ATTR, &error); + if (error != "") { + fprintf(stderr, "ERROR getting 'android:label' attribute: %s\n", + error.string()); + goto bail; + } - activityIcon = getResolvedAttribute(&res, tree, ICON_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n", error.string()); - goto bail; - } + activityIcon = getResolvedAttribute(&res, tree, ICON_ATTR, &error); + if (error != "") { + fprintf(stderr, "ERROR getting 'android:icon' attribute: %s\n", + error.string()); + goto bail; + } - int32_t orien = getResolvedIntegerAttribute(&res, tree, - SCREEN_ORIENTATION_ATTR, &error); - if (error == "") { - if (orien == 0 || orien == 6 || orien == 8) { - // Requests landscape, sensorLandscape, or reverseLandscape. - reqScreenLandscapeFeature = true; - } else if (orien == 1 || orien == 7 || orien == 9) { - // Requests portrait, sensorPortrait, or reversePortrait. - reqScreenPortraitFeature = true; + int32_t orien = getResolvedIntegerAttribute(&res, tree, + SCREEN_ORIENTATION_ATTR, &error); + if (error == "") { + if (orien == 0 || orien == 6 || orien == 8) { + // Requests landscape, sensorLandscape, or reverseLandscape. + reqScreenLandscapeFeature = true; + } else if (orien == 1 || orien == 7 || orien == 9) { + // Requests portrait, sensorPortrait, or reversePortrait. + reqScreenPortraitFeature = true; + } } - } - } else if (tag == "uses-library") { - String8 libraryName = getAttribute(tree, NAME_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:name' attribute for uses-library: %s\n", error.string()); - goto bail; - } - int req = getIntegerAttribute(tree, - REQUIRED_ATTR, NULL, 1); - printf("uses-library%s:'%s'\n", - req ? "" : "-not-required", libraryName.string()); - } else if (tag == "receiver") { - withinReceiver = true; - receiverName = getAttribute(tree, NAME_ATTR, &error); + } else if (tag == "uses-library") { + String8 libraryName = getAttribute(tree, NAME_ATTR, &error); + if (error != "") { + fprintf(stderr, + "ERROR getting 'android:name' attribute for uses-library" + " %s\n", error.string()); + goto bail; + } + int req = getIntegerAttribute(tree, + REQUIRED_ATTR, NULL, 1); + printf("uses-library%s:'%s'\n", + req ? "" : "-not-required", libraryName.string()); + } else if (tag == "receiver") { + withinReceiver = true; + receiverName = getAttribute(tree, NAME_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:name' attribute for receiver: %s\n", error.string()); - goto bail; - } - } else if (tag == "service") { - withinService = true; - serviceName = getAttribute(tree, NAME_ATTR, &error); + if (error != "") { + fprintf(stderr, + "ERROR getting 'android:name' attribute for receiver:" + " %s\n", error.string()); + goto bail; + } + } else if (tag == "service") { + withinService = true; + serviceName = getAttribute(tree, NAME_ATTR, &error); - if (error != "") { - fprintf(stderr, "ERROR getting 'android:name' attribute for service: %s\n", error.string()); + if (error != "") { + fprintf(stderr, "ERROR getting 'android:name' attribute for" + " service: %s\n", error.string()); + goto bail; + } + } + } else if (withinSupportsInput && tag == "input-type") { + String8 name = getAttribute(tree, NAME_ATTR, &error); + if (name != "" && error == "") { + supportedInput.add(name); + } else { + fprintf(stderr, "ERROR getting 'android:name' attribute: %s\n", + error.string()); goto bail; } } diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index d61792828d7c..08ad7a0335f0 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -172,7 +172,7 @@ private: bool isValidResourceType(const String8& type) { return type == "anim" || type == "animator" || type == "interpolator" - || type == "transition" || type == "scene" + || type == "transition" || type == "drawable" || type == "layout" || type == "values" || type == "xml" || type == "raw" || type == "color" || type == "menu" || type == "mipmap"; @@ -934,7 +934,6 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) sp<ResourceTypeSet> animators; sp<ResourceTypeSet> interpolators; sp<ResourceTypeSet> transitions; - sp<ResourceTypeSet> scenes; sp<ResourceTypeSet> xmls; sp<ResourceTypeSet> raws; sp<ResourceTypeSet> colors; @@ -947,7 +946,6 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) ASSIGN_IT(animator); ASSIGN_IT(interpolator); ASSIGN_IT(transition); - ASSIGN_IT(scene); ASSIGN_IT(xml); ASSIGN_IT(raw); ASSIGN_IT(color); @@ -971,7 +969,6 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) !applyFileOverlay(bundle, assets, &animators, "animator") || !applyFileOverlay(bundle, assets, &interpolators, "interpolator") || !applyFileOverlay(bundle, assets, &transitions, "transition") || - !applyFileOverlay(bundle, assets, &scenes, "scene") || !applyFileOverlay(bundle, assets, &xmls, "xml") || !applyFileOverlay(bundle, assets, &raws, "raw") || !applyFileOverlay(bundle, assets, &colors, "color") || @@ -1038,13 +1035,6 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) } } - if (scenes != NULL) { - err = makeFileResources(bundle, assets, &table, scenes, "scene"); - if (err != NO_ERROR) { - hasErrors = true; - } - } - if (interpolators != NULL) { err = makeFileResources(bundle, assets, &table, interpolators, "interpolator"); if (err != NO_ERROR) { @@ -1204,21 +1194,6 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) err = NO_ERROR; } - if (scenes != NULL) { - ResourceDirIterator it(scenes, String8("scene")); - while ((err=it.next()) == NO_ERROR) { - err = compileXmlFile(assets, it.getFile(), &table, xmlFlags); - if (err != NO_ERROR) { - hasErrors = true; - } - } - - if (err < NO_ERROR) { - hasErrors = true; - } - err = NO_ERROR; - } - if (xmls != NULL) { ResourceDirIterator it(xmls, String8("xml")); while ((err=it.next()) == NO_ERROR) { diff --git a/tools/layoutlib/bridge/.classpath b/tools/layoutlib/bridge/.classpath index 3c124d90aaae..2e4274da5afd 100644 --- a/tools/layoutlib/bridge/.classpath +++ b/tools/layoutlib/bridge/.classpath @@ -7,5 +7,6 @@ <classpathentry kind="var" path="ANDROID_PLAT_SRC/out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar" sourcepath="/ANDROID_PLAT_SRC/frameworks/base"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/ninepatch/ninepatch-prebuilt.jar"/> <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/tools-common/tools-common-prebuilt.jar"/> + <classpathentry kind="var" path="ANDROID_PLAT_SRC/prebuilts/misc/common/icu4j/icu4j.jar"/> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/tools/layoutlib/bridge/Android.mk b/tools/layoutlib/bridge/Android.mk index 687a91feeb6f..e3d48fca5eb2 100644 --- a/tools/layoutlib/bridge/Android.mk +++ b/tools/layoutlib/bridge/Android.mk @@ -22,6 +22,7 @@ LOCAL_JAVA_RESOURCE_DIRS := resources LOCAL_JAVA_LIBRARIES := \ kxml2-2.3.0 \ + icu4j \ layoutlib_api-prebuilt \ tools-common-prebuilt diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png Binary files differnew file mode 100644 index 000000000000..782ebfe3f2ba --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_back.png diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png Binary files differnew file mode 100644 index 000000000000..677b47137a3f --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-hdpi/ic_sysbar_recent.png diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png Binary files differnew file mode 100644 index 000000000000..a1b806266959 --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_back.png diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png Binary files differnew file mode 100644 index 000000000000..fcdbefe9f506 --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-mdpi/ic_sysbar_recent.png diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png Binary files differnew file mode 100644 index 000000000000..633d86482938 --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_back.png diff --git a/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png Binary files differnew file mode 100644 index 000000000000..4665e2a6fef9 --- /dev/null +++ b/tools/layoutlib/bridge/resources/bars/ldrtl-xhdpi/ic_sysbar_recent.png diff --git a/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java b/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java new file mode 100644 index 000000000000..62d0a0d6ae9d --- /dev/null +++ b/tools/layoutlib/bridge/src/android/graphics/BidiRenderer.java @@ -0,0 +1,215 @@ +/* + * 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 java.awt.Font; +import java.awt.Graphics2D; +import java.awt.font.FontRenderContext; +import java.awt.font.GlyphVector; +import java.util.LinkedList; +import java.util.List; + +import com.ibm.icu.lang.UScript; +import com.ibm.icu.lang.UScriptRun; + +import android.graphics.Paint_Delegate.FontInfo; + +/** + * Render the text by breaking it into various scripts and using the right font for each script. + * Can be used to measure the text without actually drawing it. + */ +@SuppressWarnings("deprecation") +public class BidiRenderer { + + /* package */ static class ScriptRun { + int start; + int limit; + boolean isRtl; + int scriptCode; + FontInfo font; + + public ScriptRun(int start, int limit, boolean isRtl) { + this.start = start; + this.limit = limit; + this.isRtl = isRtl; + this.scriptCode = UScript.INVALID_CODE; + } + } + + /* package */ Graphics2D graphics; + /* package */ Paint_Delegate paint; + /* package */ char[] text; + + /** + * @param graphics May be null. + * @param paint The Paint to use to get the fonts. Should not be null. + * @param text Unidirectional text. Should not be null. + */ + /* package */ BidiRenderer(Graphics2D graphics, Paint_Delegate paint, char[] text) { + assert (paint != null); + this.graphics = graphics; + this.paint = paint; + this.text = text; + } + + /** + * Render unidirectional text. + * + * This method can also be used to measure the width of the text without actually drawing it. + * + * @param start index of the first character + * @param limit index of the first character that should not be rendered. + * @param isRtl is the text right-to-left + * @param advances If not null, then advances for each character to be rendered are returned + * here. + * @param advancesIndex index into advances from where the advances need to be filled. + * @param draw If true and {@link graphics} is not null, draw the rendered text on the graphics + * at the given co-ordinates + * @param x The x-coordinate of the left edge of where the text should be drawn on the given + * graphics. + * @param y The y-coordinate at which to draw the text on the given graphics. + * @return The x-coordinate of the right edge of the drawn text. In other words, + * x + the width of the text. + */ + /* package */ float renderText(int start, int limit, boolean isRtl, float advances[], + int advancesIndex, boolean draw, float x, float y) { + // We break the text into scripts and then select font based on it and then render each of + // the script runs. + for (ScriptRun run : getScriptRuns(text, start, limit, isRtl, paint.getFonts())) { + int flag = Font.LAYOUT_NO_LIMIT_CONTEXT | Font.LAYOUT_NO_START_CONTEXT; + flag |= isRtl ? Font.LAYOUT_RIGHT_TO_LEFT : Font.LAYOUT_LEFT_TO_RIGHT; + x = renderScript(run.start, run.limit, run.font, flag, advances, advancesIndex, draw, + x, y); + advancesIndex += run.limit - run.start; + } + return x; + } + + /** + * Render a script run. Use the preferred font to render as much as possible. This also + * implements a fallback mechanism to render characters that cannot be drawn using the + * preferred font. + * + * @return x + width of the text drawn. + */ + private float renderScript(int start, int limit, FontInfo preferredFont, int flag, + float advances[], int advancesIndex, boolean draw, float x, float y) { + List<FontInfo> fonts = paint.getFonts(); + if (fonts == null || preferredFont == null) { + return x; + } + + while (start < limit) { + boolean foundFont = false; + int canDisplayUpTo = preferredFont.mFont.canDisplayUpTo(text, start, limit); + if (canDisplayUpTo == -1) { + return render(start, limit, preferredFont, flag, advances, advancesIndex, draw, + x, y); + } else if (canDisplayUpTo > start) { // can draw something + x = render(start, canDisplayUpTo, preferredFont, flag, advances, advancesIndex, + draw, x, y); + advancesIndex += canDisplayUpTo - start; + start = canDisplayUpTo; + } + + int charCount = Character.isHighSurrogate(text[start]) ? 2 : 1; + for (FontInfo font : fonts) { + canDisplayUpTo = font.mFont.canDisplayUpTo(text, start, start + charCount); + if (canDisplayUpTo == -1) { + x = render(start, start+charCount, font, flag, advances, advancesIndex, draw, + x, y); + start += charCount; + advancesIndex += charCount; + foundFont = true; + break; + } + } + if (!foundFont) { + // No font can display this char. Use the preferred font. The char will most + // probably appear as a box or a blank space. We could, probably, use some + // heuristics and break the character into the base character and diacritics and + // then draw it, but it's probably not worth the effort. + x = render(start, start + charCount, preferredFont, flag, advances, advancesIndex, + draw, x, y); + start += charCount; + advancesIndex += charCount; + } + } + return x; + } + + /** + * Render the text with the given font. + */ + private float render(int start, int limit, FontInfo font, int flag, float advances[], + int advancesIndex, boolean draw, float x, float y) { + + float totalAdvance = 0; + // Since the metrics don't have anti-aliasing set, we create a new FontRenderContext with + // the anti-aliasing set. + FontRenderContext f = font.mMetrics.getFontRenderContext(); + FontRenderContext frc = new FontRenderContext(f.getTransform(), paint.isAntiAliased(), + f.usesFractionalMetrics()); + GlyphVector gv = font.mFont.layoutGlyphVector(frc, text, start, limit, flag); + int ng = gv.getNumGlyphs(); + int[] ci = gv.getGlyphCharIndices(0, ng, null); + for (int i = 0; i < ng; i++) { + float adv = gv.getGlyphMetrics(i).getAdvanceX(); + if (advances != null) { + int adv_idx = advancesIndex + ci[i]; + advances[adv_idx] += adv; + } + totalAdvance += adv; + } + if (draw && graphics != null) { + graphics.drawGlyphVector(gv, x, y); + } + return x + totalAdvance; + } + + // --- Static helper methods --- + + /* package */ static List<ScriptRun> getScriptRuns(char[] text, int start, int limit, + boolean isRtl, List<FontInfo> fonts) { + LinkedList<ScriptRun> scriptRuns = new LinkedList<ScriptRun>(); + + int count = limit - start; + UScriptRun uScriptRun = new UScriptRun(text, start, count); + while (uScriptRun.next()) { + int scriptStart = uScriptRun.getScriptStart(); + int scriptLimit = uScriptRun.getScriptLimit(); + ScriptRun run = new ScriptRun(scriptStart, scriptLimit, isRtl); + run.scriptCode = uScriptRun.getScriptCode(); + setScriptFont(text, run, fonts); + scriptRuns.add(run); + } + + return scriptRuns; + } + + // TODO: Replace this method with one which returns the font based on the scriptCode. + private static void setScriptFont(char[] text, ScriptRun run, + List<FontInfo> fonts) { + for (FontInfo fontInfo : fonts) { + if (fontInfo.mFont.canDisplayUpTo(text, run.start, run.limit) == -1) { + run.font = fontInfo; + return; + } + } + run.font = fonts.get(0); + } +} diff --git a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java index 361f5d7a8bef..62b47bd6a0f2 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Canvas_Delegate.java @@ -23,7 +23,6 @@ import com.android.layoutlib.bridge.impl.GcSnapshot; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.graphics.Bitmap.Config; -import android.graphics.Paint_Delegate.FontInfo; import android.text.TextUtils; import java.awt.Color; @@ -35,7 +34,6 @@ import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.image.BufferedImage; -import java.util.List; /** @@ -978,7 +976,8 @@ public final class Canvas_Delegate { @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, final char[] text, final int index, final int count, - final float startX, final float startY, int flags, int paint) { + final float startX, final float startY, final int flags, int paint) { + draw(nativeCanvas, paint, false /*compositeOnly*/, false /*forceSrcMode*/, new GcSnapshot.Drawable() { @Override @@ -988,10 +987,10 @@ public final class Canvas_Delegate { // Paint.TextAlign indicates how the text is positioned relative to X. // LEFT is the default and there's nothing to do. float x = startX; - float y = startY; + int limit = index + count; + boolean isRtl = flags == Canvas.DIRECTION_RTL; if (paintDelegate.getTextAlign() != Paint.Align.LEFT.nativeInt) { - // TODO: check the value of bidiFlags. - float m = paintDelegate.measureText(text, index, count, 0); + float m = paintDelegate.measureText(text, index, count, isRtl); if (paintDelegate.getTextAlign() == Paint.Align.CENTER.nativeInt) { x -= m / 2; } else if (paintDelegate.getTextAlign() == Paint.Align.RIGHT.nativeInt) { @@ -999,87 +998,15 @@ public final class Canvas_Delegate { } } - List<FontInfo> fonts = paintDelegate.getFonts(); - - if (fonts.size() > 0) { - FontInfo mainFont = fonts.get(0); - int i = index; - int lastIndex = index + count; - while (i < lastIndex) { - // always start with the main font. - int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex); - if (upTo == -1) { - // draw all the rest and exit. - graphics.setFont(mainFont.mFont); - graphics.drawChars(text, i, lastIndex - i, (int)x, (int)y); - return; - } else if (upTo > 0) { - // draw what's possible - graphics.setFont(mainFont.mFont); - graphics.drawChars(text, i, upTo - i, (int)x, (int)y); - - // compute the width that was drawn to increase x - x += mainFont.mMetrics.charsWidth(text, i, upTo - i); - - // move index to the first non displayed char. - i = upTo; - - // don't call continue at this point. Since it is certain the main font - // cannot display the font a index upTo (now ==i), we move on to the - // fallback fonts directly. - } - - // no char supported, attempt to read the next char(s) with the - // fallback font. In this case we only test the first character - // and then go back to test with the main font. - // Special test for 2-char characters. - boolean foundFont = false; - for (int f = 1 ; f < fonts.size() ; f++) { - FontInfo fontInfo = fonts.get(f); - - // need to check that the font can display the character. We test - // differently if the char is a high surrogate. - int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1; - upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount); - if (upTo == -1) { - // draw that char - graphics.setFont(fontInfo.mFont); - graphics.drawChars(text, i, charCount, (int)x, (int)y); - - // update x - x += fontInfo.mMetrics.charsWidth(text, i, charCount); - - // update the index in the text, and move on - i += charCount; - foundFont = true; - break; - - } - } - - // in case no font can display the char, display it with the main font. - // (it'll put a square probably) - if (foundFont == false) { - int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1; - - graphics.setFont(mainFont.mFont); - graphics.drawChars(text, i, charCount, (int)x, (int)y); - - // measure it to advance x - x += mainFont.mMetrics.charsWidth(text, i, charCount); - - // and move to the next chars. - i += charCount; - } - } - } + new BidiRenderer(graphics, paintDelegate, text).renderText( + index, limit, isRtl, null, 0, true, x, startY); } }); } @LayoutlibDelegate /*package*/ static void native_drawText(int nativeCanvas, String text, - int start, int end, float x, float y, int flags, int paint) { + int start, int end, float x, float y, final int flags, int paint) { int count = end - start; char[] buffer = TemporaryBuffer.obtain(count); TextUtils.getChars(text, start, end, buffer, 0); diff --git a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java index c9c98007556f..41953ed28011 100644 --- a/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java +++ b/tools/layoutlib/bridge/src/android/graphics/Paint_Delegate.java @@ -32,7 +32,6 @@ import java.awt.Stroke; import java.awt.Toolkit; import java.awt.font.FontRenderContext; import java.awt.geom.AffineTransform; -import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -576,7 +575,7 @@ public class Paint_Delegate { return 0; } - return delegate.measureText(text, index, count, bidiFlags); + return delegate.measureText(text, index, count, isRtl(bidiFlags)); } @LayoutlibDelegate @@ -615,7 +614,7 @@ public class Paint_Delegate { } // measure from start to end - float res = delegate.measureText(text, start, end - start + 1, bidiFlags); + float res = delegate.measureText(text, start, end - start + 1, isRtl(bidiFlags)); if (measuredWidth != null) { measuredWidth[measureIndex] = res; @@ -980,51 +979,27 @@ public class Paint_Delegate { /*package*/ static float native_getTextRunAdvances(int native_object, char[] text, int index, int count, int contextIndex, int contextCount, int flags, float[] advances, int advancesIndex) { + + if (advances != null) + for (int i = advancesIndex; i< advancesIndex+count; i++) + advances[i]=0; // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(native_object); - if (delegate == null) { + if (delegate == null || delegate.mFonts == null || delegate.mFonts.size() == 0) { return 0.f; } + boolean isRtl = isRtl(flags); - if (delegate.mFonts.size() > 0) { - // FIXME: handle multi-char characters (see measureText) - float totalAdvance = 0; - for (int i = 0; i < count; i++) { - char c = text[i + index]; - boolean found = false; - for (FontInfo info : delegate.mFonts) { - if (info.mFont.canDisplay(c)) { - float adv = info.mMetrics.charWidth(c); - totalAdvance += adv; - if (advances != null) { - advances[i] = adv; - } - - found = true; - break; - } - } - - if (found == false) { - // no advance for this char. - if (advances != null) { - advances[i] = 0.f; - } - } - } - - return totalAdvance; - } - - return 0; - + int limit = index + count; + return new BidiRenderer(null, delegate, text).renderText( + index, limit, isRtl, advances, advancesIndex, false, 0, 0); } @LayoutlibDelegate /*package*/ static float native_getTextRunAdvances(int native_object, String text, int start, int end, int contextStart, int contextEnd, int flags, float[] advances, int advancesIndex) { - // FIXME: support contextStart, contextEnd and direction flag + // FIXME: support contextStart and contextEnd int count = end - start; char[] buffer = TemporaryBuffer.obtain(count); TextUtils.getChars(text, start, end, buffer, 0); @@ -1080,19 +1055,12 @@ public class Paint_Delegate { // get the delegate from the native int. Paint_Delegate delegate = sManager.getDelegate(nativePaint); - if (delegate == null) { + if (delegate == null || delegate.mFonts == null || delegate.mFonts.size() == 0) { return; } - - // FIXME should test if the main font can display all those characters. - // See MeasureText - if (delegate.mFonts.size() > 0) { - FontInfo mainInfo = delegate.mFonts.get(0); - - Rectangle2D rect = mainInfo.mFont.getStringBounds(text, index, index + count, - delegate.mFontContext); - bounds.set(0, 0, (int) rect.getWidth(), (int) rect.getHeight()); - } + int w = (int) delegate.measureText(text, index, count, isRtl(bidiFlags)); + int h= delegate.getFonts().get(0).mMetrics.getHeight(); + bounds.set(0, 0, w, h); } @LayoutlibDelegate @@ -1176,6 +1144,7 @@ public class Paint_Delegate { info.mFont = info.mFont.deriveFont(new AffineTransform( mTextScaleX, mTextSkewX, 0, 1, 0, 0)); } + // The metrics here don't have anti-aliasing set. info.mMetrics = Toolkit.getDefaultToolkit().getFontMetrics(info.mFont); infoList.add(info); @@ -1185,64 +1154,9 @@ public class Paint_Delegate { } } - /*package*/ float measureText(char[] text, int index, int count, int bidiFlags) { - // TODO: find out what bidiFlags actually does. - - // WARNING: the logic in this method is similar to Canvas_Delegate.native_drawText - // Any change to this method should be reflected there as well - - if (mFonts.size() > 0) { - FontInfo mainFont = mFonts.get(0); - int i = index; - int lastIndex = index + count; - float total = 0f; - while (i < lastIndex) { - // always start with the main font. - int upTo = mainFont.mFont.canDisplayUpTo(text, i, lastIndex); - if (upTo == -1) { - // shortcut to exit - return total + mainFont.mMetrics.charsWidth(text, i, lastIndex - i); - } else if (upTo > 0) { - total += mainFont.mMetrics.charsWidth(text, i, upTo - i); - i = upTo; - // don't call continue at this point. Since it is certain the main font - // cannot display the font a index upTo (now ==i), we move on to the - // fallback fonts directly. - } - - // no char supported, attempt to read the next char(s) with the - // fallback font. In this case we only test the first character - // and then go back to test with the main font. - // Special test for 2-char characters. - boolean foundFont = false; - for (int f = 1 ; f < mFonts.size() ; f++) { - FontInfo fontInfo = mFonts.get(f); - - // need to check that the font can display the character. We test - // differently if the char is a high surrogate. - int charCount = Character.isHighSurrogate(text[i]) ? 2 : 1; - upTo = fontInfo.mFont.canDisplayUpTo(text, i, i + charCount); - if (upTo == -1) { - total += fontInfo.mMetrics.charsWidth(text, i, charCount); - i += charCount; - foundFont = true; - break; - - } - } - - // in case no font can display the char, measure it with the main font. - if (foundFont == false) { - int size = Character.isHighSurrogate(text[i]) ? 2 : 1; - total += mainFont.mMetrics.charsWidth(text, i, size); - i += size; - } - } - - return total; - } - - return 0; + /*package*/ float measureText(char[] text, int index, int count, boolean isRtl) { + return new BidiRenderer(null, this, text).renderText( + index, index + count, isRtl, null, 0, false, 0, 0); } private float getFontMetrics(FontMetrics metrics) { @@ -1281,4 +1195,14 @@ public class Paint_Delegate { } } + private static boolean isRtl(int flag) { + switch(flag) { + case Paint.BIDI_RTL: + case Paint.BIDI_FORCE_RTL: + case Paint.BIDI_DEFAULT_RTL: + return true; + default: + return false; + } + } } diff --git a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java b/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java index 52b8f348adf0..973fa0e9ef54 100644 --- a/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java +++ b/tools/layoutlib/bridge/src/android/text/AndroidBidi_Delegate.java @@ -16,7 +16,10 @@ package android.text; +import com.android.ide.common.rendering.api.LayoutLog; +import com.android.layoutlib.bridge.Bridge; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import com.ibm.icu.text.Bidi; /** @@ -29,9 +32,29 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; public class AndroidBidi_Delegate { @LayoutlibDelegate - /*package*/ static int runBidi(int dir, char[] chs, byte[] chInfo, int n, boolean haveInfo) { - // return the equivalent of Layout.DIR_LEFT_TO_RIGHT - // TODO: actually figure the direction. - return 0; + /*package*/ static int runBidi(int dir, char[] chars, byte[] charInfo, int count, + boolean haveInfo) { + + switch (dir) { + case 0: // Layout.DIR_REQUEST_LTR + case 1: // Layout.DIR_REQUEST_RTL + break; // No change. + case -1: + dir = Bidi.LEVEL_DEFAULT_LTR; + break; + case -2: + dir = Bidi.LEVEL_DEFAULT_RTL; + break; + default: + // Invalid code. Log error, assume LEVEL_DEFAULT_LTR and continue. + Bridge.getLog().error(LayoutLog.TAG_BROKEN, "Invalid direction flag", null); + dir = Bidi.LEVEL_DEFAULT_LTR; + } + Bidi bidi = new Bidi(chars, 0, null, 0, count, dir); + if (charInfo != null) { + for (int i = 0; i < count; ++i) + charInfo[i] = bidi.getLevelAt(i); + } + return bidi.getParaLevel(); } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java index 42257c560a7f..ab4be7132967 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/Bridge.java @@ -35,6 +35,7 @@ import com.android.resources.ResourceType; import com.android.tools.layoutlib.create.MethodAdapter; import com.android.tools.layoutlib.create.OverrideMethod; import com.android.util.Pair; +import com.ibm.icu.util.ULocale; import android.content.res.BridgeAssetManager; import android.graphics.Bitmap; @@ -64,6 +65,8 @@ import java.util.concurrent.locks.ReentrantLock; */ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { + private static final String ICU_LOCALE_DIRECTION_RTL = "right-to-left"; + public static class StaticMethodNotImplementedException extends RuntimeException { private static final long serialVersionUID = 1L; @@ -211,7 +214,8 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { Capability.ANIMATED_VIEW_MANIPULATION, Capability.ADAPTER_BINDING, Capability.EXTENDED_VIEWINFO, - Capability.FIXED_SCALABLE_NINE_PATCH); + Capability.FIXED_SCALABLE_NINE_PATCH, + Capability.RTL); BridgeAssetManager.initSystem(); @@ -411,6 +415,20 @@ public final class Bridge extends com.android.ide.common.rendering.api.Bridge { throw new IllegalArgumentException("viewObject is not a View"); } + @Override + public boolean isRtl(String locale) { + return isLocaleRtl(locale); + } + + public static boolean isLocaleRtl(String locale) { + if (locale == null) { + locale = ""; + } + ULocale uLocale = new ULocale(locale); + return uLocale.getCharacterOrientation().equals(ICU_LOCALE_DIRECTION_RTL) ? + true : false; + } + /** * Returns the lock for the bridge */ diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java index 688cc87f20a3..01740b16a0bb 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContentProvider.java @@ -134,4 +134,14 @@ public final class BridgeContentProvider implements IContentProvider { // TODO Auto-generated method stub return null; } + + @Override + public Uri canonicalize(String callingPkg, Uri uri) throws RemoteException { + return null; + } + + @Override + public Uri uncanonicalize(String callingPkg, Uri uri) throws RemoteException { + return null; + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index d63dcac1f218..a1f269715d52 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -132,7 +132,8 @@ public final class BridgeContext extends Context { RenderResources renderResources, IProjectCallback projectCallback, Configuration config, - int targetSdkVersion) { + int targetSdkVersion, + boolean hasRtlSupport) { mProjectKey = projectKey; mMetrics = metrics; mProjectCallback = projectCallback; @@ -142,6 +143,9 @@ public final class BridgeContext extends Context { mApplicationInfo = new ApplicationInfo(); mApplicationInfo.targetSdkVersion = targetSdkVersion; + if (hasRtlSupport) { + mApplicationInfo.flags = mApplicationInfo.flags | ApplicationInfo.FLAG_SUPPORTS_RTL; + } mWindowManager = new WindowManagerImpl(mMetrics); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java index ea9d8d929bc8..17b0eb641efa 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/CustomBar.java @@ -25,6 +25,7 @@ import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; import com.android.layoutlib.bridge.impl.ParserFactory; import com.android.layoutlib.bridge.impl.ResourceHelper; import com.android.resources.Density; +import com.android.resources.LayoutDirection; import com.android.resources.ResourceType; import org.xmlpull.v1.XmlPullParser; @@ -86,38 +87,53 @@ abstract class CustomBar extends LinearLayout { } } - private InputStream getIcon(String iconName, Density[] densityInOut, String[] pathOut, - boolean tryOtherDensities) { + private InputStream getIcon(String iconName, Density[] densityInOut, LayoutDirection direction, + String[] pathOut, boolean tryOtherDensities) { // current density Density density = densityInOut[0]; // bitmap url relative to this class - pathOut[0] = "/bars/" + density.getResourceValue() + "/" + iconName; + if (direction != null) { + pathOut[0] = "/bars/" + direction.getResourceValue() + "-" + density.getResourceValue() + + "/" + iconName; + } else { + pathOut[0] = "/bars/" + density.getResourceValue() + "/" + iconName; + } InputStream stream = getClass().getResourceAsStream(pathOut[0]); if (stream == null && tryOtherDensities) { for (Density d : Density.values()) { if (d != density) { densityInOut[0] = d; - stream = getIcon(iconName, densityInOut, pathOut, false /*tryOtherDensities*/); + stream = getIcon(iconName, densityInOut, direction, pathOut, + false /*tryOtherDensities*/); if (stream != null) { return stream; } } } + // couldn't find resource with direction qualifier. try without. + if (direction != null) { + return getIcon(iconName, densityInOut, null, pathOut, true); + } } return stream; } protected void loadIcon(int index, String iconName, Density density) { + loadIcon(index, iconName, density, false); + } + + protected void loadIcon(int index, String iconName, Density density, boolean isRtl) { View child = getChildAt(index); if (child instanceof ImageView) { ImageView imageView = (ImageView) child; String[] pathOut = new String[1]; Density[] densityInOut = new Density[] { density }; - InputStream stream = getIcon(iconName, densityInOut, pathOut, + LayoutDirection dir = isRtl ? LayoutDirection.RTL : LayoutDirection.LTR; + InputStream stream = getIcon(iconName, densityInOut, dir, pathOut, true /*tryOtherDensities*/); density = densityInOut[0]; diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java index cc90d6b33abe..84e676ed4bbd 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java @@ -17,6 +17,7 @@ package com.android.layoutlib.bridge.bars; import com.android.resources.Density; +import com.android.layoutlib.bridge.Bridge; import org.xmlpull.v1.XmlPullParserException; @@ -26,7 +27,8 @@ import android.widget.TextView; public class NavigationBar extends CustomBar { - public NavigationBar(Context context, Density density, int orientation) throws XmlPullParserException { + public NavigationBar(Context context, Density density, int orientation, boolean isRtl, + boolean rtlEnabled) throws XmlPullParserException { super(context, density, orientation, "/bars/navigation_bar.xml", "navigation_bar.xml"); setBackgroundColor(0xFF000000); @@ -37,14 +39,15 @@ public class NavigationBar extends CustomBar { // 0 is a spacer. int back = 1; int recent = 3; - if (orientation == LinearLayout.VERTICAL) { + if (orientation == LinearLayout.VERTICAL || (isRtl && !rtlEnabled)) { + // If RTL is enabled, then layoutlib mirrors the layout for us. back = 3; recent = 1; } - loadIcon(back, "ic_sysbar_back.png", density); - loadIcon(2, "ic_sysbar_home.png", density); - loadIcon(recent, "ic_sysbar_recent.png", density); + loadIcon(back, "ic_sysbar_back.png", density, isRtl); + loadIcon(2, "ic_sysbar_home.png", density, isRtl); + loadIcon(recent, "ic_sysbar_recent.png", density, isRtl); } @Override diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java index 5c084121d123..baa956d976d0 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java @@ -30,7 +30,10 @@ import android.widget.TextView; public class StatusBar extends CustomBar { - public StatusBar(Context context, Density density) throws XmlPullParserException { + public StatusBar(Context context, Density density, int direction, boolean RtlEnabled) + throws XmlPullParserException { + // FIXME: if direction is RTL but it's not enabled in application manifest, mirror this bar. + super(context, density, LinearLayout.HORIZONTAL, "/bars/status_bar.xml", "status_bar.xml"); // FIXME: use FILL_H? diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java index 081ce67c7950..108b651e302c 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/FontLoader.java @@ -52,6 +52,8 @@ public final class FontLoader { private static final String NODE_NAME = "name"; private static final String NODE_FILE = "file"; + private static final String ATTRIBUTE_VARIANT = "variant"; + private static final String ATTRIBUTE_VALUE_ELEGANT = "elegant"; private static final String FONT_SUFFIX_NONE = ".ttf"; private static final String FONT_SUFFIX_REGULAR = "-Regular.ttf"; private static final String FONT_SUFFIX_BOLD = "-Bold.ttf"; @@ -189,6 +191,7 @@ public final class FontLoader { private FontInfo mFontInfo = null; private final StringBuilder mBuilder = new StringBuilder(); private List<FontInfo> mFontList = new ArrayList<FontInfo>(); + private boolean isCompactFont = true; private FontHandler(String osFontsLocation) { super(); @@ -209,8 +212,21 @@ public final class FontLoader { mFontList = new ArrayList<FontInfo>(); } else if (NODE_FAMILY.equals(localName)) { if (mFontList != null) { + mFontInfo = null; + } + } else if (NODE_NAME.equals(localName)) { + if (mFontList != null && mFontInfo == null) { + mFontInfo = new FontInfo(); + } + } else if (NODE_FILE.equals(localName)) { + if (mFontList != null && mFontInfo == null) { mFontInfo = new FontInfo(); } + if (ATTRIBUTE_VALUE_ELEGANT.equals(attributes.getValue(ATTRIBUTE_VARIANT))) { + isCompactFont = false; + } else { + isCompactFont = true; + } } mBuilder.setLength(0); @@ -223,7 +239,9 @@ public final class FontLoader { */ @Override public void characters(char[] ch, int start, int length) throws SAXException { - mBuilder.append(ch, start, length); + if (isCompactFont) { + mBuilder.append(ch, start, length); + } } /* (non-Javadoc) @@ -259,7 +277,7 @@ public final class FontLoader { } } else if (NODE_FILE.equals(localName)) { // handle a new file for an existing Font Info - if (mFontInfo != null) { + if (isCompactFont && mFontInfo != null) { String fileName = trimXmlWhitespaces(mBuilder.toString()); Font font = getFont(fileName); if (font != null) { diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java index b909bec6299e..87047b34371e 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderAction.java @@ -121,7 +121,8 @@ public abstract class RenderAction<T extends RenderParams> extends FrameworkReso // build the context mContext = new BridgeContext(mParams.getProjectKey(), metrics, resources, - mParams.getProjectCallback(), getConfiguration(), mParams.getTargetSdkVersion()); + mParams.getProjectCallback(), getConfiguration(), mParams.getTargetSdkVersion(), + mParams.isRtlSupported()); setUp(); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index 6011fdbabcdd..57771e326a2b 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -224,13 +224,15 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { SessionParams params = getParams(); HardwareConfig hardwareConfig = params.getHardwareConfig(); BridgeContext context = getContext(); - + boolean isRtl = Bridge.isLocaleRtl(params.getLocale()); + int direction = isRtl ? View.LAYOUT_DIRECTION_RTL : View.LAYOUT_DIRECTION_LTR; // the view group that receives the window background. ViewGroup backgroundView = null; if (mWindowIsFloating || params.isForceNoDecor()) { backgroundView = mViewRoot = mContentRoot = new FrameLayout(context); + mViewRoot.setLayoutDirection(direction); } else { if (hasSoftwareButtons() && mNavigationBarOrientation == LinearLayout.VERTICAL) { /* @@ -252,12 +254,14 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { the bottom */ LinearLayout topLayout = new LinearLayout(context); + topLayout.setLayoutDirection(direction); mViewRoot = topLayout; topLayout.setOrientation(LinearLayout.HORIZONTAL); try { NavigationBar navigationBar = new NavigationBar(context, - hardwareConfig.getDensity(), LinearLayout.VERTICAL); + hardwareConfig.getDensity(), LinearLayout.VERTICAL, isRtl, + params.isRtlSupported()); navigationBar.setLayoutParams( new LinearLayout.LayoutParams( mNavigationBarSize, @@ -289,6 +293,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { LinearLayout topLayout = new LinearLayout(context); topLayout.setOrientation(LinearLayout.VERTICAL); + topLayout.setLayoutDirection(direction); // if we don't already have a view root this is it if (mViewRoot == null) { mViewRoot = topLayout; @@ -300,13 +305,22 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // this is the case of soft buttons + vertical bar. // this top layout is the first layout in the horizontal layout. see above) - mViewRoot.addView(topLayout, 0); + if (isRtl && params.isRtlSupported()) { + // If RTL is enabled, layoutlib will mirror the layouts. So, add the + // topLayout to the right of Navigation Bar and layoutlib will draw it + // to the left. + mViewRoot.addView(topLayout); + } else { + // Add the top layout to the left of the Navigation Bar. + mViewRoot.addView(topLayout, 0); + } } if (mStatusBarSize > 0) { // system bar try { - StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity()); + StatusBar systemBar = new StatusBar(context, hardwareConfig.getDensity(), + direction, params.isRtlSupported()); systemBar.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, mStatusBarSize)); @@ -365,7 +379,8 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // system bar try { NavigationBar navigationBar = new NavigationBar(context, - hardwareConfig.getDensity(), LinearLayout.HORIZONTAL); + hardwareConfig.getDensity(), LinearLayout.HORIZONTAL, isRtl, + params.isRtlSupported()); navigationBar.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, mNavigationBarSize)); diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java index 4baab1fd4875..ea7904c1a479 100644 --- a/wifi/java/android/net/wifi/WifiConfigStore.java +++ b/wifi/java/android/net/wifi/WifiConfigStore.java @@ -680,9 +680,15 @@ class WifiConfigStore { } config.ipAssignment = IpAssignment.DHCP; config.proxySettings = ProxySettings.NONE; - mConfiguredNetworks.put(config.networkId, config); - mNetworkIds.put(configKey(config), config.networkId); - localLog("loaded configured network", config.networkId); + + if (mNetworkIds.containsKey(configKey(config))) { + // That SSID is already known, just ignore this duplicate entry + localLog("discarded duplicate network", config.networkId); + } else { + mConfiguredNetworks.put(config.networkId, config); + mNetworkIds.put(configKey(config), config.networkId); + localLog("loaded configured network", config.networkId); + } } readIpAndProxyConfigurations(); diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index f86a51c9bd2f..83789e265518 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -500,7 +500,7 @@ public class WifiNative { } public void bssFlush() { - doBooleanCommand("BSS_FLUSH"); + doBooleanCommand("BSS_FLUSH 0"); } public boolean startWpsPbc(String bssid) { diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index d4e98c544aea..3ccdbea0182b 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java @@ -51,6 +51,7 @@ import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.NetworkUtils; +import android.net.RouteInfo; import android.net.wifi.WpsResult.Status; import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pService; @@ -79,9 +80,12 @@ import com.android.internal.util.Protocol; import com.android.internal.util.State; import com.android.internal.util.StateMachine; +import com.android.server.net.BaseNetworkObserver; + import java.io.FileDescriptor; import java.io.PrintWriter; import java.net.InetAddress; +import java.net.Inet6Address; import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -198,8 +202,19 @@ public class WifiStateMachine extends StateMachine { /* Tracks sequence number on a driver time out */ private int mDriverStartToken = 0; + /** + * The link properties of the wifi interface. + * Do not modify this directly; use updateLinkProperties instead. + */ private LinkProperties mLinkProperties; + /** + * Subset of link properties coming from netlink. + * Currently includes IPv4 and IPv6 addresses. In the future will also include IPv6 DNS servers + * and domains obtained from router advertisements (RFC 6106). + */ + private final LinkProperties mNetlinkLinkProperties; + /* Tracks sequence number on a periodic scan message */ private int mPeriodicScanToken = 0; @@ -215,6 +230,39 @@ public class WifiStateMachine extends StateMachine { private SupplicantStateTracker mSupplicantStateTracker; private DhcpStateMachine mDhcpStateMachine; + private class InterfaceObserver extends BaseNetworkObserver { + private WifiStateMachine mWifiStateMachine; + + InterfaceObserver(WifiStateMachine wifiStateMachine) { + super(); + mWifiStateMachine = wifiStateMachine; + } + + @Override + public void addressUpdated(String address, String iface, int flags, int scope) { + if (mWifiStateMachine.mInterfaceName.equals(iface)) { + if (DBG) { + log("addressUpdated: " + address + " on " + iface + + " flags " + flags + " scope " + scope); + } + mWifiStateMachine.sendMessage(CMD_IP_ADDRESS_UPDATED, new LinkAddress(address)); + } + } + + @Override + public void addressRemoved(String address, String iface, int flags, int scope) { + if (mWifiStateMachine.mInterfaceName.equals(iface)) { + if (DBG) { + log("addressRemoved: " + address + " on " + iface + + " flags " + flags + " scope " + scope); + } + mWifiStateMachine.sendMessage(CMD_IP_ADDRESS_REMOVED, new LinkAddress(address)); + } + } + } + + private InterfaceObserver mInterfaceObserver; + private AlarmManager mAlarmManager; private PendingIntent mScanIntent; private PendingIntent mDriverStopIntent; @@ -372,6 +420,12 @@ public class WifiStateMachine extends StateMachine { public static final int CMD_START_NEXT_BATCHED_SCAN = BASE + 136; public static final int CMD_POLL_BATCHED_SCAN = BASE + 137; + /* Link configuration (IP address, DNS, ...) changes */ + /* An new IP address was added to our interface, or an existing IP address was updated */ + static final int CMD_IP_ADDRESS_UPDATED = BASE + 140; + /* An IP address was removed from our interface */ + static final int CMD_IP_ADDRESS_REMOVED = BASE + 141; + public static final int CONNECT_MODE = 1; public static final int SCAN_ONLY_MODE = 2; public static final int SCAN_ONLY_WITH_WIFI_OFF_MODE = 3; @@ -585,15 +639,22 @@ public class WifiStateMachine extends StateMachine { mSupplicantStateTracker = new SupplicantStateTracker(context, this, mWifiConfigStore, getHandler()); mLinkProperties = new LinkProperties(); + mNetlinkLinkProperties = new LinkProperties(); mWifiP2pManager = (WifiP2pManager) mContext.getSystemService(Context.WIFI_P2P_SERVICE); mNetworkInfo.setIsAvailable(false); - mLinkProperties.clear(); mLastBssid = null; mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; mLastSignalLevel = -1; + mInterfaceObserver = new InterfaceObserver(this); + try { + mNwService.registerObserver(mInterfaceObserver); + } catch (RemoteException e) { + loge("Couldn't register interface observer: " + e.toString()); + } + mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE); Intent scanIntent = new Intent(ACTION_START_SCAN, null); mScanIntent = PendingIntent.getBroadcast(mContext, SCAN_REQUEST, scanIntent, 0); @@ -1906,19 +1967,82 @@ public class WifiStateMachine extends StateMachine { } } - private void configureLinkProperties() { - if (mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { - mLinkProperties = mWifiConfigStore.getLinkProperties(mLastNetworkId); - } else { - synchronized (mDhcpResultsLock) { - if ((mDhcpResults != null) && (mDhcpResults.linkProperties != null)) { - mLinkProperties = mDhcpResults.linkProperties; + /** + * Updates mLinkProperties by merging information from various sources. + * + * This is needed because the information in mLinkProperties comes from multiple sources (DHCP, + * netlink, static configuration, ...). When one of these sources of information has updated + * link properties, we can't just assign them to mLinkProperties or we'd lose track of the + * information that came from other sources. Instead, when one of those sources has new + * information, we update the object that tracks the information from that source and then + * call this method to apply the change to mLinkProperties. + * + * The information in mLinkProperties is currently obtained as follows: + * - Interface name: set in the constructor. + * - IPv4 and IPv6 addresses: netlink, via mInterfaceObserver. + * - IPv4 routes, DNS servers, and domains: DHCP. + * - HTTP proxy: the wifi config store. + */ + private void updateLinkProperties() { + LinkProperties newLp = new LinkProperties(); + + // Interface name and proxy are locally configured. + newLp.setInterfaceName(mInterfaceName); + newLp.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); + + // IPv4 and IPv6 addresses come from netlink. + newLp.setLinkAddresses(mNetlinkLinkProperties.getLinkAddresses()); + + // For now, routing and DNS only come from DHCP or static configuration. In the future, + // we'll need to merge IPv6 DNS servers and domains coming from netlink. + synchronized (mDhcpResultsLock) { + // Even when we're using static configuration, we don't need to look at the config + // store, because static IP configuration also populates mDhcpResults. + if ((mDhcpResults != null) && (mDhcpResults.linkProperties != null)) { + LinkProperties lp = mDhcpResults.linkProperties; + for (RouteInfo route: lp.getRoutes()) { + newLp.addRoute(route); + } + for (InetAddress dns: lp.getDnses()) { + newLp.addDns(dns); } + newLp.setDomains(lp.getDomains()); + } + } + + // If anything has changed, and we're already connected, send out a notification. + // If we're still connecting, apps will be notified when we connect. + if (!newLp.equals(mLinkProperties)) { + if (DBG) { + log("Link configuration changed for netId: " + mLastNetworkId + + " old: " + mLinkProperties + "new: " + newLp); + } + mLinkProperties = newLp; + if (getNetworkDetailedState() == DetailedState.CONNECTED) { + sendLinkConfigurationChangedBroadcast(); } - mLinkProperties.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); } - mLinkProperties.setInterfaceName(mInterfaceName); - if (DBG) log("netId=" + mLastNetworkId + " Link configured: " + mLinkProperties); + } + + /** + * Clears all our link properties. + */ + private void clearLinkProperties() { + // If the network used DHCP, clear the LinkProperties we stored in the config store. + if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { + mWifiConfigStore.clearLinkProperties(mLastNetworkId); + } + + // Clear the link properties obtained from DHCP and netlink. + synchronized(mDhcpResultsLock) { + if (mDhcpResults != null && mDhcpResults.linkProperties != null) { + mDhcpResults.linkProperties.clear(); + } + } + mNetlinkLinkProperties.clear(); + + // Now clear the merged link properties. + mLinkProperties.clear(); } private int getMaxDhcpRetries() { @@ -2041,16 +2165,11 @@ public class WifiStateMachine extends StateMachine { mWifiConfigStore.updateStatus(mLastNetworkId, DetailedState.DISCONNECTED); /* Clear network properties */ - mLinkProperties.clear(); + clearLinkProperties(); /* send event to CM & network change broadcast */ sendNetworkStateChangeBroadcast(mLastBssid); - /* Clear IP settings if the network used DHCP */ - if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { - mWifiConfigStore.clearLinkProperties(mLastNetworkId); - } - mLastBssid= null; mLastNetworkId = WifiConfiguration.INVALID_NETWORK_ID; } @@ -2149,20 +2268,7 @@ public class WifiStateMachine extends StateMachine { } mWifiInfo.setInetAddress(addr); mWifiInfo.setMeteredHint(dhcpResults.hasMeteredHint()); - if (getNetworkDetailedState() == DetailedState.CONNECTED) { - //DHCP renewal in connected state - linkProperties.setHttpProxy(mWifiConfigStore.getProxyProperties(mLastNetworkId)); - if (!linkProperties.equals(mLinkProperties)) { - if (DBG) { - log("Link configuration changed for netId: " + mLastNetworkId - + " old: " + mLinkProperties + "new: " + linkProperties); - } - mLinkProperties = linkProperties; - sendLinkConfigurationChangedBroadcast(); - } - } else { - configureLinkProperties(); - } + updateLinkProperties(); } private void handleFailedIpConfiguration() { @@ -2387,6 +2493,17 @@ public class WifiStateMachine extends StateMachine { mTemporarilyDisconnectWifi = (message.arg1 == 1); replyToMessage(message, WifiP2pService.DISCONNECT_WIFI_RESPONSE); break; + case CMD_IP_ADDRESS_UPDATED: + // addLinkAddress is a no-op if called more than once with the same address. + if (mNetlinkLinkProperties.addLinkAddress((LinkAddress) message.obj)) { + updateLinkProperties(); + } + break; + case CMD_IP_ADDRESS_REMOVED: + if (mNetlinkLinkProperties.removeLinkAddress((LinkAddress) message.obj)) { + updateLinkProperties(); + } + break; default: loge("Error! unhandled message" + message); break; @@ -3405,8 +3522,7 @@ public class WifiStateMachine extends StateMachine { } if (result.hasProxyChanged()) { log("Reconfiguring proxy on connection"); - configureLinkProperties(); - sendLinkConfigurationChangedBroadcast(); + updateLinkProperties(); } } @@ -3460,13 +3576,14 @@ public class WifiStateMachine extends StateMachine { @Override public void enter() { if (!mWifiConfigStore.isUsingStaticIp(mLastNetworkId)) { + // TODO: If we're switching between static IP configuration and DHCP, remove the + // static configuration first. startDhcp(); } else { // stop any running dhcp before assigning static IP stopDhcp(); DhcpResults dhcpResults = new DhcpResults( mWifiConfigStore.getLinkProperties(mLastNetworkId)); - dhcpResults.linkProperties.setInterfaceName(mInterfaceName); InterfaceConfiguration ifcg = new InterfaceConfiguration(); Iterator<LinkAddress> addrs = dhcpResults.linkProperties.getLinkAddresses().iterator(); diff --git a/wifi/java/android/net/wifi/WifiStateTracker.java b/wifi/java/android/net/wifi/WifiStateTracker.java index 62630d61ca6b..615c893446c8 100644 --- a/wifi/java/android/net/wifi/WifiStateTracker.java +++ b/wifi/java/android/net/wifi/WifiStateTracker.java @@ -22,12 +22,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.net.BaseNetworkStateTracker; import android.net.LinkCapabilities; -import android.net.LinkInfo; +import android.net.LinkQualityInfo; import android.net.LinkProperties; import android.net.NetworkInfo; import android.net.NetworkInfo.DetailedState; import android.net.SamplingDataTracker; -import android.net.WifiLinkInfo; +import android.net.WifiLinkQualityInfo; import android.os.Handler; import android.os.Message; import android.os.Messenger; @@ -203,35 +203,35 @@ public class WifiStateTracker extends BaseNetworkStateTracker { /** * Return link info - * @return an object of type WifiLinkInfo + * @return an object of type WifiLinkQualityInfo */ @Override - public LinkInfo getLinkInfo() { + public LinkQualityInfo getLinkQualityInfo() { if (mNetworkInfo == null) { // no data available yet; just return return null; } - WifiLinkInfo li = new WifiLinkInfo(); - li.mNetworkType = mNetworkInfo.getType(); + WifiLinkQualityInfo li = new WifiLinkQualityInfo(); + li.setNetworkType(mNetworkInfo.getType()); synchronized(mSamplingDataTracker.mSamplingDataLock) { - mSamplingDataTracker.setCommonLinkInfoFields(li); - li.mTxGood = mSamplingDataTracker.getSampledTxPacketCount(); - li.mTxBad = mSamplingDataTracker.getSampledTxPacketErrorCount(); + mSamplingDataTracker.setCommonLinkQualityInfoFields(li); + li.setTxGood(mSamplingDataTracker.getSampledTxPacketCount()); + li.setTxBad(mSamplingDataTracker.getSampledTxPacketErrorCount()); } // li.setTheoreticalRxBandwidth(??); // li.setTheoreticalTxBandwidth(??); if (mWifiInfo != null) { - li.mBssid = mWifiInfo.getBSSID(); + li.setBssid(mWifiInfo.getBSSID()); int rssi = mWifiInfo.getRssi(); - li.mRssi = rssi; + li.setRssi(rssi); - li.mNormalizedSignalStrength = mWifiManager.calculateSignalLevel(rssi, - LinkInfo.NORMALIZED_SIGNAL_STRENGTH_RANGE); + li.setNormalizedSignalStrength(mWifiManager.calculateSignalLevel(rssi, + LinkQualityInfo.NORMALIZED_SIGNAL_STRENGTH_RANGE)); } return li; |