diff options
109 files changed, 3870 insertions, 2154 deletions
diff --git a/api/current.txt b/api/current.txt index 0c336e165a0a..37157646051e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -109,6 +109,7 @@ package android { field public static final java.lang.String RECEIVE_SMS = "android.permission.RECEIVE_SMS"; field public static final java.lang.String RECEIVE_WAP_PUSH = "android.permission.RECEIVE_WAP_PUSH"; field public static final java.lang.String RECORD_AUDIO = "android.permission.RECORD_AUDIO"; + field public static final java.lang.String RECOVERY = "android.permission.RECOVERY"; field public static final java.lang.String REORDER_TASKS = "android.permission.REORDER_TASKS"; field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES"; field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE"; @@ -18878,6 +18879,7 @@ package android.os { field public static final deprecated int FULL_WAKE_LOCK = 26; // 0x1a field public static final int ON_AFTER_RELEASE = 536870912; // 0x20000000 field public static final int PARTIAL_WAKE_LOCK = 1; // 0x1 + field public static final java.lang.String REBOOT_RECOVERY = "recovery"; field public static final deprecated int SCREEN_BRIGHT_WAKE_LOCK = 10; // 0xa field public static final deprecated int SCREEN_DIM_WAKE_LOCK = 6; // 0x6 } @@ -31465,10 +31467,12 @@ package android.widget { method public int getCheckedItemPosition(); method public android.util.SparseBooleanArray getCheckedItemPositions(); method public int getChoiceMode(); + method public int getFirstPositionForRow(int); method public int getListPaddingBottom(); method public int getListPaddingLeft(); method public int getListPaddingRight(); method public int getListPaddingTop(); + method public int getRowForPosition(int); method public android.view.View getSelectedView(); method public android.graphics.drawable.Drawable getSelector(); method public java.lang.CharSequence getTextFilter(); @@ -31514,6 +31518,7 @@ package android.widget { method public void setRemoteViewsAdapter(android.content.Intent); method public void setScrollIndicators(android.view.View, android.view.View); method public void setScrollingCacheEnabled(boolean); + method public void setSelectionFromTop(int, int); method public void setSelector(int); method public void setSelector(android.graphics.drawable.Drawable); method public void setSmoothScrollbarEnabled(boolean); @@ -32629,7 +32634,6 @@ package android.widget { method public void setOverscrollHeader(android.graphics.drawable.Drawable); method public void setSelection(int); method public void setSelectionAfterHeaderView(); - method public void setSelectionFromTop(int, int); method public void smoothScrollByOffset(int); } diff --git a/core/java/android/app/ActivityView.java b/core/java/android/app/ActivityView.java index fef4597e4e4e..25cde8cf8f95 100644 --- a/core/java/android/app/ActivityView.java +++ b/core/java/android/app/ActivityView.java @@ -24,6 +24,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.AttributeSet; import android.util.DisplayMetrics; +import android.util.Log; import android.view.Surface; import android.view.TextureView; import android.view.TextureView.SurfaceTextureListener; @@ -31,12 +32,15 @@ import android.view.ViewGroup; import android.view.WindowManager; public class ActivityView extends ViewGroup { + private final String TAG = "ActivityView"; + private final TextureView mTextureView; private IActivityContainer mActivityContainer; private Activity mActivity; private boolean mAttached; private int mWidth; private int mHeight; + private Surface mSurface; public ActivityView(Context context) { this(context, null); @@ -83,20 +87,18 @@ public class ActivityView extends ViewGroup { final SurfaceTexture surfaceTexture = mTextureView.getSurfaceTexture(); if (surfaceTexture != null) { - createActivityView(surfaceTexture); + attachToSurface(surfaceTexture); } } @Override protected void onDetachedFromWindow() { - if (mActivityContainer != null) { - try { - mActivityContainer.deleteActivityView(); - } catch (RemoteException e) { - } - mActivityContainer = null; - } - mAttached = false; + detachFromSurface(); + } + + @Override + public boolean isAttachedToWindow() { + return mAttached; } public void startActivity(Intent intent) { @@ -110,22 +112,41 @@ public class ActivityView extends ViewGroup { } /** Call when both mActivityContainer and mTextureView's SurfaceTexture are not null */ - private void createActivityView(SurfaceTexture surfaceTexture) { + private void attachToSurface(SurfaceTexture surfaceTexture) { WindowManager wm = (WindowManager)mActivity.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(metrics); + mSurface = new Surface(surfaceTexture); try { - mActivityContainer.createActivityView(new Surface(surfaceTexture), mWidth, mHeight, + mActivityContainer.attachToSurface(mSurface, mWidth, mHeight, metrics.densityDpi); } catch (RemoteException e) { mActivityContainer = null; + mSurface.release(); + mSurface = null; + mAttached = false; throw new IllegalStateException( "ActivityView: Unable to create ActivityContainer. " + e); } mAttached = true; } + private void detachFromSurface() { + if (mActivityContainer != null) { + try { + mActivityContainer.detachFromDisplay(); + } catch (RemoteException e) { + } + mActivityContainer = null; + } + if (mSurface != null) { + mSurface.release(); + mSurface = null; + } + mAttached = false; + } + private class ActivityViewSurfaceTextureListener implements SurfaceTextureListener { @Override public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, @@ -133,30 +154,26 @@ public class ActivityView extends ViewGroup { mWidth = width; mHeight = height; if (mActivityContainer != null) { - createActivityView(surfaceTexture); + attachToSurface(surfaceTexture); } } @Override public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) { + Log.d(TAG, "onSurfaceTextureSizeChanged: w=" + width + " h=" + height); } @Override public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) { - try { - mActivityContainer.deleteActivityView(); - // TODO: Add binderDied to handle this nullification. - mActivityContainer = null; - } catch (RemoteException r) { - } - mAttached = false; - return false; + Log.d(TAG, "onSurfaceTextureDestroyed"); + detachFromSurface(); + return true; } @Override public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) { - +// Log.d(TAG, "onSurfaceTextureUpdated"); } } diff --git a/core/java/android/app/IActivityContainer.aidl b/core/java/android/app/IActivityContainer.aidl index b03a459a95a4..df1cf914c9fa 100644 --- a/core/java/android/app/IActivityContainer.aidl +++ b/core/java/android/app/IActivityContainer.aidl @@ -24,9 +24,8 @@ import android.view.Surface; /** @hide */ interface IActivityContainer { void attachToDisplay(int displayId); - int getDisplayId(); + void attachToSurface(in Surface surface, int width, int height, int density); void detachFromDisplay(); int startActivity(in Intent intent); - void createActivityView(in Surface surface, int width, int height, int density); - void deleteActivityView(); + int getDisplayId(); } diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index e53486d98a32..c77ce0d43e12 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -539,6 +539,12 @@ public final class AssetManager { public final int getAssetInt() { return mAsset; } + /** + * @hide + */ + public final long getNativeAsset() { + return mAsset; + } private AssetInputStream(int asset) { mAsset = asset; diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index b5fd302f32e1..ce0041b5a103 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -227,10 +227,10 @@ public final class CameraCharacteristics extends CameraMetadata { * which enables application control of white balance, by using * {@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} and {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains}({@link CaptureRequest#COLOR_CORRECTION_MODE android.colorCorrection.mode} must be set to TRANSFORM_MATRIX).</p> * - * @see CaptureRequest#CONTROL_AWB_MODE + * @see CaptureRequest#COLOR_CORRECTION_GAINS * @see CaptureRequest#COLOR_CORRECTION_MODE * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM - * @see CaptureRequest#COLOR_CORRECTION_GAINS + * @see CaptureRequest#CONTROL_AWB_MODE */ public static final Key<byte[]> CONTROL_AWB_AVAILABLE_MODES = new Key<byte[]>("android.control.awbAvailableModes", byte[].class); @@ -253,18 +253,18 @@ public final class CameraCharacteristics extends CameraMetadata { /** * <p>Supported resolutions for the JPEG thumbnail</p> - * <p>Below condiditions must be satisfied for this size list:</p> + * <p>Below condiditions will be satisfied for this size list:</p> * <ul> - * <li>The sizes must be sorted by increasing pixel area (width x height). - * If several resolutions have the same area, they must be sorted by increasing width.</li> - * <li>The aspect ratio of the largest thumbnail size must be same as the + * <li>The sizes will be sorted by increasing pixel area (width x height). + * If several resolutions have the same area, they will be sorted by increasing width.</li> + * <li>The aspect ratio of the largest thumbnail size will be same as the * aspect ratio of largest size in {@link CameraCharacteristics#SCALER_AVAILABLE_JPEG_SIZES android.scaler.availableJpegSizes}. * The largest size is defined as the size that has the largest pixel area * in a given size list.</li> - * <li>Each size in {@link CameraCharacteristics#SCALER_AVAILABLE_JPEG_SIZES android.scaler.availableJpegSizes} must have at least + * <li>Each size in {@link CameraCharacteristics#SCALER_AVAILABLE_JPEG_SIZES android.scaler.availableJpegSizes} will have at least * one corresponding size that has the same aspect ratio in availableThumbnailSizes, * and vice versa.</li> - * <li>All non (0, 0) sizes must have non-zero widths and heights.</li> + * <li>All non (0, 0) sizes will have non-zero widths and heights.</li> * </ul> * * @see CameraCharacteristics#SCALER_AVAILABLE_JPEG_SIZES @@ -500,8 +500,8 @@ public final class CameraCharacteristics extends CameraMetadata { * Present on all camera devices that report being {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL_FULL HARDWARE_LEVEL_FULL} devices in the * {@link CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL android.info.supportedHardwareLevel} key</p> * - * @see CaptureRequest#SENSOR_SENSITIVITY * @see CameraCharacteristics#INFO_SUPPORTED_HARDWARE_LEVEL + * @see CaptureRequest#SENSOR_SENSITIVITY */ public static final Key<Integer> SENSOR_MAX_ANALOG_SENSITIVITY = new Key<Integer>("android.sensor.maxAnalogSensitivity", int.class); diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 02c8fee6526a..81640a6f96a8 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -252,8 +252,8 @@ public abstract class CameraMetadata { * <p>Use the {@link CaptureRequest#COLOR_CORRECTION_TRANSFORM android.colorCorrection.transform} matrix * and {@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains} to do color conversion</p> * - * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#COLOR_CORRECTION_GAINS + * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#COLOR_CORRECTION_MODE */ public static final int COLOR_CORRECTION_MODE_TRANSFORM_MATRIX = 0; @@ -351,8 +351,8 @@ public abstract class CameraMetadata { * {@link CaptureRequest#CONTROL_CAPTURE_INTENT android.control.captureIntent} field is set to * STILL_CAPTURE</p> * - * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureRequest#CONTROL_AE_MODE */ public static final int CONTROL_AE_MODE_ON_AUTO_FLASH = 2; @@ -367,8 +367,8 @@ public abstract class CameraMetadata { * {@link CaptureRequest#CONTROL_CAPTURE_INTENT android.control.captureIntent} field is set to * STILL_CAPTURE</p> * - * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + * @see CaptureRequest#CONTROL_CAPTURE_INTENT * @see CaptureRequest#CONTROL_AE_MODE */ public static final int CONTROL_AE_MODE_ON_ALWAYS_FLASH = 3; @@ -393,10 +393,9 @@ public abstract class CameraMetadata { public static final int CONTROL_AE_PRECAPTURE_TRIGGER_IDLE = 0; /** - * <p>The precapture metering sequence - * must be started. The exact effect of the precapture - * trigger depends on the current AE mode and - * state.</p> + * <p>The precapture metering sequence will be started + * by the camera device. The exact effect of the precapture + * trigger depends on the current AE mode and state.</p> * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER */ public static final int CONTROL_AE_PRECAPTURE_TRIGGER_START = 1; @@ -504,14 +503,14 @@ public abstract class CameraMetadata { public static final int CONTROL_AF_TRIGGER_IDLE = 0; /** - * <p>Autofocus must trigger now.</p> + * <p>Autofocus will trigger now.</p> * @see CaptureRequest#CONTROL_AF_TRIGGER */ public static final int CONTROL_AF_TRIGGER_START = 1; /** - * <p>Autofocus must return to initial - * state, and cancel any active trigger.</p> + * <p>Autofocus will return to its initial + * state, and cancel any currently active trigger.</p> * @see CaptureRequest#CONTROL_AF_TRIGGER */ public static final int CONTROL_AF_TRIGGER_CANCEL = 2; @@ -527,8 +526,8 @@ public abstract class CameraMetadata { * ({@link CaptureRequest#COLOR_CORRECTION_GAINS android.colorCorrection.gains}) are used by the camera * device for manual white balance control.</p> * - * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#COLOR_CORRECTION_GAINS + * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#CONTROL_AWB_MODE */ public static final int CONTROL_AWB_MODE_OFF = 0; @@ -993,7 +992,7 @@ public abstract class CameraMetadata { // /** - * <p>AE is off. When a camera device is opened, it starts in + * <p>AE is off or recently reset. When a camera device is opened, it starts in * this state.</p> * @see CaptureResult#CONTROL_AE_STATE */ @@ -1001,21 +1000,20 @@ public abstract class CameraMetadata { /** * <p>AE doesn't yet have a good set of control values - * for the current scene</p> + * for the current scene.</p> * @see CaptureResult#CONTROL_AE_STATE */ public static final int CONTROL_AE_STATE_SEARCHING = 1; /** * <p>AE has a good set of control values for the - * current scene</p> + * current scene.</p> * @see CaptureResult#CONTROL_AE_STATE */ public static final int CONTROL_AE_STATE_CONVERGED = 2; /** - * <p>AE has been locked (aeMode = - * LOCKED)</p> + * <p>AE has been locked.</p> * @see CaptureResult#CONTROL_AE_STATE */ public static final int CONTROL_AE_STATE_LOCKED = 3; @@ -1023,18 +1021,19 @@ public abstract class CameraMetadata { /** * <p>AE has a good set of control values, but flash * needs to be fired for good quality still - * capture</p> + * capture.</p> * @see CaptureResult#CONTROL_AE_STATE */ public static final int CONTROL_AE_STATE_FLASH_REQUIRED = 4; /** * <p>AE has been asked to do a precapture sequence - * (through the - * trigger_action(CAMERA2_TRIGGER_PRECAPTURE_METERING) - * call), and is currently executing it. Once PRECAPTURE + * (through the {@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} START), + * and is currently executing it. Once PRECAPTURE * completes, AE will transition to CONVERGED or - * FLASH_REQUIRED as appropriate</p> + * FLASH_REQUIRED as appropriate.</p> + * + * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER * @see CaptureResult#CONTROL_AE_STATE */ public static final int CONTROL_AE_STATE_PRECAPTURE = 5; @@ -1112,21 +1111,20 @@ public abstract class CameraMetadata { /** * <p>AWB doesn't yet have a good set of control - * values for the current scene</p> + * values for the current scene.</p> * @see CaptureResult#CONTROL_AWB_STATE */ public static final int CONTROL_AWB_STATE_SEARCHING = 1; /** * <p>AWB has a good set of control values for the - * current scene</p> + * current scene.</p> * @see CaptureResult#CONTROL_AWB_STATE */ public static final int CONTROL_AWB_STATE_CONVERGED = 2; /** - * <p>AE has been locked (aeMode = - * LOCKED)</p> + * <p>AWB has been locked.</p> * @see CaptureResult#CONTROL_AWB_STATE */ public static final int CONTROL_AWB_STATE_LOCKED = 3; diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index e759e04111ab..fbcc39b08dfd 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -400,9 +400,9 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * the application in this.</p> * * @see CameraCharacteristics#CONTROL_AE_AVAILABLE_ANTIBANDING_MODES - * @see CaptureResult#STATISTICS_SCENE_FLICKER - * @see CaptureRequest#CONTROL_MODE * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_MODE + * @see CaptureResult#STATISTICS_SCENE_FLICKER * @see #CONTROL_AE_ANTIBANDING_MODE_OFF * @see #CONTROL_AE_ANTIBANDING_MODE_50HZ * @see #CONTROL_AE_ANTIBANDING_MODE_60HZ @@ -453,12 +453,12 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * fields for a given capture will be available in its * CaptureResult.</p> * + * @see CaptureRequest#CONTROL_MODE + * @see CameraCharacteristics#FLASH_INFO_AVAILABLE + * @see CaptureRequest#FLASH_MODE * @see CaptureRequest#SENSOR_EXPOSURE_TIME * @see CaptureRequest#SENSOR_FRAME_DURATION * @see CaptureRequest#SENSOR_SENSITIVITY - * @see CaptureRequest#FLASH_MODE - * @see CameraCharacteristics#FLASH_INFO_AVAILABLE - * @see CaptureRequest#CONTROL_MODE * @see #CONTROL_AE_MODE_OFF * @see #CONTROL_AE_MODE_ON * @see #CONTROL_AE_MODE_ON_AUTO_FLASH @@ -486,8 +486,8 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AE_REGIONS = new Key<int[]>("android.control.aeRegions", int[].class); @@ -504,15 +504,17 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { new Key<int[]>("android.control.aeTargetFpsRange", int[].class); /** - * <p>Whether the HAL must trigger precapture - * metering.</p> + * <p>Whether the camera device will trigger a precapture + * metering sequence when it processes this request.</p> * <p>This entry is normally set to IDLE, or is not * included at all in the request settings. When included and - * set to START, the HAL must trigger the autoexposure + * set to START, the camera device will trigger the autoexposure * precapture metering sequence.</p> * <p>The effect of AE precapture trigger depends on the current - * AE mode and state; see the camera HAL device v3 header for - * details.</p> + * AE mode and state; see {@link CaptureResult#CONTROL_AE_STATE android.control.aeState} for AE precapture + * state transition details.</p> + * + * @see CaptureResult#CONTROL_AE_STATE * @see #CONTROL_AE_PRECAPTURE_TRIGGER_IDLE * @see #CONTROL_AE_PRECAPTURE_TRIGGER_START */ @@ -556,21 +558,23 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AF_REGIONS = new Key<int[]>("android.control.afRegions", int[].class); /** - * <p>Whether the HAL must trigger autofocus.</p> + * <p>Whether the camera device will trigger autofocus for this request.</p> * <p>This entry is normally set to IDLE, or is not * included at all in the request settings.</p> - * <p>When included and set to START, the HAL must trigger the - * autofocus algorithm. The effect of AF trigger depends on the - * current AF mode and state; see the camera HAL device v3 - * header for details. When set to CANCEL, the HAL must cancel - * any active trigger, and return to initial AF state.</p> + * <p>When included and set to START, the camera device will trigger the + * autofocus algorithm. If autofocus is disabled, this trigger has no effect.</p> + * <p>When set to CANCEL, the camera device will cancel any active trigger, + * and return to its initial AF state.</p> + * <p>See {@link CaptureResult#CONTROL_AF_STATE android.control.afState} for what that means for each AF mode.</p> + * + * @see CaptureResult#CONTROL_AF_STATE * @see #CONTROL_AF_TRIGGER_IDLE * @see #CONTROL_AF_TRIGGER_START * @see #CONTROL_AF_TRIGGER_CANCEL @@ -605,10 +609,10 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * routine is disabled. The camera device uses each particular illumination * target for white balance adjustment.</p> * - * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM + * @see CaptureRequest#COLOR_CORRECTION_GAINS * @see CaptureRequest#COLOR_CORRECTION_MODE + * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#CONTROL_MODE - * @see CaptureRequest#COLOR_CORRECTION_GAINS * @see #CONTROL_AWB_MODE_OFF * @see #CONTROL_AWB_MODE_AUTO * @see #CONTROL_AWB_MODE_INCANDESCENT @@ -641,8 +645,8 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AWB_REGIONS = new Key<int[]>("android.control.awbRegions", int[].class); @@ -686,14 +690,14 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * <p>Overall mode of 3A control * routines</p> * <p>High-level 3A control. When set to OFF, all 3A control - * by the HAL is disabled. The application must set the fields for + * by the camera device is disabled. The application must set the fields for * capture parameters itself.</p> * <p>When set to AUTO, the individual algorithm controls in * android.control.* are in effect, such as {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}.</p> * <p>When set to USE_SCENE_MODE, the individual controls in - * android.control.* are mostly disabled, and the HAL implements + * android.control.* are mostly disabled, and the camera device implements * one of the scene mode settings (such as ACTION, SUNSET, or PARTY) - * as it wishes. The HAL scene mode 3A settings are provided by + * as it wishes. The camera device scene mode 3A settings are provided by * android.control.sceneModeOverrides.</p> * * @see CaptureRequest#CONTROL_AF_MODE @@ -747,10 +751,10 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * enhancement</p> * <p>Edge/sharpness/detail enhancement. OFF means no * enhancement will be applied by the HAL.</p> - * <p>FAST/HIGH_QUALITY both mean HAL-determined enhancement + * <p>FAST/HIGH_QUALITY both mean camera device determined enhancement * will be applied. HIGH_QUALITY mode indicates that the - * HAL should use the highest-quality enhancement algorithms, - * even if it slows down capture rate. FAST means the HAL should + * camera device will use the highest-quality enhancement algorithms, + * even if it slows down capture rate. FAST means the camera device will * not slow down capture rate when applying edge enhancement.</p> * @see #EDGE_MODE_OFF * @see #EDGE_MODE_FAST @@ -813,8 +817,8 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { /** * <p>Resolution of embedded JPEG thumbnail</p> - * <p>When set to (0, 0) value, the JPEG EXIF must not contain thumbnail, - * but the captured JPEG must still be a valid image.</p> + * <p>When set to (0, 0) value, the JPEG EXIF will not contain thumbnail, + * but the captured JPEG will still be a valid image.</p> * <p>When a jpeg image capture is issued, the thumbnail size selected should have * the same aspect ratio as the jpeg image.</p> */ @@ -839,10 +843,10 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * auto-exposure algorithm, the overridden values are then provided * back to the user in the corresponding result.</p> * + * @see CaptureRequest#CONTROL_AE_MODE * @see CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES * @see CaptureRequest#SENSOR_EXPOSURE_TIME * @see CaptureRequest#SENSOR_SENSITIVITY - * @see CaptureRequest#CONTROL_AE_MODE */ public static final Key<Float> LENS_APERTURE = new Key<Float>("android.lens.aperture", float.class); @@ -887,10 +891,10 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * algorithm</p> * <p>Noise filtering control. OFF means no noise reduction * will be applied by the HAL.</p> - * <p>FAST/HIGH_QUALITY both mean HAL-determined noise filtering - * will be applied. HIGH_QUALITY mode indicates that the HAL - * should use the highest-quality noise filtering algorithms, - * even if it slows down capture rate. FAST means the HAL should not + * <p>FAST/HIGH_QUALITY both mean camera device determined noise filtering + * will be applied. HIGH_QUALITY mode indicates that the camera device + * will use the highest-quality noise filtering algorithms, + * even if it slows down capture rate. FAST means the camera device should not * slow down capture rate when applying noise filtering.</p> * @see #NOISE_REDUCTION_MODE_OFF * @see #NOISE_REDUCTION_MODE_FAST @@ -1009,8 +1013,8 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is CONTRAST_CURVE.</p> * <p>See {@link CaptureRequest#TONEMAP_CURVE_RED android.tonemap.curveRed} for more details.</p> * - * @see CaptureRequest#TONEMAP_MODE * @see CaptureRequest#TONEMAP_CURVE_RED + * @see CaptureRequest#TONEMAP_MODE */ public static final Key<float[]> TONEMAP_CURVE_BLUE = new Key<float[]>("android.tonemap.curveBlue", float[].class); @@ -1022,8 +1026,8 @@ public final class CaptureRequest extends CameraMetadata implements Parcelable { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is CONTRAST_CURVE.</p> * <p>See {@link CaptureRequest#TONEMAP_CURVE_RED android.tonemap.curveRed} for more details.</p> * - * @see CaptureRequest#TONEMAP_MODE * @see CaptureRequest#TONEMAP_CURVE_RED + * @see CaptureRequest#TONEMAP_MODE */ public static final Key<float[]> TONEMAP_CURVE_GREEN = new Key<float[]>("android.tonemap.curveGreen", float[].class); diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index d23eafa9eeaa..99ae161ec0a6 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -195,12 +195,12 @@ public final class CaptureResult extends CameraMetadata { * fields for a given capture will be available in its * CaptureResult.</p> * + * @see CaptureRequest#CONTROL_MODE + * @see CameraCharacteristics#FLASH_INFO_AVAILABLE + * @see CaptureRequest#FLASH_MODE * @see CaptureRequest#SENSOR_EXPOSURE_TIME * @see CaptureRequest#SENSOR_FRAME_DURATION * @see CaptureRequest#SENSOR_SENSITIVITY - * @see CaptureRequest#FLASH_MODE - * @see CameraCharacteristics#FLASH_INFO_AVAILABLE - * @see CaptureRequest#CONTROL_MODE * @see #CONTROL_AE_MODE_OFF * @see #CONTROL_AE_MODE_ON * @see #CONTROL_AE_MODE_ON_AUTO_FLASH @@ -228,17 +228,152 @@ public final class CaptureResult extends CameraMetadata { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AE_REGIONS = new Key<int[]>("android.control.aeRegions", int[].class); /** * <p>Current state of AE algorithm</p> - * <p>Whenever the AE algorithm state changes, a - * MSG_AUTOEXPOSURE notification must be send if a - * notification callback is registered.</p> + * <p>Switching between or enabling AE modes ({@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode}) always + * resets the AE state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, + * or {@link CaptureRequest#CONTROL_SCENE_MODE android.control.sceneMode} if <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code> resets all + * the algorithm states to INACTIVE.</p> + * <p>The camera device can do several state transitions between two results, if it is + * allowed by the state transition table. For example: INACTIVE may never actually be + * seen in a result.</p> + * <p>The state in the result is the state for this image (in sync with this image): if + * AE state becomes CONVERGED, then the image data associated with this result should + * be good to use.</p> + * <p>Below are state transition tables for different AE modes.</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center"></td> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device auto exposure algorithm is disabled</td> + * </tr> + * </tbody> + * </table> + * <p>When {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} is AE_MODE_ON_*:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device initiates AE scan</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values changing</td> + * </tr> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">SEARCHING</td> + * <td align="center">Camera device finishes AE scan</td> + * <td align="center">CONVERGED</td> + * <td align="center">Good values, not changing</td> + * </tr> + * <tr> + * <td align="center">SEARCHING</td> + * <td align="center">Camera device finishes AE scan</td> + * <td align="center">FLASH_REQUIRED</td> + * <td align="center">Converged but too dark w/o flash</td> + * </tr> + * <tr> + * <td align="center">SEARCHING</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">CONVERGED</td> + * <td align="center">Camera device initiates AE scan</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values changing</td> + * </tr> + * <tr> + * <td align="center">CONVERGED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">FLASH_REQUIRED</td> + * <td align="center">Camera device initiates AE scan</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values changing</td> + * </tr> + * <tr> + * <td align="center">FLASH_REQUIRED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">LOCKED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values not good after unlock</td> + * </tr> + * <tr> + * <td align="center">LOCKED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td align="center">CONVERGED</td> + * <td align="center">Values good after unlock</td> + * </tr> + * <tr> + * <td align="center">LOCKED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td align="center">FLASH_REQUIRED</td> + * <td align="center">Exposure good, but too dark</td> + * </tr> + * <tr> + * <td align="center">PRECAPTURE</td> + * <td align="center">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is OFF</td> + * <td align="center">CONVERGED</td> + * <td align="center">Ready for high-quality capture</td> + * </tr> + * <tr> + * <td align="center">PRECAPTURE</td> + * <td align="center">Sequence done. {@link CaptureRequest#CONTROL_AE_LOCK android.control.aeLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Ready for high-quality capture</td> + * </tr> + * <tr> + * <td align="center">Any state</td> + * <td align="center">{@link CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER android.control.aePrecaptureTrigger} is START</td> + * <td align="center">PRECAPTURE</td> + * <td align="center">Start AE precapture metering sequence</td> + * </tr> + * </tbody> + * </table> + * + * @see CaptureRequest#CONTROL_AE_LOCK + * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER + * @see CaptureRequest#CONTROL_MODE + * @see CaptureRequest#CONTROL_SCENE_MODE * @see #CONTROL_AE_STATE_INACTIVE * @see #CONTROL_AE_STATE_SEARCHING * @see #CONTROL_AE_STATE_CONVERGED @@ -286,17 +421,321 @@ public final class CaptureResult extends CameraMetadata { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AF_REGIONS = new Key<int[]>("android.control.afRegions", int[].class); /** * <p>Current state of AF algorithm</p> - * <p>Whenever the AF algorithm state changes, a - * MSG_AUTOFOCUS notification must be send if a notification - * callback is registered.</p> + * <p>Switching between or enabling AF modes ({@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}) always + * resets the AF state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, + * or {@link CaptureRequest#CONTROL_SCENE_MODE android.control.sceneMode} if <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code> resets all + * the algorithm states to INACTIVE.</p> + * <p>The camera device can do several state transitions between two results, if it is + * allowed by the state transition table. For example: INACTIVE may never actually be + * seen in a result.</p> + * <p>The state in the result is the state for this image (in sync with this image): if + * AF state becomes FOCUSED, then the image data associated with this result should + * be sharp.</p> + * <p>Below are state transition tables for different AF modes.</p> + * <p>When {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} is AF_MODE_OFF or AF_MODE_EDOF:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center"></td> + * <td align="center">INACTIVE</td> + * <td align="center">Never changes</td> + * </tr> + * </tbody> + * </table> + * <p>When {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} is AF_MODE_AUTO or AF_MODE_MACRO:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">Start AF sweep, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">AF sweep done</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">Focused, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">AF sweep done</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">Not focused, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Cancel/reset AF, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Cancel/reset AF</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">Start new sweep, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Cancel/reset AF</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">ACTIVE_SCAN</td> + * <td align="center">Start new sweep, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">Any state</td> + * <td align="center">Mode change</td> + * <td align="center">INACTIVE</td> + * <td align="center"></td> + * </tr> + * </tbody> + * </table> + * <p>When {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} is AF_MODE_CONTINUOUS_VIDEO:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF state query, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Camera device completes current scan</td> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">End AF scan, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Camera device fails current scan</td> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">End AF scan, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. If focus is good, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. if focus is bad, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Reset lens position, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. Lens now locked</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">No effect</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Restart AF scan</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">No effect</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Restart AF scan</td> + * </tr> + * </tbody> + * </table> + * <p>When {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode} is AF_MODE_CONTINUOUS_PICTURE:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF state query, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Camera device completes current scan</td> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">End AF scan, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Camera device fails current scan</td> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">End AF scan, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">Eventual trans. once focus good, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">Eventual trans. if cannot focus, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Reset lens position, Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">Camera device initiates new scan</td> + * <td align="center">PASSIVE_SCAN</td> + * <td align="center">Start AF scan, Lens now moving</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_FOCUSED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. Lens now locked</td> + * </tr> + * <tr> + * <td align="center">PASSIVE_UNFOCUSED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">Immediate trans. Lens now locked</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">No effect</td> + * </tr> + * <tr> + * <td align="center">FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Restart AF scan</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_TRIGGER</td> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">No effect</td> + * </tr> + * <tr> + * <td align="center">NOT_FOCUSED_LOCKED</td> + * <td align="center">AF_CANCEL</td> + * <td align="center">INACTIVE</td> + * <td align="center">Restart AF scan</td> + * </tr> + * </tbody> + * </table> + * + * @see CaptureRequest#CONTROL_AF_MODE + * @see CaptureRequest#CONTROL_MODE + * @see CaptureRequest#CONTROL_SCENE_MODE * @see #CONTROL_AF_STATE_INACTIVE * @see #CONTROL_AF_STATE_PASSIVE_SCAN * @see #CONTROL_AF_STATE_PASSIVE_FOCUSED @@ -336,10 +775,10 @@ public final class CaptureResult extends CameraMetadata { * routine is disabled. The camera device uses each particular illumination * target for white balance adjustment.</p> * - * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM + * @see CaptureRequest#COLOR_CORRECTION_GAINS * @see CaptureRequest#COLOR_CORRECTION_MODE + * @see CaptureRequest#COLOR_CORRECTION_TRANSFORM * @see CaptureRequest#CONTROL_MODE - * @see CaptureRequest#COLOR_CORRECTION_GAINS * @see #CONTROL_AWB_MODE_OFF * @see #CONTROL_AWB_MODE_AUTO * @see #CONTROL_AWB_MODE_INCANDESCENT @@ -372,17 +811,110 @@ public final class CaptureResult extends CameraMetadata { * should ignore the sections outside the region and output the * used sections in the frame metadata</p> * - * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CaptureRequest#SCALER_CROP_REGION + * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE */ public static final Key<int[]> CONTROL_AWB_REGIONS = new Key<int[]>("android.control.awbRegions", int[].class); /** * <p>Current state of AWB algorithm</p> - * <p>Whenever the AWB algorithm state changes, a - * MSG_AUTOWHITEBALANCE notification must be send if a - * notification callback is registered.</p> + * <p>Switching between or enabling AWB modes ({@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode}) always + * resets the AWB state to INACTIVE. Similarly, switching between {@link CaptureRequest#CONTROL_MODE android.control.mode}, + * or {@link CaptureRequest#CONTROL_SCENE_MODE android.control.sceneMode} if <code>{@link CaptureRequest#CONTROL_MODE android.control.mode} == USE_SCENE_MODE</code> resets all + * the algorithm states to INACTIVE.</p> + * <p>The camera device can do several state transitions between two results, if it is + * allowed by the state transition table. So INACTIVE may never actually be seen in + * a result.</p> + * <p>The state in the result is the state for this image (in sync with this image): if + * AWB state becomes CONVERGED, then the image data associated with this result should + * be good to use.</p> + * <p>Below are state transition tables for different AWB modes.</p> + * <p>When <code>{@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode} != AWB_MODE_AUTO</code>:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center"></td> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device auto white balance algorithm is disabled</td> + * </tr> + * </tbody> + * </table> + * <p>When {@link CaptureRequest#CONTROL_AWB_MODE android.control.awbMode} is AWB_MODE_AUTO:</p> + * <table> + * <thead> + * <tr> + * <th align="center">State</th> + * <th align="center">Transition Cause</th> + * <th align="center">New State</th> + * <th align="center">Notes</th> + * </tr> + * </thead> + * <tbody> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">Camera device initiates AWB scan</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values changing</td> + * </tr> + * <tr> + * <td align="center">INACTIVE</td> + * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">SEARCHING</td> + * <td align="center">Camera device finishes AWB scan</td> + * <td align="center">CONVERGED</td> + * <td align="center">Good values, not changing</td> + * </tr> + * <tr> + * <td align="center">SEARCHING</td> + * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">CONVERGED</td> + * <td align="center">Camera device initiates AWB scan</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values changing</td> + * </tr> + * <tr> + * <td align="center">CONVERGED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is ON</td> + * <td align="center">LOCKED</td> + * <td align="center">Values locked</td> + * </tr> + * <tr> + * <td align="center">LOCKED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> + * <td align="center">SEARCHING</td> + * <td align="center">Values not good after unlock</td> + * </tr> + * <tr> + * <td align="center">LOCKED</td> + * <td align="center">{@link CaptureRequest#CONTROL_AWB_LOCK android.control.awbLock} is OFF</td> + * <td align="center">CONVERGED</td> + * <td align="center">Values good after unlock</td> + * </tr> + * </tbody> + * </table> + * + * @see CaptureRequest#CONTROL_AWB_LOCK + * @see CaptureRequest#CONTROL_AWB_MODE + * @see CaptureRequest#CONTROL_MODE + * @see CaptureRequest#CONTROL_SCENE_MODE * @see #CONTROL_AWB_STATE_INACTIVE * @see #CONTROL_AWB_STATE_SEARCHING * @see #CONTROL_AWB_STATE_CONVERGED @@ -395,14 +927,14 @@ public final class CaptureResult extends CameraMetadata { * <p>Overall mode of 3A control * routines</p> * <p>High-level 3A control. When set to OFF, all 3A control - * by the HAL is disabled. The application must set the fields for + * by the camera device is disabled. The application must set the fields for * capture parameters itself.</p> * <p>When set to AUTO, the individual algorithm controls in * android.control.* are in effect, such as {@link CaptureRequest#CONTROL_AF_MODE android.control.afMode}.</p> * <p>When set to USE_SCENE_MODE, the individual controls in - * android.control.* are mostly disabled, and the HAL implements + * android.control.* are mostly disabled, and the camera device implements * one of the scene mode settings (such as ACTION, SUNSET, or PARTY) - * as it wishes. The HAL scene mode 3A settings are provided by + * as it wishes. The camera device scene mode 3A settings are provided by * android.control.sceneModeOverrides.</p> * * @see CaptureRequest#CONTROL_AF_MODE @@ -418,10 +950,10 @@ public final class CaptureResult extends CameraMetadata { * enhancement</p> * <p>Edge/sharpness/detail enhancement. OFF means no * enhancement will be applied by the HAL.</p> - * <p>FAST/HIGH_QUALITY both mean HAL-determined enhancement + * <p>FAST/HIGH_QUALITY both mean camera device determined enhancement * will be applied. HIGH_QUALITY mode indicates that the - * HAL should use the highest-quality enhancement algorithms, - * even if it slows down capture rate. FAST means the HAL should + * camera device will use the highest-quality enhancement algorithms, + * even if it slows down capture rate. FAST means the camera device will * not slow down capture rate when applying edge enhancement.</p> * @see #EDGE_MODE_OFF * @see #EDGE_MODE_FAST @@ -495,8 +1027,8 @@ public final class CaptureResult extends CameraMetadata { /** * <p>Resolution of embedded JPEG thumbnail</p> - * <p>When set to (0, 0) value, the JPEG EXIF must not contain thumbnail, - * but the captured JPEG must still be a valid image.</p> + * <p>When set to (0, 0) value, the JPEG EXIF will not contain thumbnail, + * but the captured JPEG will still be a valid image.</p> * <p>When a jpeg image capture is issued, the thumbnail size selected should have * the same aspect ratio as the jpeg image.</p> */ @@ -521,10 +1053,10 @@ public final class CaptureResult extends CameraMetadata { * auto-exposure algorithm, the overridden values are then provided * back to the user in the corresponding result.</p> * + * @see CaptureRequest#CONTROL_AE_MODE * @see CameraCharacteristics#LENS_INFO_AVAILABLE_APERTURES - * @see CaptureRequest#SENSOR_SENSITIVITY * @see CaptureRequest#SENSOR_EXPOSURE_TIME - * @see CaptureRequest#CONTROL_AE_MODE + * @see CaptureRequest#SENSOR_SENSITIVITY */ public static final Key<Float> LENS_APERTURE = new Key<Float>("android.lens.aperture", float.class); @@ -585,10 +1117,10 @@ public final class CaptureResult extends CameraMetadata { * algorithm</p> * <p>Noise filtering control. OFF means no noise reduction * will be applied by the HAL.</p> - * <p>FAST/HIGH_QUALITY both mean HAL-determined noise filtering - * will be applied. HIGH_QUALITY mode indicates that the HAL - * should use the highest-quality noise filtering algorithms, - * even if it slows down capture rate. FAST means the HAL should not + * <p>FAST/HIGH_QUALITY both mean camera device determined noise filtering + * will be applied. HIGH_QUALITY mode indicates that the camera device + * will use the highest-quality noise filtering algorithms, + * even if it slows down capture rate. FAST means the camera device should not * slow down capture rate when applying noise filtering.</p> * @see #NOISE_REDUCTION_MODE_OFF * @see #NOISE_REDUCTION_MODE_FAST @@ -819,8 +1351,8 @@ public final class CaptureResult extends CameraMetadata { * <p><img alt="Image of a uniform white wall (inverse shading map)" src="../../../../images/camera2/metadata/android.statistics.lensShadingMap/inv_shading.png" /></p> * * @see CaptureRequest#COLOR_CORRECTION_MODE - * @see CaptureResult#STATISTICS_LENS_SHADING_MAP * @see CameraCharacteristics#LENS_INFO_SHADING_MAP_SIZE + * @see CaptureResult#STATISTICS_LENS_SHADING_MAP */ public static final Key<float[]> STATISTICS_LENS_SHADING_MAP = new Key<float[]>("android.statistics.lensShadingMap", float[].class); @@ -885,8 +1417,8 @@ public final class CaptureResult extends CameraMetadata { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is CONTRAST_CURVE.</p> * <p>See {@link CaptureRequest#TONEMAP_CURVE_RED android.tonemap.curveRed} for more details.</p> * - * @see CaptureRequest#TONEMAP_MODE * @see CaptureRequest#TONEMAP_CURVE_RED + * @see CaptureRequest#TONEMAP_MODE */ public static final Key<float[]> TONEMAP_CURVE_BLUE = new Key<float[]>("android.tonemap.curveBlue", float[].class); @@ -898,8 +1430,8 @@ public final class CaptureResult extends CameraMetadata { * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is CONTRAST_CURVE.</p> * <p>See {@link CaptureRequest#TONEMAP_CURVE_RED android.tonemap.curveRed} for more details.</p> * - * @see CaptureRequest#TONEMAP_MODE * @see CaptureRequest#TONEMAP_CURVE_RED + * @see CaptureRequest#TONEMAP_MODE */ public static final Key<float[]> TONEMAP_CURVE_GREEN = new Key<float[]>("android.tonemap.curveGreen", float[].class); diff --git a/core/java/android/os/FactoryTest.java b/core/java/android/os/FactoryTest.java index ec996973fdb0..7a252f933446 100644 --- a/core/java/android/os/FactoryTest.java +++ b/core/java/android/os/FactoryTest.java @@ -25,6 +25,20 @@ package android.os; * {@hide} */ public final class FactoryTest { + public static final int FACTORY_TEST_OFF = 0; + public static final int FACTORY_TEST_LOW_LEVEL = 1; + public static final int FACTORY_TEST_HIGH_LEVEL = 2; + + /** + * Gets the current factory test mode. + * + * @return One of: {@link #FACTORY_TEST_OFF}, {@link #FACTORY_TEST_LOW_LEVEL}, + * or {@link #FACTORY_TEST_HIGH_LEVEL}. + */ + public static int getMode() { + return SystemProperties.getInt("ro.factorytest", FACTORY_TEST_OFF); + } + /** * When true, long-press on power should immediately cause the device to * shut down, without prompting the user. diff --git a/core/java/android/os/MemoryFile.java b/core/java/android/os/MemoryFile.java index e8148f7ea1af..ee7a4c664ba6 100644 --- a/core/java/android/os/MemoryFile.java +++ b/core/java/android/os/MemoryFile.java @@ -43,19 +43,19 @@ public class MemoryFile private static native FileDescriptor native_open(String name, int length) throws IOException; // returns memory address for ashmem region - private static native int native_mmap(FileDescriptor fd, int length, int mode) + private static native long native_mmap(FileDescriptor fd, int length, int mode) throws IOException; - private static native void native_munmap(int addr, int length) throws IOException; + private static native void native_munmap(long addr, int length) throws IOException; private static native void native_close(FileDescriptor fd); - private static native int native_read(FileDescriptor fd, int address, byte[] buffer, + private static native int native_read(FileDescriptor fd, long address, byte[] buffer, int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException; - private static native void native_write(FileDescriptor fd, int address, byte[] buffer, + private static native void native_write(FileDescriptor fd, long address, byte[] buffer, int srcOffset, int destOffset, int count, boolean isUnpinned) throws IOException; private static native void native_pin(FileDescriptor fd, boolean pin) throws IOException; private static native int native_get_size(FileDescriptor fd) throws IOException; private FileDescriptor mFD; // ashmem file descriptor - private int mAddress; // address of ashmem memory + private long mAddress; // address of ashmem memory private int mLength; // total length of our ashmem region private boolean mAllowPurging = false; // true if our ashmem region is unpinned diff --git a/core/java/android/os/MessageQueue.java b/core/java/android/os/MessageQueue.java index e90a457c034a..7ca5d498ae5c 100644 --- a/core/java/android/os/MessageQueue.java +++ b/core/java/android/os/MessageQueue.java @@ -35,7 +35,7 @@ public final class MessageQueue { private final boolean mQuitAllowed; @SuppressWarnings("unused") - private int mPtr; // used by native code + private long mPtr; // used by native code Message mMessages; private final ArrayList<IdleHandler> mIdleHandlers = new ArrayList<IdleHandler>(); @@ -49,11 +49,11 @@ public final class MessageQueue { // Barriers are indicated by messages with a null target whose arg1 field carries the token. private int mNextBarrierToken; - private native static int nativeInit(); - private native static void nativeDestroy(int ptr); - private native static void nativePollOnce(int ptr, int timeoutMillis); - private native static void nativeWake(int ptr); - private native static boolean nativeIsIdling(int ptr); + private native static long nativeInit(); + private native static void nativeDestroy(long ptr); + private native static void nativePollOnce(long ptr, int timeoutMillis); + private native static void nativeWake(long ptr); + private native static boolean nativeIsIdling(long ptr); /** * Callback interface for discovering when a thread is going to block @@ -129,7 +129,7 @@ public final class MessageQueue { // Return here if the message loop has already quit and been disposed. // This can happen if the application tries to restart a looper after quit // which is not supported. - final int ptr = mPtr; + final long ptr = mPtr; if (ptr == 0) { return null; } diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 5e0d48949c22..3a9611e4fcd9 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -290,6 +290,18 @@ public final class PowerManager { */ public static final int GO_TO_SLEEP_REASON_TIMEOUT = 2; + /** + * The value to pass as the 'reason' argument to reboot() to + * reboot into recovery mode (for applying system updates, doing + * factory resets, etc.). + * <p> + * Requires the {@link android.Manifest.permission#RECOVERY} + * permission (in addition to + * {@link android.Manifest.permission#REBOOT}). + * </p> + */ + public static final String REBOOT_RECOVERY = "recovery"; + final Context mContext; final IPowerManager mService; final Handler mHandler; diff --git a/core/java/android/os/PowerManagerInternal.java b/core/java/android/os/PowerManagerInternal.java new file mode 100644 index 000000000000..8144576a5cb4 --- /dev/null +++ b/core/java/android/os/PowerManagerInternal.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.os; + +import android.view.WindowManagerPolicy; + +/** + * Power manager local system service interface. + * + * @hide Only for use within the system server. + */ +public interface PowerManagerInternal { + /** + * Used by the window manager to override the screen brightness based on the + * current foreground activity. + * + * This method must only be called by the window manager. + * + * @param brightness The overridden brightness, or -1 to disable the override. + */ + public void setScreenBrightnessOverrideFromWindowManager(int brightness); + + /** + * Used by the window manager to override the button brightness based on the + * current foreground activity. + * + * This method must only be called by the window manager. + * + * @param brightness The overridden brightness, or -1 to disable the override. + */ + public void setButtonBrightnessOverrideFromWindowManager(int brightness); + + /** + * Used by the window manager to override the user activity timeout based on the + * current foreground activity. It can only be used to make the timeout shorter + * than usual, not longer. + * + * This method must only be called by the window manager. + * + * @param timeoutMillis The overridden timeout, or -1 to disable the override. + */ + public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis); + + // TODO: Remove this and retrieve as a local service instead. + public void setPolicy(WindowManagerPolicy policy); +} diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index d794ca674d49..ea71ad8c0563 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -1449,7 +1449,11 @@ public final class StrictMode { if (policy.classInstanceLimit.size() == 0) { return; } - Runtime.getRuntime().gc(); + + System.gc(); + System.runFinalization(); + System.gc(); + // Note: classInstanceLimit is immutable, so this is lock-free for (Map.Entry<Class, Integer> entry : policy.classInstanceLimit.entrySet()) { Class klass = entry.getKey(); @@ -2005,7 +2009,10 @@ public final class StrictMode { // noticeably less responsive during orientation changes when activities are // being restarted. Granted, it is only a problem when StrictMode is enabled // but it is annoying. - Runtime.getRuntime().gc(); + + System.gc(); + System.runFinalization(); + System.gc(); long instances = VMDebug.countInstancesOfClass(klass, false); if (instances > limit) { diff --git a/core/java/android/speech/srec/MicrophoneInputStream.java b/core/java/android/speech/srec/MicrophoneInputStream.java index fab77a9b8a0a..94db1767a86a 100644 --- a/core/java/android/speech/srec/MicrophoneInputStream.java +++ b/core/java/android/speech/srec/MicrophoneInputStream.java @@ -34,7 +34,7 @@ public final class MicrophoneInputStream extends InputStream { } private final static String TAG = "MicrophoneInputStream"; - private int mAudioRecord = 0; + private long mAudioRecord = 0; private byte[] mOneByte = new byte[1]; /** @@ -102,9 +102,9 @@ public final class MicrophoneInputStream extends InputStream { // // AudioRecord JNI interface // - private static native int AudioRecordNew(int sampleRate, int fifoDepth); - private static native int AudioRecordStart(int audioRecord); - private static native int AudioRecordRead(int audioRecord, byte[] b, int offset, int length) throws IOException; - private static native void AudioRecordStop(int audioRecord) throws IOException; - private static native void AudioRecordDelete(int audioRecord) throws IOException; + private static native long AudioRecordNew(int sampleRate, int fifoDepth); + private static native int AudioRecordStart(long audioRecord); + private static native int AudioRecordRead(long audioRecord, byte[] b, int offset, int length) throws IOException; + private static native void AudioRecordStop(long audioRecord) throws IOException; + private static native void AudioRecordDelete(long audioRecord) throws IOException; } diff --git a/core/java/android/speech/srec/Recognizer.java b/core/java/android/speech/srec/Recognizer.java index 4bdaf5ba2b0a..6c491a028d97 100644 --- a/core/java/android/speech/srec/Recognizer.java +++ b/core/java/android/speech/srec/Recognizer.java @@ -123,10 +123,10 @@ public final class Recognizer { public static final String KEY_MEANING = "meaning"; // handle to SR_Vocabulary object - private int mVocabulary = 0; + private long mVocabulary = 0; // handle to SR_Recognizer object - private int mRecognizer = 0; + private long mRecognizer = 0; // Grammar currently associated with Recognizer via SR_GrammarSetupRecognizer private Grammar mActiveGrammar = null; @@ -172,7 +172,7 @@ public final class Recognizer { * Represents a grammar loaded into the Recognizer. */ public class Grammar { - private int mGrammar = 0; + private long mGrammar = 0; /** * Create a <code>Grammar</code> instance. @@ -601,116 +601,116 @@ public final class Recognizer { // // SR_Recognizer methods // - private static native void SR_RecognizerStart(int recognizer); - private static native void SR_RecognizerStop(int recognizer); - private static native int SR_RecognizerCreate(); - private static native void SR_RecognizerDestroy(int recognizer); - private static native void SR_RecognizerSetup(int recognizer); - private static native void SR_RecognizerUnsetup(int recognizer); - private static native boolean SR_RecognizerIsSetup(int recognizer); - private static native String SR_RecognizerGetParameter(int recognizer, String key); - private static native int SR_RecognizerGetSize_tParameter(int recognizer, String key); - private static native boolean SR_RecognizerGetBoolParameter(int recognizer, String key); - private static native void SR_RecognizerSetParameter(int recognizer, String key, String value); - private static native void SR_RecognizerSetSize_tParameter(int recognizer, + private static native void SR_RecognizerStart(long recognizer); + private static native void SR_RecognizerStop(long recognizer); + private static native long SR_RecognizerCreate(); + private static native void SR_RecognizerDestroy(long recognizer); + private static native void SR_RecognizerSetup(long recognizer); + private static native void SR_RecognizerUnsetup(long recognizer); + private static native boolean SR_RecognizerIsSetup(long recognizer); + private static native String SR_RecognizerGetParameter(long recognizer, String key); + private static native int SR_RecognizerGetSize_tParameter(long recognizer, String key); + private static native boolean SR_RecognizerGetBoolParameter(long recognizer, String key); + private static native void SR_RecognizerSetParameter(long recognizer, String key, String value); + private static native void SR_RecognizerSetSize_tParameter(long recognizer, String key, int value); - private static native void SR_RecognizerSetBoolParameter(int recognizer, String key, + private static native void SR_RecognizerSetBoolParameter(long recognizer, String key, boolean value); - private static native void SR_RecognizerSetupRule(int recognizer, int grammar, + private static native void SR_RecognizerSetupRule(long recognizer, long grammar, String ruleName); - private static native boolean SR_RecognizerHasSetupRules(int recognizer); - private static native void SR_RecognizerActivateRule(int recognizer, int grammar, + private static native boolean SR_RecognizerHasSetupRules(long recognizer); + private static native void SR_RecognizerActivateRule(long recognizer, long grammar, String ruleName, int weight); - private static native void SR_RecognizerDeactivateRule(int recognizer, int grammar, + private static native void SR_RecognizerDeactivateRule(long recognizer, long grammar, String ruleName); - private static native void SR_RecognizerDeactivateAllRules(int recognizer); - private static native boolean SR_RecognizerIsActiveRule(int recognizer, int grammar, + private static native void SR_RecognizerDeactivateAllRules(long recognizer); + private static native boolean SR_RecognizerIsActiveRule(long recognizer, long grammar, String ruleName); - private static native boolean SR_RecognizerCheckGrammarConsistency(int recognizer, - int grammar); - private static native int SR_RecognizerPutAudio(int recognizer, byte[] buffer, int offset, + private static native boolean SR_RecognizerCheckGrammarConsistency(long recognizer, + long grammar); + private static native int SR_RecognizerPutAudio(long recognizer, byte[] buffer, int offset, int length, boolean isLast); - private static native int SR_RecognizerAdvance(int recognizer); - // private static native void SR_RecognizerLoadUtterance(int recognizer, + private static native int SR_RecognizerAdvance(long recognizer); + // private static native void SR_RecognizerLoadUtterance(long recognizer, // const LCHAR* filename); - // private static native void SR_RecognizerLoadWaveFile(int recognizer, + // private static native void SR_RecognizerLoadWaveFile(long recognizer, // const LCHAR* filename); - // private static native void SR_RecognizerSetLockFunction(int recognizer, + // private static native void SR_RecognizerSetLockFunction(long recognizer, // SR_RecognizerLockFunction function, void* data); - private static native boolean SR_RecognizerIsSignalClipping(int recognizer); - private static native boolean SR_RecognizerIsSignalDCOffset(int recognizer); - private static native boolean SR_RecognizerIsSignalNoisy(int recognizer); - private static native boolean SR_RecognizerIsSignalTooQuiet(int recognizer); - private static native boolean SR_RecognizerIsSignalTooFewSamples(int recognizer); - private static native boolean SR_RecognizerIsSignalTooManySamples(int recognizer); + private static native boolean SR_RecognizerIsSignalClipping(long recognizer); + private static native boolean SR_RecognizerIsSignalDCOffset(long recognizer); + private static native boolean SR_RecognizerIsSignalNoisy(long recognizer); + private static native boolean SR_RecognizerIsSignalTooQuiet(long recognizer); + private static native boolean SR_RecognizerIsSignalTooFewSamples(long recognizer); + private static native boolean SR_RecognizerIsSignalTooManySamples(long recognizer); // private static native void SR_Recognizer_Change_Sample_Rate (size_t new_sample_rate); // // SR_AcousticState native methods // - private static native void SR_AcousticStateReset(int recognizer); - private static native void SR_AcousticStateSet(int recognizer, String state); - private static native String SR_AcousticStateGet(int recognizer); + private static native void SR_AcousticStateReset(long recognizer); + private static native void SR_AcousticStateSet(long recognizer, String state); + private static native String SR_AcousticStateGet(long recognizer); // // SR_Grammar native methods // - private static native void SR_GrammarCompile(int grammar); - private static native void SR_GrammarAddWordToSlot(int grammar, String slot, + private static native void SR_GrammarCompile(long grammar); + private static native void SR_GrammarAddWordToSlot(long grammar, String slot, String word, String pronunciation, int weight, String tag); - private static native void SR_GrammarResetAllSlots(int grammar); - // private static native void SR_GrammarAddNametagToSlot(int grammar, String slot, + private static native void SR_GrammarResetAllSlots(long grammar); + // private static native void SR_GrammarAddNametagToSlot(long grammar, String slot, // const struct SR_Nametag_t* nametag, int weight, String tag); - private static native void SR_GrammarSetupVocabulary(int grammar, int vocabulary); - // private static native void SR_GrammarSetupModels(int grammar, SR_AcousticModels* models); - private static native void SR_GrammarSetupRecognizer(int grammar, int recognizer); - private static native void SR_GrammarUnsetupRecognizer(int grammar); - // private static native void SR_GrammarGetModels(int grammar,SR_AcousticModels** models); - private static native int SR_GrammarCreate(); - private static native void SR_GrammarDestroy(int grammar); - private static native int SR_GrammarLoad(String filename); - private static native void SR_GrammarSave(int grammar, String filename); - // private static native void SR_GrammarSetDispatchFunction(int grammar, + private static native void SR_GrammarSetupVocabulary(long grammar, long vocabulary); + // private static native void SR_GrammarSetupModels(long grammar, SR_AcousticModels* models); + private static native void SR_GrammarSetupRecognizer(long grammar, long recognizer); + private static native void SR_GrammarUnsetupRecognizer(long grammar); + // private static native void SR_GrammarGetModels(long grammar,SR_AcousticModels** models); + private static native long SR_GrammarCreate(); + private static native void SR_GrammarDestroy(long grammar); + private static native long SR_GrammarLoad(String filename); + private static native void SR_GrammarSave(long grammar, String filename); + // private static native void SR_GrammarSetDispatchFunction(long grammar, // const LCHAR* name, void* userData, SR_GrammarDispatchFunction function); - // private static native void SR_GrammarSetParameter(int grammar, const + // private static native void SR_GrammarSetParameter(long grammar, const // LCHAR* key, void* value); - // private static native void SR_GrammarSetSize_tParameter(int grammar, + // private static native void SR_GrammarSetSize_tParameter(long grammar, // const LCHAR* key, size_t value); - // private static native void SR_GrammarGetParameter(int grammar, const + // private static native void SR_GrammarGetParameter(long grammar, const // LCHAR* key, void** value); - // private static native void SR_GrammarGetSize_tParameter(int grammar, + // private static native void SR_GrammarGetSize_tParameter(long grammar, // const LCHAR* key, size_t* value); - // private static native void SR_GrammarCheckParse(int grammar, const LCHAR* + // private static native void SR_GrammarCheckParse(long grammar, const LCHAR* // transcription, SR_SemanticResult** result, size_t* resultCount); - private static native void SR_GrammarAllowOnly(int grammar, String transcription); - private static native void SR_GrammarAllowAll(int grammar); + private static native void SR_GrammarAllowOnly(long grammar, String transcription); + private static native void SR_GrammarAllowAll(long grammar); // // SR_Vocabulary native methods // // private static native int SR_VocabularyCreate(); - private static native int SR_VocabularyLoad(); + private static native long SR_VocabularyLoad(); // private static native void SR_VocabularySave(SR_Vocabulary* self, // const LCHAR* filename); // private static native void SR_VocabularyAddWord(SR_Vocabulary* self, // const LCHAR* word); // private static native void SR_VocabularyGetLanguage(SR_Vocabulary* self, // ESR_Locale* locale); - private static native void SR_VocabularyDestroy(int vocabulary); - private static native String SR_VocabularyGetPronunciation(int vocabulary, String word); + private static native void SR_VocabularyDestroy(long vocabulary); + private static native String SR_VocabularyGetPronunciation(long vocabulary, String word); // // SR_RecognizerResult native methods // - private static native byte[] SR_RecognizerResultGetWaveform(int recognizer); - private static native int SR_RecognizerResultGetSize(int recognizer); - private static native int SR_RecognizerResultGetKeyCount(int recognizer, int nbest); - private static native String[] SR_RecognizerResultGetKeyList(int recognizer, int nbest); - private static native String SR_RecognizerResultGetValue(int recognizer, + private static native byte[] SR_RecognizerResultGetWaveform(long recognizer); + private static native int SR_RecognizerResultGetSize(long recognizer); + private static native int SR_RecognizerResultGetKeyCount(long recognizer, int nbest); + private static native String[] SR_RecognizerResultGetKeyList(long recognizer, int nbest); + private static native String SR_RecognizerResultGetValue(long recognizer, int nbest, String key); - // private static native void SR_RecognizerResultGetLocale(int recognizer, ESR_Locale* locale); + // private static native void SR_RecognizerResultGetLocale(long recognizer, ESR_Locale* locale); } diff --git a/core/java/android/view/InputChannel.java b/core/java/android/view/InputChannel.java index 40ee1ad3196a..de195ae524c8 100644 --- a/core/java/android/view/InputChannel.java +++ b/core/java/android/view/InputChannel.java @@ -46,7 +46,7 @@ public final class InputChannel implements Parcelable { }; @SuppressWarnings("unused") - private int mPtr; // used by native code + private long mPtr; // used by native code private static native InputChannel[] nativeOpenInputChannelPair(String name); diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java index 25972e7737a8..91ef50d76180 100644 --- a/core/java/android/view/InputEventReceiver.java +++ b/core/java/android/view/InputEventReceiver.java @@ -34,7 +34,7 @@ public abstract class InputEventReceiver { private final CloseGuard mCloseGuard = CloseGuard.get(); - private int mReceiverPtr; + private long mReceiverPtr; // We keep references to the input channel and message queue objects here so that // they are not GC'd while the native peer of the receiver is using them. @@ -44,11 +44,11 @@ public abstract class InputEventReceiver { // Map from InputEvent sequence numbers to dispatcher sequence numbers. private final SparseIntArray mSeqMap = new SparseIntArray(); - private static native int nativeInit(WeakReference<InputEventReceiver> receiver, + private static native long nativeInit(WeakReference<InputEventReceiver> receiver, InputChannel inputChannel, MessageQueue messageQueue); - private static native void nativeDispose(int receiverPtr); - private static native void nativeFinishInputEvent(int receiverPtr, int seq, boolean handled); - private static native boolean nativeConsumeBatchedInputEvents(int receiverPtr, + private static native void nativeDispose(long receiverPtr); + private static native void nativeFinishInputEvent(long receiverPtr, int seq, boolean handled); + private static native boolean nativeConsumeBatchedInputEvents(long receiverPtr, long frameTimeNanos); /** diff --git a/core/java/android/view/InputEventSender.java b/core/java/android/view/InputEventSender.java index be6a623ae165..304ea3f8bd2b 100644 --- a/core/java/android/view/InputEventSender.java +++ b/core/java/android/view/InputEventSender.java @@ -33,18 +33,18 @@ public abstract class InputEventSender { private final CloseGuard mCloseGuard = CloseGuard.get(); - private int mSenderPtr; + private long mSenderPtr; // We keep references to the input channel and message queue objects here so that // they are not GC'd while the native peer of the receiver is using them. private InputChannel mInputChannel; private MessageQueue mMessageQueue; - private static native int nativeInit(WeakReference<InputEventSender> sender, + private static native long nativeInit(WeakReference<InputEventSender> sender, InputChannel inputChannel, MessageQueue messageQueue); - private static native void nativeDispose(int senderPtr); - private static native boolean nativeSendKeyEvent(int senderPtr, int seq, KeyEvent event); - private static native boolean nativeSendMotionEvent(int senderPtr, int seq, MotionEvent event); + private static native void nativeDispose(long senderPtr); + private static native boolean nativeSendKeyEvent(long senderPtr, int seq, KeyEvent event); + private static native boolean nativeSendMotionEvent(long senderPtr, int seq, MotionEvent event); /** * Creates an input event sender bound to the specified input channel. diff --git a/core/java/android/view/InputQueue.java b/core/java/android/view/InputQueue.java index b552c208dd7c..aebc60152bf0 100644 --- a/core/java/android/view/InputQueue.java +++ b/core/java/android/view/InputQueue.java @@ -22,7 +22,7 @@ import android.os.Looper; import android.os.MessageQueue; import android.util.Pools.Pool; import android.util.Pools.SimplePool; -import android.util.SparseArray; +import android.util.LongSparseArray; import java.lang.ref.WeakReference; @@ -31,20 +31,20 @@ import java.lang.ref.WeakReference; * input events. Currently only usable from native code. */ public final class InputQueue { - private final SparseArray<ActiveInputEvent> mActiveEventArray = - new SparseArray<ActiveInputEvent>(20); + private final LongSparseArray<ActiveInputEvent> mActiveEventArray = + new LongSparseArray<ActiveInputEvent>(20); private final Pool<ActiveInputEvent> mActiveInputEventPool = new SimplePool<ActiveInputEvent>(20); private final CloseGuard mCloseGuard = CloseGuard.get(); - private int mPtr; + private long mPtr; - private static native int nativeInit(WeakReference<InputQueue> weakQueue, + private static native long nativeInit(WeakReference<InputQueue> weakQueue, MessageQueue messageQueue); - private static native int nativeSendKeyEvent(int ptr, KeyEvent e, boolean preDispatch); - private static native int nativeSendMotionEvent(int ptr, MotionEvent e); - private static native void nativeDispose(int ptr); + private static native long nativeSendKeyEvent(long ptr, KeyEvent e, boolean preDispatch); + private static native long nativeSendMotionEvent(long ptr, MotionEvent e); + private static native void nativeDispose(long ptr); /** @hide */ public InputQueue() { @@ -83,7 +83,7 @@ public final class InputQueue { } /** @hide */ - public int getNativePtr() { + public long getNativePtr() { return mPtr; } @@ -91,7 +91,7 @@ public final class InputQueue { public void sendInputEvent(InputEvent e, Object token, boolean predispatch, FinishedInputEventCallback callback) { ActiveInputEvent event = obtainActiveInputEvent(token, callback); - int id; + long id; if (e instanceof KeyEvent) { id = nativeSendKeyEvent(mPtr, (KeyEvent) e, predispatch); } else { @@ -100,7 +100,7 @@ public final class InputQueue { mActiveEventArray.put(id, event); } - private void finishInputEvent(int id, boolean handled) { + private void finishInputEvent(long id, boolean handled) { int index = mActiveEventArray.indexOfKey(id); if (index >= 0) { ActiveInputEvent e = mActiveEventArray.valueAt(index); diff --git a/core/java/android/view/KeyCharacterMap.java b/core/java/android/view/KeyCharacterMap.java index 9e5f25a11a63..55dd6bb64fe6 100644 --- a/core/java/android/view/KeyCharacterMap.java +++ b/core/java/android/view/KeyCharacterMap.java @@ -282,20 +282,20 @@ public class KeyCharacterMap implements Parcelable { } }; - private int mPtr; + private long mPtr; - private static native int nativeReadFromParcel(Parcel in); - private static native void nativeWriteToParcel(int ptr, Parcel out); - private static native void nativeDispose(int ptr); + private static native long nativeReadFromParcel(Parcel in); + private static native void nativeWriteToParcel(long ptr, Parcel out); + private static native void nativeDispose(long ptr); - private static native char nativeGetCharacter(int ptr, int keyCode, int metaState); - private static native boolean nativeGetFallbackAction(int ptr, int keyCode, int metaState, + private static native char nativeGetCharacter(long ptr, int keyCode, int metaState); + private static native boolean nativeGetFallbackAction(long ptr, int keyCode, int metaState, FallbackAction outFallbackAction); - private static native char nativeGetNumber(int ptr, int keyCode); - private static native char nativeGetMatch(int ptr, int keyCode, char[] chars, int metaState); - private static native char nativeGetDisplayLabel(int ptr, int keyCode); - private static native int nativeGetKeyboardType(int ptr); - private static native KeyEvent[] nativeGetEvents(int ptr, char[] chars); + private static native char nativeGetNumber(long ptr, int keyCode); + private static native char nativeGetMatch(long ptr, int keyCode, char[] chars, int metaState); + private static native char nativeGetDisplayLabel(long ptr, int keyCode); + private static native int nativeGetKeyboardType(long ptr); + private static native KeyEvent[] nativeGetEvents(long ptr, char[] chars); private KeyCharacterMap(Parcel in) { if (in == null) { @@ -308,7 +308,7 @@ public class KeyCharacterMap implements Parcelable { } // Called from native - private KeyCharacterMap(int ptr) { + private KeyCharacterMap(long ptr) { mPtr = ptr; } diff --git a/core/java/android/view/MotionEvent.java b/core/java/android/view/MotionEvent.java index db577f3627cf..ddce3ceef753 100644 --- a/core/java/android/view/MotionEvent.java +++ b/core/java/android/view/MotionEvent.java @@ -1311,63 +1311,63 @@ public final class MotionEvent extends InputEvent implements Parcelable { } // Pointer to the native MotionEvent object that contains the actual data. - private int mNativePtr; + private long mNativePtr; private MotionEvent mNext; - private static native int nativeInitialize(int nativePtr, + private static native long nativeInitialize(long nativePtr, int deviceId, int source, int action, int flags, int edgeFlags, int metaState, int buttonState, float xOffset, float yOffset, float xPrecision, float yPrecision, long downTimeNanos, long eventTimeNanos, int pointerCount, PointerProperties[] pointerIds, PointerCoords[] pointerCoords); - private static native int nativeCopy(int destNativePtr, int sourceNativePtr, + private static native long nativeCopy(long destNativePtr, long sourceNativePtr, boolean keepHistory); - private static native void nativeDispose(int nativePtr); - private static native void nativeAddBatch(int nativePtr, long eventTimeNanos, + private static native void nativeDispose(long nativePtr); + private static native void nativeAddBatch(long nativePtr, long eventTimeNanos, PointerCoords[] pointerCoords, int metaState); - private static native int nativeGetDeviceId(int nativePtr); - private static native int nativeGetSource(int nativePtr); - private static native int nativeSetSource(int nativePtr, int source); - private static native int nativeGetAction(int nativePtr); - private static native void nativeSetAction(int nativePtr, int action); - private static native boolean nativeIsTouchEvent(int nativePtr); - private static native int nativeGetFlags(int nativePtr); - private static native void nativeSetFlags(int nativePtr, int flags); - private static native int nativeGetEdgeFlags(int nativePtr); - private static native void nativeSetEdgeFlags(int nativePtr, int action); - private static native int nativeGetMetaState(int nativePtr); - private static native int nativeGetButtonState(int nativePtr); - private static native void nativeOffsetLocation(int nativePtr, float deltaX, float deltaY); - private static native float nativeGetXOffset(int nativePtr); - private static native float nativeGetYOffset(int nativePtr); - private static native float nativeGetXPrecision(int nativePtr); - private static native float nativeGetYPrecision(int nativePtr); - private static native long nativeGetDownTimeNanos(int nativePtr); - private static native void nativeSetDownTimeNanos(int nativePtr, long downTime); - - private static native int nativeGetPointerCount(int nativePtr); - private static native int nativeGetPointerId(int nativePtr, int pointerIndex); - private static native int nativeGetToolType(int nativePtr, int pointerIndex); - private static native int nativeFindPointerIndex(int nativePtr, int pointerId); - - private static native int nativeGetHistorySize(int nativePtr); - private static native long nativeGetEventTimeNanos(int nativePtr, int historyPos); - private static native float nativeGetRawAxisValue(int nativePtr, + private static native int nativeGetDeviceId(long nativePtr); + private static native int nativeGetSource(long nativePtr); + private static native int nativeSetSource(long nativePtr, int source); + private static native int nativeGetAction(long nativePtr); + private static native void nativeSetAction(long nativePtr, int action); + private static native boolean nativeIsTouchEvent(long nativePtr); + private static native int nativeGetFlags(long nativePtr); + private static native void nativeSetFlags(long nativePtr, int flags); + private static native int nativeGetEdgeFlags(long nativePtr); + private static native void nativeSetEdgeFlags(long nativePtr, int action); + private static native int nativeGetMetaState(long nativePtr); + private static native int nativeGetButtonState(long nativePtr); + private static native void nativeOffsetLocation(long nativePtr, float deltaX, float deltaY); + private static native float nativeGetXOffset(long nativePtr); + private static native float nativeGetYOffset(long nativePtr); + private static native float nativeGetXPrecision(long nativePtr); + private static native float nativeGetYPrecision(long nativePtr); + private static native long nativeGetDownTimeNanos(long nativePtr); + private static native void nativeSetDownTimeNanos(long nativePtr, long downTime); + + private static native int nativeGetPointerCount(long nativePtr); + private static native int nativeGetPointerId(long nativePtr, int pointerIndex); + private static native int nativeGetToolType(long nativePtr, int pointerIndex); + private static native int nativeFindPointerIndex(long nativePtr, int pointerId); + + private static native int nativeGetHistorySize(long nativePtr); + private static native long nativeGetEventTimeNanos(long nativePtr, int historyPos); + private static native float nativeGetRawAxisValue(long nativePtr, int axis, int pointerIndex, int historyPos); - private static native float nativeGetAxisValue(int nativePtr, + private static native float nativeGetAxisValue(long nativePtr, int axis, int pointerIndex, int historyPos); - private static native void nativeGetPointerCoords(int nativePtr, + private static native void nativeGetPointerCoords(long nativePtr, int pointerIndex, int historyPos, PointerCoords outPointerCoords); - private static native void nativeGetPointerProperties(int nativePtr, + private static native void nativeGetPointerProperties(long nativePtr, int pointerIndex, PointerProperties outPointerProperties); - private static native void nativeScale(int nativePtr, float scale); - private static native void nativeTransform(int nativePtr, Matrix matrix); + private static native void nativeScale(long nativePtr, float scale); + private static native void nativeTransform(long nativePtr, Matrix matrix); - private static native int nativeReadFromParcel(int nativePtr, Parcel parcel); - private static native void nativeWriteToParcel(int nativePtr, Parcel parcel); + private static native long nativeReadFromParcel(long nativePtr, Parcel parcel); + private static native void nativeWriteToParcel(long nativePtr, Parcel parcel); private MotionEvent() { } diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java index eb81f72ea9c9..22b5ccacf43a 100644 --- a/core/java/android/view/VelocityTracker.java +++ b/core/java/android/view/VelocityTracker.java @@ -34,17 +34,17 @@ public final class VelocityTracker { private static final int ACTIVE_POINTER_ID = -1; - private int mPtr; + private long mPtr; private final String mStrategy; - private static native int nativeInitialize(String strategy); - private static native void nativeDispose(int ptr); - private static native void nativeClear(int ptr); - private static native void nativeAddMovement(int ptr, MotionEvent event); - private static native void nativeComputeCurrentVelocity(int ptr, int units, float maxVelocity); - private static native float nativeGetXVelocity(int ptr, int id); - private static native float nativeGetYVelocity(int ptr, int id); - private static native boolean nativeGetEstimator(int ptr, int id, Estimator outEstimator); + private static native long nativeInitialize(String strategy); + private static native void nativeDispose(long ptr); + private static native void nativeClear(long ptr); + private static native void nativeAddMovement(long ptr, MotionEvent event); + private static native void nativeComputeCurrentVelocity(long ptr, int units, float maxVelocity); + private static native float nativeGetXVelocity(long ptr, int id); + private static native float nativeGetYVelocity(long ptr, int id); + private static native boolean nativeGetEstimator(long ptr, int id, Estimator outEstimator); /** * Retrieve a new VelocityTracker object to watch the velocity of a diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index a3826006b7fc..52b1b39d0a7f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -1645,7 +1645,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @see #setTag(Object) * @see #getTag() */ - protected Object mTag; + protected Object mTag = null; // for mPrivateFlags: /** {@hide} */ @@ -16442,7 +16442,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, /** * Returns this view's tag. * - * @return the Object stored in this view as a tag + * @return the Object stored in this view as a tag, or {@code null} if not + * set * * @see #setTag(Object) * @see #getTag(int) @@ -16472,7 +16473,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * * @param key The key identifying the tag * - * @return the Object stored in this view as a tag + * @return the Object stored in this view as a tag, or {@code null} if not + * set * * @see #setTag(int, Object) * @see #getTag() diff --git a/core/java/android/view/inputmethod/BaseInputConnection.java b/core/java/android/view/inputmethod/BaseInputConnection.java index 5552952049fc..cccfa78544e8 100644 --- a/core/java/android/view/inputmethod/BaseInputConnection.java +++ b/core/java/android/view/inputmethod/BaseInputConnection.java @@ -484,10 +484,10 @@ public class BaseInputConnection implements InputConnection { final Editable content = getEditable(); if (content == null) return false; int len = content.length(); - if (start > len || end > len) { + if (start > len || end > len || start < 0 || end < 0) { // If the given selection is out of bounds, just ignore it. // Most likely the text was changed out from under the IME, - // the the IME is going to have to update all of its state + // and the IME is going to have to update all of its state // anyway. return true; } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 4d8975cdcbed..e9107d67597e 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -36,6 +36,7 @@ import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; import android.util.LongSparseArray; +import android.util.MathUtils; import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.StateSet; @@ -60,6 +61,8 @@ import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; import android.view.animation.LinearInterpolator; import android.view.inputmethod.BaseInputConnection; @@ -418,7 +421,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te /** * Handles scrolling between positions within the list. */ - PositionScroller mPositionScroller; + SubPositionScroller mPositionScroller; /** * The offset in pixels form the top of the AdapterView to the top @@ -4840,14 +4843,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ public void smoothScrollToPosition(int position) { if (mPositionScroller == null) { - mPositionScroller = new PositionScroller(); + mPositionScroller = new SubPositionScroller(); } mPositionScroller.start(position); } /** * Smoothly scroll to the specified adapter position. The view will scroll - * such that the indicated position is displayed <code>offset</code> pixels from + * such that the indicated position is displayed <code>offset</code> pixels below * the top edge of the view. If this is impossible, (e.g. the offset would scroll * the first or last item beyond the boundaries of the list) it will get as close * as possible. The scroll will take <code>duration</code> milliseconds to complete. @@ -4859,14 +4862,14 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ public void smoothScrollToPositionFromTop(int position, int offset, int duration) { if (mPositionScroller == null) { - mPositionScroller = new PositionScroller(); + mPositionScroller = new SubPositionScroller(); } mPositionScroller.startWithOffset(position, offset, duration); } /** * Smoothly scroll to the specified adapter position. The view will scroll - * such that the indicated position is displayed <code>offset</code> pixels from + * such that the indicated position is displayed <code>offset</code> pixels below * the top edge of the view. If this is impossible, (e.g. the offset would scroll * the first or last item beyond the boundaries of the list) it will get as close * as possible. @@ -4877,9 +4880,9 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ public void smoothScrollToPositionFromTop(int position, int offset) { if (mPositionScroller == null) { - mPositionScroller = new PositionScroller(); + mPositionScroller = new SubPositionScroller(); } - mPositionScroller.startWithOffset(position, offset); + mPositionScroller.startWithOffset(position, offset, offset); } /** @@ -4893,7 +4896,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te */ public void smoothScrollToPosition(int position, int boundPosition) { if (mPositionScroller == null) { - mPositionScroller = new PositionScroller(); + mPositionScroller = new SubPositionScroller(); } mPositionScroller.start(position, boundPosition); } @@ -6992,4 +6995,311 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te return null; } } + + /** + * Returns the height of a row, which is computed as the maximum height of + * the items in the row. + * + * @param row the row index + * @return row height in pixels + */ + private int getHeightForRow(int row) { + final int firstRowPosition = getFirstPositionForRow(row); + final int lastRowPosition = getFirstPositionForRow(row + 1); + int maxHeight = 0; + for (int i = firstRowPosition; i < lastRowPosition; i++) { + final int height = getHeightForPosition(i); + if (height > maxHeight) { + maxHeight = height; + } + } + return maxHeight; + } + + /** + * Returns the height of the view for the specified position. + * + * @param position the item position + * @return view height in pixels + */ + int getHeightForPosition(int position) { + final int firstVisiblePosition = getFirstVisiblePosition(); + final int childCount = getChildCount(); + final int index = position - firstVisiblePosition; + if (position >= 0 && position < childCount) { + final View view = getChildAt(index); + return view.getHeight(); + } else { + final View view = obtainView(position, mIsScrap); + view.measure(mWidthMeasureSpec, MeasureSpec.UNSPECIFIED); + final int height = view.getMeasuredHeight(); + mRecycler.addScrapView(view, position); + return height; + } + } + + /** + * Returns the row for the specified item position. + * + * @param position the item position + * @return the row index + */ + public int getRowForPosition(int position) { + return position; + } + + /** + * Returns the first item position within the specified row. + * + * @param row the row + * @return the item position + */ + public int getFirstPositionForRow(int row) { + return row; + } + + /** + * Sets the selected item and positions the selection y pixels from the top edge + * of the ListView. (If in touch mode, the item will not be selected but it will + * still be positioned appropriately.) + * + * @param position Index (starting at 0) of the data item to be selected. + * @param y The distance from the top edge of the ListView (plus padding) that the + * item will be positioned. + */ + public void setSelectionFromTop(int position, int y) { + if (mAdapter == null) { + return; + } + + if (!isInTouchMode()) { + position = lookForSelectablePosition(position, true); + if (position >= 0) { + setNextSelectedPositionInt(position); + } + } else { + mResurrectToPosition = position; + } + + if (position >= 0) { + mLayoutMode = LAYOUT_SPECIFIC; + mSpecificTop = mListPadding.top + y; + + if (mNeedSync) { + mSyncPosition = position; + mSyncRowId = mAdapter.getItemId(position); + } + + if (mPositionScroller != null) { + mPositionScroller.stop(); + } + requestLayout(); + } + } + + class SubPositionScroller { + private static final int DEFAULT_SCROLL_DURATION = 200; + + private SubScroller mSubScroller; + private int mOffset; + + /** + * Scroll the minimum amount to get the target view entirely on-screen. + */ + private void scrollToPosition(final int targetPosition, final boolean useOffset, + final int offset, final int boundPosition, final int duration) { + stop(); + + if (mDataChanged) { + // Wait until we're back in a stable state to try this. + mPositionScrollAfterLayout = new Runnable() { + @Override + public void run() { + scrollToPosition( + targetPosition, useOffset, offset, boundPosition, duration); + } + }; + return; + } + + final int firstPosition = getFirstVisiblePosition(); + final int lastPosition = firstPosition + getChildCount(); + final int targetRow = getRowForPosition(targetPosition); + final int firstRow = getRowForPosition(firstPosition); + final int lastRow = getRowForPosition(lastPosition); + if (useOffset || targetRow <= firstRow) { + mOffset = offset; + } else if (targetRow >= lastRow - 1) { + final int listHeight = getHeight() - getPaddingTop() - getPaddingBottom(); + mOffset = listHeight - getHeightForPosition(targetPosition); + } else { + // Don't scroll, target is entirely on-screen. + return; + } + + float endSubRow = targetRow; + if (boundPosition != INVALID_POSITION) { + final int boundRow = getRowForPosition(boundPosition); + if (boundRow >= firstRow && boundRow < lastRow) { + endSubRow = computeBoundSubRow(targetRow, boundRow); + } + } + + final View firstChild = getChildAt(0); + final float startOffsetRatio = -firstChild.getTop() / (float) firstChild.getHeight(); + final float startSubRow = firstRow + startOffsetRatio; + if (startSubRow == endSubRow && mOffset == 0) { + // Don't scroll, target is already in position. + return; + } + + if (mSubScroller == null) { + mSubScroller = new SubScroller(); + } + mSubScroller.startScroll(startSubRow, endSubRow, duration); + + postOnAnimation(mAnimationFrame); + } + + private float computeBoundSubRow(int targetRow, int boundRow) { + // Compute the target and offset as a sub-position. + int remainingOffset = mOffset; + int targetHeight = getHeightForRow(targetRow - 1); + while (remainingOffset > 0) { + remainingOffset -= targetHeight; + targetRow--; + targetHeight = getHeightForRow(targetRow - 1); + } + final float targetSubRow = targetRow - remainingOffset / targetHeight; + mOffset = 0; + + if (targetSubRow >= boundRow) { + // End position would push the bound position above the list. + return boundRow; + } + + // Compute the closest possible sub-position that wouldn't push the + // bound position's view further below the list. + final int listHeight = getHeight() - getPaddingTop() - getPaddingBottom(); + final int boundHeight = getHeightForRow(boundRow); + int endRow = boundRow; + int totalHeight = boundHeight; + int endHeight; + do { + endRow--; + endHeight = getHeightForRow(endRow); + totalHeight += endHeight; + } while (totalHeight < listHeight && endRow > 0); + + final float endOffsetRatio = (totalHeight - listHeight) / (float) endHeight; + final float boundSubRow = endRow + endOffsetRatio; + return Math.max(boundSubRow, targetSubRow); + } + + /** + * @param position + * @param boundPosition + */ + public void start(int position, int boundPosition) { + scrollToPosition(position, false, 0, boundPosition, DEFAULT_SCROLL_DURATION); + } + + /** + * @param position + * @param offset + * @param duration + */ + public void startWithOffset(int position, int offset, int duration) { + scrollToPosition(position, true, offset, INVALID_POSITION, duration); + } + + /** + * @param position + */ + public void start(int position) { + scrollToPosition(position, false, 0, INVALID_POSITION, DEFAULT_SCROLL_DURATION); + } + + public void stop() { + removeCallbacks(mAnimationFrame); + } + + private void onAnimationFrame() { + final boolean shouldPost = mSubScroller.computePosition(); + final float subRow = mSubScroller.getPosition(); + + final int row = (int) subRow; + final int position = getFirstPositionForRow(row); + final int rowHeight = getHeightForRow(row); + final int offset = (int) (rowHeight * (subRow - row)); + final int addOffset = (int) (mOffset * mSubScroller.getInterpolatedValue()); + setSelectionFromTop(position, -offset + addOffset); + + if (shouldPost) { + postOnAnimation(mAnimationFrame); + } + } + + private Runnable mAnimationFrame = new Runnable() { + @Override + public void run() { + onAnimationFrame(); + } + }; + } + + /** + * Scroller capable of returning floating point positions. + */ + private static class SubScroller { + private final Interpolator mInterpolator; + + private float mStartPosition; + private float mEndPosition; + private long mStartTime; + private long mDuration; + + private float mPosition; + private float mInterpolatedValue; + + public SubScroller() { + this(null); + } + + public SubScroller(Interpolator interpolator) { + if (interpolator == null) { + mInterpolator = new AccelerateDecelerateInterpolator(); + } else { + mInterpolator = interpolator; + } + } + + public void startScroll(float startPosition, float endPosition, int duration) { + mStartPosition = startPosition; + mEndPosition = endPosition; + mDuration = duration; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mPosition = startPosition; + mInterpolatedValue = 0; + } + + public boolean computePosition() { + final long elapsed = AnimationUtils.currentAnimationTimeMillis() - mStartTime; + final float value = MathUtils.constrain(elapsed / (float) mDuration, 0, 1); + + mInterpolatedValue = mInterpolator.getInterpolation(value); + mPosition = (mEndPosition - mStartPosition) * mInterpolatedValue + mStartPosition; + + return elapsed < mDuration; + } + + public float getPosition() { + return mPosition; + } + + public float getInterpolatedValue() { + return mInterpolatedValue; + } + } } diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index acd711d61e8c..0b424f72be21 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1027,6 +1027,16 @@ public class GridView extends AbsListView { } @Override + public int getRowForPosition(int position) { + return position / mNumColumns; + } + + @Override + public int getFirstPositionForRow(int row) { + return row * mNumColumns; + } + + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Sets up mListPadding super.onMeasure(widthMeasureSpec, heightMeasureSpec); diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index c4617236d041..f937cd629d90 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -1892,45 +1892,6 @@ public class ListView extends AbsListView { } /** - * Sets the selected item and positions the selection y pixels from the top edge - * of the ListView. (If in touch mode, the item will not be selected but it will - * still be positioned appropriately.) - * - * @param position Index (starting at 0) of the data item to be selected. - * @param y The distance from the top edge of the ListView (plus padding) that the - * item will be positioned. - */ - public void setSelectionFromTop(int position, int y) { - if (mAdapter == null) { - return; - } - - if (!isInTouchMode()) { - position = lookForSelectablePosition(position, true); - if (position >= 0) { - setNextSelectedPositionInt(position); - } - } else { - mResurrectToPosition = position; - } - - if (position >= 0) { - mLayoutMode = LAYOUT_SPECIFIC; - mSpecificTop = mListPadding.top + y; - - if (mNeedSync) { - mSyncPosition = position; - mSyncRowId = mAdapter.getItemId(position); - } - - if (mPositionScroller != null) { - mPositionScroller.stop(); - } - requestLayout(); - } - } - - /** * Makes the item at the supplied position selected. * * @param position the position of the item to select @@ -3746,6 +3707,84 @@ public class ListView extends AbsListView { } @Override + int getHeightForPosition(int position) { + final int height = super.getHeightForPosition(position); + if (shouldAdjustHeightForDivider(position)) { + return height + mDividerHeight; + } + return height; + } + + private boolean shouldAdjustHeightForDivider(int itemIndex) { + final int dividerHeight = mDividerHeight; + final Drawable overscrollHeader = mOverScrollHeader; + final Drawable overscrollFooter = mOverScrollFooter; + final boolean drawOverscrollHeader = overscrollHeader != null; + final boolean drawOverscrollFooter = overscrollFooter != null; + final boolean drawDividers = dividerHeight > 0 && mDivider != null; + + if (drawDividers) { + final boolean fillForMissingDividers = isOpaque() && !super.isOpaque(); + final int itemCount = mItemCount; + final int headerCount = mHeaderViewInfos.size(); + final int footerLimit = (itemCount - mFooterViewInfos.size()); + final boolean isHeader = (itemIndex < headerCount); + final boolean isFooter = (itemIndex >= footerLimit); + final boolean headerDividers = mHeaderDividersEnabled; + final boolean footerDividers = mFooterDividersEnabled; + if ((headerDividers || !isHeader) && (footerDividers || !isFooter)) { + final ListAdapter adapter = mAdapter; + if (!mStackFromBottom) { + final boolean isLastItem = (itemIndex == (itemCount - 1)); + if (!drawOverscrollFooter || !isLastItem) { + final int nextIndex = itemIndex + 1; + // Draw dividers between enabled items, headers + // and/or footers when enabled and requested, and + // after the last enabled item. + if (adapter.isEnabled(itemIndex) && (headerDividers || !isHeader + && (nextIndex >= headerCount)) && (isLastItem + || adapter.isEnabled(nextIndex) && (footerDividers || !isFooter + && (nextIndex < footerLimit)))) { + return true; + } else if (fillForMissingDividers) { + return true; + } + } + } else { + final int start = drawOverscrollHeader ? 1 : 0; + final boolean isFirstItem = (itemIndex == start); + if (!isFirstItem) { + final int previousIndex = (itemIndex - 1); + // Draw dividers between enabled items, headers + // and/or footers when enabled and requested, and + // before the first enabled item. + if (adapter.isEnabled(itemIndex) && (headerDividers || !isHeader + && (previousIndex >= headerCount)) && (isFirstItem || + adapter.isEnabled(previousIndex) && (footerDividers || !isFooter + && (previousIndex < footerLimit)))) { + return true; + } else if (fillForMissingDividers) { + return true; + } + } + } + } + } + + return false; + } + + @Override + public int getRowForPosition(int position) { + return position; + } + + @Override + public int getFirstPositionForRow(int row) { + return row; + } + + @Override public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(ListView.class.getName()); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 5d42589ff044..aa8bbb276882 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -8481,7 +8481,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return false; } - if (mText.length() > 0 && hasSelection()) { + if (mText.length() > 0 && hasSelection() && mEditor != null) { return true; } diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 4c851e79e619..0131f68ee003 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -240,7 +240,6 @@ public class BatteryStatsHelper { double power = 0; // in mAs double highestDrain = 0; String packageWithHighestDrain = null; - //mUsageList.add(new AppUsage(u.getUid(), new double[] {power})); Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); long cpuTime = 0; long cpuFgTime = 0; @@ -399,7 +398,6 @@ public class BatteryStatsHelper { u.getUid(), makemAh(power))); // Add the app to the list if it is consuming power - boolean isOtherUser = false; final int userId = UserHandle.getUserId(u.getUid()); if (power != 0 || u.getUid() == 0) { BatterySipper app = new BatterySipper(BatterySipper.DrainType.APP, u, @@ -420,42 +418,36 @@ public class BatteryStatsHelper { app.packageWithHighestDrain = packageWithHighestDrain; if (u.getUid() == Process.WIFI_UID) { mWifiSippers.add(app); + mWifiPower += power; } else if (u.getUid() == Process.BLUETOOTH_UID) { mBluetoothSippers.add(app); + mBluetoothPower += power; } else if (mAsUser != UserHandle.USER_ALL && userId != mAsUser && UserHandle.getAppId(u.getUid()) >= Process.FIRST_APPLICATION_UID) { - isOtherUser = true; List<BatterySipper> list = mUserSippers.get(userId); if (list == null) { list = new ArrayList<BatterySipper>(); mUserSippers.put(userId, list); } list.add(app); + if (power != 0) { + Double userPower = mUserPower.get(userId); + if (userPower == null) { + userPower = power; + } else { + userPower += power; + } + mUserPower.put(userId, userPower); + } } else { mUsageList.add(app); + if (power > mMaxPower) mMaxPower = power; + mTotalPower += power; } if (u.getUid() == 0) { osApp = app; } } - if (power != 0) { - if (u.getUid() == Process.WIFI_UID) { - mWifiPower += power; - } else if (u.getUid() == Process.BLUETOOTH_UID) { - mBluetoothPower += power; - } else if (isOtherUser) { - Double userPower = mUserPower.get(userId); - if (userPower == null) { - userPower = power; - } else { - userPower += power; - } - mUserPower.put(userId, userPower); - } else { - if (power > mMaxPower) mMaxPower = power; - mTotalPower += power; - } - } } // The device has probably been awake for longer than the screen on @@ -679,7 +671,6 @@ public class BatteryStatsHelper { private BatterySipper addEntryNoTotal(DrainType drainType, long time, double power) { if (power > mMaxPower) mMaxPower = power; - mTotalPower += power; BatterySipper bs = new BatterySipper(drainType, null, new double[] {power}); bs.usageTime = time; mUsageList.add(bs); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 7d178393d6ed..f6929482717a 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -27,6 +27,7 @@ import android.os.BatteryManager; import android.os.BatteryStats; import android.os.FileUtils; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.ParcelFormatException; @@ -114,6 +115,10 @@ public final class BatteryStatsImpl extends BatteryStats { } final class MyHandler extends Handler { + public MyHandler(Looper looper) { + super(looper, null, true); + } + @Override public void handleMessage(Message msg) { BatteryCallback cb = mCallback; @@ -4688,9 +4693,9 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public BatteryStatsImpl(String filename) { + public BatteryStatsImpl(String filename, Handler handler) { mFile = new JournaledFile(new File(filename), new File(filename + ".tmp")); - mHandler = new MyHandler(); + mHandler = new MyHandler(handler.getLooper()); mStartCount++; mScreenOnTimer = new StopwatchTimer(null, -1, null, mUnpluggables); for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { diff --git a/core/java/com/android/internal/os/BinderInternal.java b/core/java/com/android/internal/os/BinderInternal.java index 9841f62fc7a9..3b0f0f4777dd 100644 --- a/core/java/com/android/internal/os/BinderInternal.java +++ b/core/java/com/android/internal/os/BinderInternal.java @@ -19,6 +19,7 @@ package com.android.internal.os; import android.os.IBinder; import android.os.SystemClock; import android.util.EventLog; + import java.lang.ref.WeakReference; /** diff --git a/core/java/com/android/server/SystemServiceManager.java b/core/java/com/android/server/SystemServiceManager.java index e2a6063050e4..06ad7f4c1e40 100644 --- a/core/java/com/android/server/SystemServiceManager.java +++ b/core/java/com/android/server/SystemServiceManager.java @@ -43,11 +43,18 @@ public class SystemServiceManager { mContext = context; } - public void startService(String className) { + /** + * Starts a service by name if the class exists, otherwise ignores it. + * + * @return The service instance, or null if not found. + */ + @SuppressWarnings("unchecked") + public SystemService startServiceIfExists(String className) { try { - startService(Class.forName(className)); + return startService((Class<SystemService>)Class.forName(className)); } catch (ClassNotFoundException cnfe) { Slog.i(TAG, className + " not available, ignoring."); + return null; } } @@ -56,10 +63,12 @@ public class SystemServiceManager { * {@link com.android.server.SystemService}. * * @param serviceClass A Java class that implements the SystemService interface. + * @return The service instance, never null. * @throws RuntimeException if the service fails to start. */ - public void startService(Class<?> serviceClass) { - final SystemService serviceInstance = createInstance(serviceClass); + @SuppressWarnings("unchecked") + public <T extends SystemService> T startService(Class<T> serviceClass) { + final T serviceInstance = (T)createInstance(serviceClass); try { Slog.i(TAG, "Creating " + serviceClass.getSimpleName()); serviceInstance.init(mContext, this); @@ -75,6 +84,8 @@ public class SystemServiceManager { } catch (Throwable e) { throw new RuntimeException("Failed to start service " + serviceClass.getName(), e); } + + return serviceInstance; } /** diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index efa8ce7a1e14..d042ce95a0ba 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -21,6 +21,7 @@ #include <androidfw/Asset.h> #include <androidfw/ResourceTypes.h> #include <netinet/in.h> +#include <stdio.h> #include <sys/mman.h> #include <sys/stat.h> @@ -516,11 +517,14 @@ static jobject nativeDecodeFileDescriptor(JNIEnv* env, jobject clazz, jobject fi } } - SkAutoTUnref<SkData> data(SkData::NewFromFD(descriptor)); - if (data.get() == NULL) { - return nullObjectReturn("NewFromFD failed in nativeDecodeFileDescriptor"); + FILE* file = fdopen(descriptor, "r"); + if (file == NULL) { + return nullObjectReturn("Could not open file"); } - SkAutoTUnref<SkMemoryStream> stream(new SkMemoryStream(data)); + + SkAutoTUnref<SkFILEStream> stream(new SkFILEStream(file, + weOwnTheFD ? SkFILEStream::kCallerPasses_Ownership : + SkFILEStream::kCallerRetains_Ownership)); /* Allow purgeable iff we own the FD, i.e., in the puregeable and shareable case. diff --git a/core/jni/android/graphics/BitmapRegionDecoder.cpp b/core/jni/android/graphics/BitmapRegionDecoder.cpp index d08abbaf2a8d..098643b1eda3 100644 --- a/core/jni/android/graphics/BitmapRegionDecoder.cpp +++ b/core/jni/android/graphics/BitmapRegionDecoder.cpp @@ -101,7 +101,7 @@ static jobject createBitmapRegionDecoder(JNIEnv* env, SkStreamRewindable* stream } static jobject nativeNewInstanceFromByteArray(JNIEnv* env, jobject, jbyteArray byteArray, - int offset, int length, jboolean isShareable) { + jint offset, jint length, jboolean isShareable) { /* If isShareable we could decide to just wrap the java array and share it, but that means adding a globalref to the java array object For now we just always copy the array's data if isShareable. @@ -150,7 +150,7 @@ static jobject nativeNewInstanceFromStream(JNIEnv* env, jobject clazz, } static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz, - jint native_asset, // Asset + jlong native_asset, // Asset jboolean isShareable) { Asset* asset = reinterpret_cast<Asset*>(native_asset); SkAutoTUnref<SkMemoryStream> stream(CopyAssetToStream(asset)); @@ -169,8 +169,9 @@ static jobject nativeNewInstanceFromAsset(JNIEnv* env, jobject clazz, * purgeable not supported * reportSizeToVM not supported */ -static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd, - int start_x, int start_y, int width, int height, jobject options) { +static jobject nativeDecodeRegion(JNIEnv* env, jobject, jlong brdHandle, + jint start_x, jint start_y, jint width, jint height, jobject options) { + SkBitmapRegionDecoder *brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); jobject tileBitmap = NULL; SkImageDecoder *decoder = brd->getDecoder(); int sampleSize = 1; @@ -255,15 +256,18 @@ static jobject nativeDecodeRegion(JNIEnv* env, jobject, SkBitmapRegionDecoder *b return GraphicsJNI::createBitmap(env, bitmap, buff, bitmapCreateFlags, NULL, NULL, -1); } -static int nativeGetHeight(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd) { - return brd->getHeight(); +static jint nativeGetHeight(JNIEnv* env, jobject, jlong brdHandle) { + SkBitmapRegionDecoder *brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); + return static_cast<jint>(brd->getHeight()); } -static int nativeGetWidth(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd) { - return brd->getWidth(); +static jint nativeGetWidth(JNIEnv* env, jobject, jlong brdHandle) { + SkBitmapRegionDecoder *brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); + return static_cast<jint>(brd->getWidth()); } -static void nativeClean(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd) { +static void nativeClean(JNIEnv* env, jobject, jlong brdHandle) { + SkBitmapRegionDecoder *brd = reinterpret_cast<SkBitmapRegionDecoder*>(brdHandle); delete brd; } @@ -273,14 +277,14 @@ static void nativeClean(JNIEnv* env, jobject, SkBitmapRegionDecoder *brd) { static JNINativeMethod gBitmapRegionDecoderMethods[] = { { "nativeDecodeRegion", - "(IIIIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;", + "(JIIIILandroid/graphics/BitmapFactory$Options;)Landroid/graphics/Bitmap;", (void*)nativeDecodeRegion}, - { "nativeGetHeight", "(I)I", (void*)nativeGetHeight}, + { "nativeGetHeight", "(J)I", (void*)nativeGetHeight}, - { "nativeGetWidth", "(I)I", (void*)nativeGetWidth}, + { "nativeGetWidth", "(J)I", (void*)nativeGetWidth}, - { "nativeClean", "(I)V", (void*)nativeClean}, + { "nativeClean", "(J)V", (void*)nativeClean}, { "nativeNewInstance", "([BIIZ)Landroid/graphics/BitmapRegionDecoder;", @@ -298,7 +302,7 @@ static JNINativeMethod gBitmapRegionDecoderMethods[] = { }, { "nativeNewInstance", - "(IZ)Landroid/graphics/BitmapRegionDecoder;", + "(JZ)Landroid/graphics/BitmapRegionDecoder;", (void*)nativeNewInstanceFromAsset }, }; diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index c5c0eeec8d2d..2a2db5711551 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -412,7 +412,7 @@ jobject GraphicsJNI::createBitmapRegionDecoder(JNIEnv* env, SkBitmapRegionDecode jobject obj = env->NewObject(gBitmapRegionDecoder_class, gBitmapRegionDecoder_constructorMethodID, - static_cast<jint>(reinterpret_cast<uintptr_t>(bitmap))); + reinterpret_cast<jlong>(bitmap)); hasException(env); // For the side effect of logging. return obj; } @@ -671,7 +671,7 @@ int register_android_graphics_Graphics(JNIEnv* env) gBitmap_reinitMethodID = env->GetMethodID(gBitmap_class, "reinit", "(IIZ)V"); gBitmap_getAllocationByteCountMethodID = env->GetMethodID(gBitmap_class, "getAllocationByteCount", "()I"); gBitmapRegionDecoder_class = make_globalref(env, "android/graphics/BitmapRegionDecoder"); - gBitmapRegionDecoder_constructorMethodID = env->GetMethodID(gBitmapRegionDecoder_class, "<init>", "(I)V"); + gBitmapRegionDecoder_constructorMethodID = env->GetMethodID(gBitmapRegionDecoder_class, "<init>", "(J)V"); gBitmapConfig_class = make_globalref(env, "android/graphics/Bitmap$Config"); gBitmapConfig_nativeInstanceID = getFieldIDCheck(env, gBitmapConfig_class, diff --git a/core/jni/android/graphics/Movie.cpp b/core/jni/android/graphics/Movie.cpp index 55be7c194f12..461f7232b3b1 100644 --- a/core/jni/android/graphics/Movie.cpp +++ b/core/jni/android/graphics/Movie.cpp @@ -27,43 +27,43 @@ jobject create_jmovie(JNIEnv* env, SkMovie* moov) { return NULL; } return env->NewObject(gMovie_class, gMovie_constructorMethodID, - static_cast<jint>(reinterpret_cast<uintptr_t>(moov))); + static_cast<jlong>(reinterpret_cast<uintptr_t>(moov))); } static SkMovie* J2Movie(JNIEnv* env, jobject movie) { SkASSERT(env); SkASSERT(movie); SkASSERT(env->IsInstanceOf(movie, gMovie_class)); - SkMovie* m = (SkMovie*)env->GetIntField(movie, gMovie_nativeInstanceID); + SkMovie* m = (SkMovie*)env->GetLongField(movie, gMovie_nativeInstanceID); SkASSERT(m); return m; } /////////////////////////////////////////////////////////////////////////////// -static int movie_width(JNIEnv* env, jobject movie) { +static jint movie_width(JNIEnv* env, jobject movie) { NPE_CHECK_RETURN_ZERO(env, movie); - return J2Movie(env, movie)->width(); + return static_cast<jint>(J2Movie(env, movie)->width()); } -static int movie_height(JNIEnv* env, jobject movie) { +static jint movie_height(JNIEnv* env, jobject movie) { NPE_CHECK_RETURN_ZERO(env, movie); - return J2Movie(env, movie)->height(); + return static_cast<jint>(J2Movie(env, movie)->height()); } static jboolean movie_isOpaque(JNIEnv* env, jobject movie) { NPE_CHECK_RETURN_ZERO(env, movie); - return J2Movie(env, movie)->isOpaque(); + return J2Movie(env, movie)->isOpaque() ? JNI_TRUE : JNI_FALSE; } -static int movie_duration(JNIEnv* env, jobject movie) { +static jint movie_duration(JNIEnv* env, jobject movie) { NPE_CHECK_RETURN_ZERO(env, movie); - return J2Movie(env, movie)->duration(); + return static_cast<jint>(J2Movie(env, movie)->duration()); } -static jboolean movie_setTime(JNIEnv* env, jobject movie, int ms) { +static jboolean movie_setTime(JNIEnv* env, jobject movie, jint ms) { NPE_CHECK_RETURN_ZERO(env, movie); - return J2Movie(env, movie)->setTime(ms); + return J2Movie(env, movie)->setTime(ms) ? JNI_TRUE : JNI_FALSE; } static void movie_draw(JNIEnv* env, jobject movie, jobject canvas, @@ -82,7 +82,7 @@ static void movie_draw(JNIEnv* env, jobject movie, jobject canvas, c->drawBitmap(b, sx, sy, p); } -static jobject movie_decodeAsset(JNIEnv* env, jobject clazz, jint native_asset) { +static jobject movie_decodeAsset(JNIEnv* env, jobject clazz, jlong native_asset) { android::Asset* asset = reinterpret_cast<android::Asset*>(native_asset); if (asset == NULL) return NULL; SkAutoTUnref<SkStreamRewindable> stream (new android::AssetStreamAdaptor(asset, @@ -117,7 +117,7 @@ static jobject movie_decodeStream(JNIEnv* env, jobject clazz, jobject istream) { static jobject movie_decodeByteArray(JNIEnv* env, jobject clazz, jbyteArray byteArray, - int offset, int length) { + jint offset, jint length) { NPE_CHECK_RETURN_ZERO(env, byteArray); @@ -132,7 +132,8 @@ static jobject movie_decodeByteArray(JNIEnv* env, jobject clazz, return create_jmovie(env, moov); } -static void movie_destructor(JNIEnv* env, jobject, SkMovie* movie) { +static void movie_destructor(JNIEnv* env, jobject, jlong movieHandle) { + SkMovie* movie = (SkMovie*) movieHandle; delete movie; } @@ -148,11 +149,11 @@ static JNINativeMethod gMethods[] = { { "setTime", "(I)Z", (void*)movie_setTime }, { "draw", "(Landroid/graphics/Canvas;FFLandroid/graphics/Paint;)V", (void*)movie_draw }, - { "nativeDecodeAsset", "(I)Landroid/graphics/Movie;", + { "nativeDecodeAsset", "(J)Landroid/graphics/Movie;", (void*)movie_decodeAsset }, { "nativeDecodeStream", "(Ljava/io/InputStream;)Landroid/graphics/Movie;", (void*)movie_decodeStream }, - { "nativeDestructor","(I)V", (void*)movie_destructor }, + { "nativeDestructor","(J)V", (void*)movie_destructor }, { "decodeByteArray", "([BII)Landroid/graphics/Movie;", (void*)movie_decodeByteArray }, }; @@ -167,10 +168,10 @@ int register_android_graphics_Movie(JNIEnv* env) RETURN_ERR_IF_NULL(gMovie_class); gMovie_class = (jclass)env->NewGlobalRef(gMovie_class); - gMovie_constructorMethodID = env->GetMethodID(gMovie_class, "<init>", "(I)V"); + gMovie_constructorMethodID = env->GetMethodID(gMovie_class, "<init>", "(J)V"); RETURN_ERR_IF_NULL(gMovie_constructorMethodID); - gMovie_nativeInstanceID = env->GetFieldID(gMovie_class, "mNativeMovie", "I"); + gMovie_nativeInstanceID = env->GetFieldID(gMovie_class, "mNativeMovie", "J"); RETURN_ERR_IF_NULL(gMovie_nativeInstanceID); return android::AndroidRuntime::registerNativeMethods(env, kClassPathName, diff --git a/core/jni/android/graphics/PathMeasure.cpp b/core/jni/android/graphics/PathMeasure.cpp index 51a3f3aa84bc..8478a02f23ff 100644 --- a/core/jni/android/graphics/PathMeasure.cpp +++ b/core/jni/android/graphics/PathMeasure.cpp @@ -52,11 +52,24 @@ namespace android { class SkPathMeasureGlue { public: - static PathMeasurePair* create(JNIEnv* env, jobject clazz, const SkPath* path, jboolean forceClosed) { - return path ? new PathMeasurePair(*path, forceClosed) : new PathMeasurePair; + static jlong create(JNIEnv* env, jobject clazz, jlong pathHandle, + jboolean forceClosedHandle) { + const SkPath* path = reinterpret_cast<SkPath*>(pathHandle); + bool forceClosed = (forceClosedHandle == JNI_TRUE); + PathMeasurePair* pair; + if(path) + pair = new PathMeasurePair(*path, forceClosed); + else + pair = new PathMeasurePair; + return reinterpret_cast<jlong>(pair); } - - static void setPath(JNIEnv* env, jobject clazz, PathMeasurePair* pair, const SkPath* path, jboolean forceClosed) { + + static void setPath(JNIEnv* env, jobject clazz, jlong pairHandle, + jlong pathHandle, jboolean forceClosedHandle) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + const SkPath* path = reinterpret_cast<SkPath*>(pathHandle); + bool forceClosed = (forceClosedHandle == JNI_TRUE); + if (NULL == path) { pair->fPath.reset(); } else { @@ -64,11 +77,12 @@ public: } pair->fMeasure.setPath(&pair->fPath, forceClosed); } - - static jfloat getLength(JNIEnv* env, jobject clazz, PathMeasurePair* pair) { - return SkScalarToFloat(pair->fMeasure.getLength()); + + static jfloat getLength(JNIEnv* env, jobject clazz, jlong pairHandle) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + return static_cast<jfloat>(SkScalarToFloat(pair->fMeasure.getLength())); } - + static void convertTwoElemFloatArray(JNIEnv* env, jfloatArray array, const SkScalar src[2]) { AutoJavaFloatArray autoArray(env, array, 2); jfloat* ptr = autoArray.ptr(); @@ -76,13 +90,14 @@ public: ptr[1] = SkScalarToFloat(src[1]); } - static jboolean getPosTan(JNIEnv* env, jobject clazz, PathMeasurePair* pair, jfloat dist, jfloatArray pos, jfloatArray tan) { + static jboolean getPosTan(JNIEnv* env, jobject clazz, jlong pairHandle, jfloat dist, jfloatArray pos, jfloatArray tan) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); SkScalar tmpPos[2], tmpTan[2]; SkScalar* posPtr = pos ? tmpPos : NULL; SkScalar* tanPtr = tan ? tmpTan : NULL; if (!pair->fMeasure.getPosTan(SkFloatToScalar(dist), (SkPoint*)posPtr, (SkVector*)tanPtr)) { - return false; + return JNI_FALSE; } if (pos) { @@ -91,42 +106,53 @@ public: if (tan) { convertTwoElemFloatArray(env, tan, tmpTan); } - return true; + return JNI_TRUE; } - - static jboolean getMatrix(JNIEnv* env, jobject clazz, PathMeasurePair* pair, jfloat dist, - SkMatrix* matrix, int flags) { - return pair->fMeasure.getMatrix(SkFloatToScalar(dist), matrix, (SkPathMeasure::MatrixFlags)flags); + + static jboolean getMatrix(JNIEnv* env, jobject clazz, jlong pairHandle, jfloat dist, + jlong matrixHandle, jint flags) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixHandle); + bool result = pair->fMeasure.getMatrix(SkFloatToScalar(dist), matrix, (SkPathMeasure::MatrixFlags)flags); + return result ? JNI_TRUE : JNI_FALSE; } - - static jboolean getSegment(JNIEnv* env, jobject clazz, PathMeasurePair* pair, jfloat startF, - jfloat stopF, SkPath* dst, jboolean startWithMoveTo) { - return pair->fMeasure.getSegment(SkFloatToScalar(startF), SkFloatToScalar(stopF), dst, startWithMoveTo); + + static jboolean getSegment(JNIEnv* env, jobject clazz, jlong pairHandle, jfloat startF, + jfloat stopF, jlong dstHandle, jboolean startWithMoveTo) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + SkPath* dst = reinterpret_cast<SkPath*>(dstHandle); + bool result = pair->fMeasure.getSegment(SkFloatToScalar(startF), SkFloatToScalar(stopF), dst, startWithMoveTo); + return result ? JNI_TRUE : JNI_FALSE; } - - static jboolean isClosed(JNIEnv* env, jobject clazz, PathMeasurePair* pair) { - return pair->fMeasure.isClosed(); + + static jboolean isClosed(JNIEnv* env, jobject clazz, jlong pairHandle) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + bool result = pair->fMeasure.isClosed(); + return result ? JNI_TRUE : JNI_FALSE; } - - static jboolean nextContour(JNIEnv* env, jobject clazz, PathMeasurePair* pair) { - return pair->fMeasure.nextContour(); + + static jboolean nextContour(JNIEnv* env, jobject clazz, jlong pairHandle) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); + bool result = pair->fMeasure.nextContour(); + return result ? JNI_TRUE : JNI_FALSE; } - - static void destroy(JNIEnv* env, jobject clazz, PathMeasurePair* pair) { + + static void destroy(JNIEnv* env, jobject clazz, jlong pairHandle) { + PathMeasurePair* pair = reinterpret_cast<PathMeasurePair*>(pairHandle); delete pair; } }; static JNINativeMethod methods[] = { - {"native_create", "(IZ)I", (void*) SkPathMeasureGlue::create }, - {"native_setPath", "(IIZ)V", (void*) SkPathMeasureGlue::setPath }, - {"native_getLength", "(I)F", (void*) SkPathMeasureGlue::getLength }, - {"native_getPosTan", "(IF[F[F)Z", (void*) SkPathMeasureGlue::getPosTan }, - {"native_getMatrix", "(IFII)Z", (void*) SkPathMeasureGlue::getMatrix }, - {"native_getSegment", "(IFFIZ)Z", (void*) SkPathMeasureGlue::getSegment }, - {"native_isClosed", "(I)Z", (void*) SkPathMeasureGlue::isClosed }, - {"native_nextContour", "(I)Z", (void*) SkPathMeasureGlue::nextContour }, - {"native_destroy", "(I)V", (void*) SkPathMeasureGlue::destroy } + {"native_create", "(JZ)J", (void*) SkPathMeasureGlue::create }, + {"native_setPath", "(JJZ)V", (void*) SkPathMeasureGlue::setPath }, + {"native_getLength", "(J)F", (void*) SkPathMeasureGlue::getLength }, + {"native_getPosTan", "(JF[F[F)Z", (void*) SkPathMeasureGlue::getPosTan }, + {"native_getMatrix", "(JFJI)Z", (void*) SkPathMeasureGlue::getMatrix }, + {"native_getSegment", "(JFFJZ)Z", (void*) SkPathMeasureGlue::getSegment }, + {"native_isClosed", "(J)Z", (void*) SkPathMeasureGlue::isClosed }, + {"native_nextContour", "(J)Z", (void*) SkPathMeasureGlue::nextContour }, + {"native_destroy", "(J)V", (void*) SkPathMeasureGlue::destroy } }; int register_android_graphics_PathMeasure(JNIEnv* env) { diff --git a/core/jni/android/graphics/YuvToJpegEncoder.cpp b/core/jni/android/graphics/YuvToJpegEncoder.cpp index f3869058230b..799782d53ce2 100644 --- a/core/jni/android/graphics/YuvToJpegEncoder.cpp +++ b/core/jni/android/graphics/YuvToJpegEncoder.cpp @@ -217,8 +217,8 @@ void Yuv422IToJpegEncoder::configSamplingFactors(jpeg_compress_struct* cinfo) { /////////////////////////////////////////////////////////////////////////////// static jboolean YuvImage_compressToJpeg(JNIEnv* env, jobject, jbyteArray inYuv, - int format, int width, int height, jintArray offsets, - jintArray strides, int jpegQuality, jobject jstream, + jint format, jint width, jint height, jintArray offsets, + jintArray strides, jint jpegQuality, jobject jstream, jbyteArray jstorage) { jbyte* yuv = env->GetByteArrayElements(inYuv, NULL); SkWStream* strm = CreateJavaOutputStreamAdaptor(env, jstream, jstorage); @@ -227,7 +227,7 @@ static jboolean YuvImage_compressToJpeg(JNIEnv* env, jobject, jbyteArray inYuv, jint* imgStrides = env->GetIntArrayElements(strides, NULL); YuvToJpegEncoder* encoder = YuvToJpegEncoder::create(format, imgStrides); if (encoder == NULL) { - return false; + return JNI_FALSE; } encoder->encode(strm, yuv, width, height, imgOffsets, jpegQuality); @@ -235,7 +235,7 @@ static jboolean YuvImage_compressToJpeg(JNIEnv* env, jobject, jbyteArray inYuv, env->ReleaseByteArrayElements(inYuv, yuv, 0); env->ReleaseIntArrayElements(offsets, imgOffsets, 0); env->ReleaseIntArrayElements(strides, imgStrides, 0); - return true; + return JNI_TRUE; } /////////////////////////////////////////////////////////////////////////////// diff --git a/core/jni/android_media_AudioRecord.cpp b/core/jni/android_media_AudioRecord.cpp index 353334d6b0fd..9c357debfeb0 100644 --- a/core/jni/android_media_AudioRecord.cpp +++ b/core/jni/android_media_AudioRecord.cpp @@ -131,7 +131,7 @@ static sp<AudioRecord> getAudioRecord(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); AudioRecord* const ar = - (AudioRecord*)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); + (AudioRecord*)env->GetLongField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); return sp<AudioRecord>(ar); } @@ -139,19 +139,19 @@ static sp<AudioRecord> setAudioRecord(JNIEnv* env, jobject thiz, const sp<AudioR { Mutex::Autolock l(sLock); sp<AudioRecord> old = - (AudioRecord*)env->GetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); + (AudioRecord*)env->GetLongField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj); if (ar.get()) { ar->incStrong((void*)setAudioRecord); } if (old != 0) { old->decStrong((void*)setAudioRecord); } - env->SetIntField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj, (int)ar.get()); + env->SetLongField(thiz, javaAudioRecordFields.nativeRecorderInJavaObj, (jlong)ar.get()); return old; } // ---------------------------------------------------------------------------- -static int +static jint android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, jint source, jint sampleRateInHertz, jint channelMask, // Java channel masks map directly to the native definition @@ -163,7 +163,7 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, if (!audio_is_input_channel(channelMask)) { ALOGE("Error creating AudioRecord: channel mask %#x is not valid.", channelMask); - return AUDIORECORD_ERROR_SETUP_INVALIDCHANNELMASK; + return (jint) AUDIORECORD_ERROR_SETUP_INVALIDCHANNELMASK; } uint32_t nbChannels = popcount(channelMask); @@ -171,38 +171,38 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, audio_format_t format = audioFormatToNative(audioFormat); if (format == AUDIO_FORMAT_INVALID) { ALOGE("Error creating AudioRecord: unsupported audio format %d.", audioFormat); - return AUDIORECORD_ERROR_SETUP_INVALIDFORMAT; + return (jint) AUDIORECORD_ERROR_SETUP_INVALIDFORMAT; } size_t bytesPerSample = audio_bytes_per_sample(format); if (buffSizeInBytes == 0) { ALOGE("Error creating AudioRecord: frameCount is 0."); - return AUDIORECORD_ERROR_SETUP_ZEROFRAMECOUNT; + return (jint) AUDIORECORD_ERROR_SETUP_ZEROFRAMECOUNT; } size_t frameSize = nbChannels * bytesPerSample; size_t frameCount = buffSizeInBytes / frameSize; if ((uint32_t(source) >= AUDIO_SOURCE_CNT) && (uint32_t(source) != AUDIO_SOURCE_HOTWORD)) { ALOGE("Error creating AudioRecord: unknown source %d.", source); - return AUDIORECORD_ERROR_SETUP_INVALIDSOURCE; + return (jint) AUDIORECORD_ERROR_SETUP_INVALIDSOURCE; } jclass clazz = env->GetObjectClass(thiz); if (clazz == NULL) { ALOGE("Can't find %s when setting up callback.", kClassPathName); - return AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED; + return (jint) AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED; } if (jSession == NULL) { ALOGE("Error creating AudioRecord: invalid session ID pointer"); - return AUDIORECORD_ERROR; + return (jint) AUDIORECORD_ERROR; } jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL); if (nSession == NULL) { ALOGE("Error creating AudioRecord: Error retrieving session id pointer"); - return AUDIORECORD_ERROR; + return (jint) AUDIORECORD_ERROR; } int sessionId = nSession[0]; env->ReleasePrimitiveArrayCritical(jSession, nSession, 0); @@ -257,33 +257,33 @@ android_media_AudioRecord_setup(JNIEnv *env, jobject thiz, jobject weak_this, // save our newly created callback information in the "nativeCallbackCookie" field // of the Java object (in mNativeCallbackCookie) so we can free the memory in finalize() - env->SetIntField(thiz, javaAudioRecordFields.nativeCallbackCookie, (int)lpCallbackData); + env->SetLongField(thiz, javaAudioRecordFields.nativeCallbackCookie, (jlong)lpCallbackData); - return AUDIORECORD_SUCCESS; + return (jint) AUDIORECORD_SUCCESS; // failure: native_init_failure: env->DeleteGlobalRef(lpCallbackData->audioRecord_class); env->DeleteGlobalRef(lpCallbackData->audioRecord_ref); delete lpCallbackData; - env->SetIntField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); + env->SetLongField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); - return AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED; + return (jint) AUDIORECORD_ERROR_SETUP_NATIVEINITFAILED; } // ---------------------------------------------------------------------------- -static int +static jint android_media_AudioRecord_start(JNIEnv *env, jobject thiz, jint event, jint triggerSession) { sp<AudioRecord> lpRecorder = getAudioRecord(env, thiz); if (lpRecorder == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return AUDIORECORD_ERROR; + return (jint) AUDIORECORD_ERROR; } - return android_media_translateRecorderErrorCode( + return (jint) android_media_translateRecorderErrorCode( lpRecorder->start((AudioSystem::sync_event_t)event, triggerSession)); } @@ -314,12 +314,12 @@ static void android_media_AudioRecord_release(JNIEnv *env, jobject thiz) { ALOGV("About to delete lpRecorder: %x\n", (int)lpRecorder.get()); lpRecorder->stop(); - audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetIntField( + audiorecord_callback_cookie *lpCookie = (audiorecord_callback_cookie *)env->GetLongField( thiz, javaAudioRecordFields.nativeCallbackCookie); // reset the native resources in the Java object so any attempt to access // them after a call to release fails. - env->SetIntField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); + env->SetLongField(thiz, javaAudioRecordFields.nativeCallbackCookie, 0); // delete the callback information if (lpCookie) { @@ -580,7 +580,7 @@ int register_android_media_AudioRecord(JNIEnv *env) // mNativeRecorderInJavaObj javaAudioRecordFields.nativeRecorderInJavaObj = env->GetFieldID(audioRecordClass, - JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME, "I"); + JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME, "J"); if (javaAudioRecordFields.nativeRecorderInJavaObj == NULL) { ALOGE("Can't find AudioRecord.%s", JAVA_NATIVERECORDERINJAVAOBJ_FIELD_NAME); return -1; @@ -588,7 +588,7 @@ int register_android_media_AudioRecord(JNIEnv *env) // mNativeCallbackCookie javaAudioRecordFields.nativeCallbackCookie = env->GetFieldID( audioRecordClass, - JAVA_NATIVECALLBACKINFO_FIELD_NAME, "I"); + JAVA_NATIVECALLBACKINFO_FIELD_NAME, "J"); if (javaAudioRecordFields.nativeCallbackCookie == NULL) { ALOGE("Can't find AudioRecord.%s", JAVA_NATIVECALLBACKINFO_FIELD_NAME); return -1; diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index f6f7030ffe67..a9a62f8becb4 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -52,10 +52,10 @@ static int check_AudioSystem_Command(status_t status) return kAudioStatusError; } -static int +static jint android_media_AudioSystem_muteMicrophone(JNIEnv *env, jobject thiz, jboolean on) { - return check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); + return (jint) check_AudioSystem_Command(AudioSystem::muteMicrophone(on)); } static jboolean @@ -91,7 +91,7 @@ android_media_AudioSystem_isSourceActive(JNIEnv *env, jobject thiz, jint source) return state; } -static int +static jint android_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyValuePairs) { const jchar* c_keyValuePairs = env->GetStringCritical(keyValuePairs, 0); @@ -101,7 +101,7 @@ android_media_AudioSystem_setParameters(JNIEnv *env, jobject thiz, jstring keyVa env->ReleaseStringCritical(keyValuePairs, c_keyValuePairs); } int status = check_AudioSystem_Command(AudioSystem::setParameters(c_keyValuePairs8)); - return status; + return (jint) status; } static jstring @@ -131,7 +131,7 @@ android_media_AudioSystem_error_callback(status_t err) check_AudioSystem_Command(err)); } -static int +static jint android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jint state, jstring device_address) { const char *c_address = env->GetStringUTFChars(device_address, NULL); @@ -139,60 +139,60 @@ android_media_AudioSystem_setDeviceConnectionState(JNIEnv *env, jobject thiz, ji static_cast <audio_policy_dev_state_t>(state), c_address)); env->ReleaseStringUTFChars(device_address, c_address); - return status; + return (jint) status; } -static int +static jint android_media_AudioSystem_getDeviceConnectionState(JNIEnv *env, jobject thiz, jint device, jstring device_address) { const char *c_address = env->GetStringUTFChars(device_address, NULL); int state = static_cast <int>(AudioSystem::getDeviceConnectionState(static_cast <audio_devices_t>(device), c_address)); env->ReleaseStringUTFChars(device_address, c_address); - return state; + return (jint) state; } -static int +static jint android_media_AudioSystem_setPhoneState(JNIEnv *env, jobject thiz, jint state) { - return check_AudioSystem_Command(AudioSystem::setPhoneState((audio_mode_t) state)); + return (jint) check_AudioSystem_Command(AudioSystem::setPhoneState((audio_mode_t) state)); } -static int +static jint android_media_AudioSystem_setForceUse(JNIEnv *env, jobject thiz, jint usage, jint config) { - return check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage), + return (jint) check_AudioSystem_Command(AudioSystem::setForceUse(static_cast <audio_policy_force_use_t>(usage), static_cast <audio_policy_forced_cfg_t>(config))); } -static int +static jint android_media_AudioSystem_getForceUse(JNIEnv *env, jobject thiz, jint usage) { - return static_cast <int>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage))); + return static_cast <jint>(AudioSystem::getForceUse(static_cast <audio_policy_force_use_t>(usage))); } -static int +static jint android_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint stream, jint indexMin, jint indexMax) { - return check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream), + return (jint) check_AudioSystem_Command(AudioSystem::initStreamVolume(static_cast <audio_stream_type_t>(stream), indexMin, indexMax)); } -static int +static jint android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, jint index, jint device) { - return check_AudioSystem_Command( + return (jint) check_AudioSystem_Command( AudioSystem::setStreamVolumeIndex(static_cast <audio_stream_type_t>(stream), index, (audio_devices_t)device)); } -static int +static jint android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream, @@ -205,13 +205,13 @@ android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env, != NO_ERROR) { index = -1; } - return index; + return (jint) index; } -static int +static jint android_media_AudioSystem_setMasterVolume(JNIEnv *env, jobject thiz, jfloat value) { - return check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); + return (jint) check_AudioSystem_Command(AudioSystem::setMasterVolume(value)); } static jfloat @@ -224,10 +224,10 @@ android_media_AudioSystem_getMasterVolume(JNIEnv *env, jobject thiz) return value; } -static int +static jint android_media_AudioSystem_setMasterMute(JNIEnv *env, jobject thiz, jboolean mute) { - return check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); + return (jint) check_AudioSystem_Command(AudioSystem::setMasterMute(mute)); } static jfloat @@ -275,10 +275,10 @@ android_media_AudioSystem_setLowRamDevice(JNIEnv *env, jobject clazz, jboolean i return (jint) AudioSystem::setLowRamDevice((bool) isLowRamDevice); } -static int +static jint android_media_AudioSystem_checkAudioFlinger(JNIEnv *env, jobject clazz) { - return check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); + return (jint) check_AudioSystem_Command(AudioSystem::checkAudioFlinger()); } // ---------------------------------------------------------------------------- diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 2e419f17800c..27f05dfd94dd 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -171,7 +171,7 @@ static sp<AudioTrack> getAudioTrack(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); AudioTrack* const at = - (AudioTrack*)env->GetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj); + (AudioTrack*)env->GetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj); return sp<AudioTrack>(at); } @@ -179,19 +179,19 @@ static sp<AudioTrack> setAudioTrack(JNIEnv* env, jobject thiz, const sp<AudioTra { Mutex::Autolock l(sLock); sp<AudioTrack> old = - (AudioTrack*)env->GetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj); + (AudioTrack*)env->GetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj); if (at.get()) { at->incStrong((void*)setAudioTrack); } if (old != 0) { old->decStrong((void*)setAudioTrack); } - env->SetIntField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, (int)at.get()); + env->SetLongField(thiz, javaAudioTrackFields.nativeTrackInJavaObj, (jlong)at.get()); return old; } // ---------------------------------------------------------------------------- -static int +static jint android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_this, jint streamType, jint sampleRateInHertz, jint javaChannelMask, jint audioFormat, jint buffSizeInBytes, jint memoryMode, jintArray jSession) @@ -203,11 +203,11 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th if (AudioSystem::getOutputFrameCount(&afFrameCount, (audio_stream_type_t) streamType) != NO_ERROR) { ALOGE("Error creating AudioTrack: Could not get AudioSystem frame count."); - return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; + return (jint) AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } if (AudioSystem::getOutputSamplingRate(&afSampleRate, (audio_stream_type_t) streamType) != NO_ERROR) { ALOGE("Error creating AudioTrack: Could not get AudioSystem sampling rate."); - return AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; + return (jint) AUDIOTRACK_ERROR_SETUP_AUDIOSYSTEM; } // Java channel masks don't map directly to the native definition, but it's a simple shift @@ -216,7 +216,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th if (!audio_is_output_channel(nativeChannelMask)) { ALOGE("Error creating AudioTrack: invalid channel mask %#x.", javaChannelMask); - return AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK; + return (jint) AUDIOTRACK_ERROR_SETUP_INVALIDCHANNELMASK; } int nbChannels = popcount(nativeChannelMask); @@ -236,7 +236,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th break; default: ALOGE("Error creating AudioTrack: unknown stream type."); - return AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE; + return (jint) AUDIOTRACK_ERROR_SETUP_INVALIDSTREAMTYPE; } // check the format. @@ -245,7 +245,7 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th if (format == AUDIO_FORMAT_INVALID) { ALOGE("Error creating AudioTrack: unsupported audio format."); - return AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT; + return (jint) AUDIOTRACK_ERROR_SETUP_INVALIDFORMAT; } // for the moment 8bitPCM in MODE_STATIC is not supported natively in the AudioTrack C++ class @@ -268,18 +268,18 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th jclass clazz = env->GetObjectClass(thiz); if (clazz == NULL) { ALOGE("Can't find %s when setting up callback.", kClassPathName); - return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; + return (jint) AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; } if (jSession == NULL) { ALOGE("Error creating AudioTrack: invalid session ID pointer"); - return AUDIOTRACK_ERROR; + return (jint) AUDIOTRACK_ERROR; } jint* nSession = (jint *) env->GetPrimitiveArrayCritical(jSession, NULL); if (nSession == NULL) { ALOGE("Error creating AudioTrack: Error retrieving session id pointer"); - return AUDIOTRACK_ERROR; + return (jint) AUDIOTRACK_ERROR; } int sessionId = nSession[0]; env->ReleasePrimitiveArrayCritical(jSession, nSession, 0); @@ -366,10 +366,10 @@ android_media_AudioTrack_native_setup(JNIEnv *env, jobject thiz, jobject weak_th setAudioTrack(env, thiz, lpTrack); // save the JNI resources so we can free them later - //ALOGV("storing lpJniStorage: %x\n", (int)lpJniStorage); - env->SetIntField(thiz, javaAudioTrackFields.jniData, (int)lpJniStorage); + //ALOGV("storing lpJniStorage: %x\n", (long)lpJniStorage); + env->SetLongField(thiz, javaAudioTrackFields.jniData, (jlong)lpJniStorage); - return AUDIOTRACK_SUCCESS; + return (jint) AUDIOTRACK_SUCCESS; // failures: native_init_failure: @@ -379,9 +379,9 @@ native_init_failure: env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_class); env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioTrack_ref); delete lpJniStorage; - env->SetIntField(thiz, javaAudioTrackFields.jniData, 0); + env->SetLongField(thiz, javaAudioTrackFields.jniData, 0); - return AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; + return (jint) AUDIOTRACK_ERROR_SETUP_NATIVEINITFAILED; } @@ -470,11 +470,11 @@ static void android_media_AudioTrack_native_release(JNIEnv *env, jobject thiz) lpTrack->stop(); // delete the JNI data - AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetIntField( + AudioTrackJniStorage* pJniStorage = (AudioTrackJniStorage *)env->GetLongField( thiz, javaAudioTrackFields.jniData); // reset the native resources in the Java object so any attempt to access // them after a call to release fails. - env->SetIntField(thiz, javaAudioTrackFields.jniData, 0); + env->SetLongField(thiz, javaAudioTrackFields.jniData, 0); if (pJniStorage) { Mutex::Autolock l(sLock); @@ -970,7 +970,7 @@ int register_android_media_AudioTrack(JNIEnv *env) // nativeTrackInJavaObj javaAudioTrackFields.nativeTrackInJavaObj = env->GetFieldID( audioTrackClass, - JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME, "I"); + JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME, "J"); if (javaAudioTrackFields.nativeTrackInJavaObj == NULL) { ALOGE("Can't find AudioTrack.%s", JAVA_NATIVETRACKINJAVAOBJ_FIELD_NAME); return -1; @@ -978,7 +978,7 @@ int register_android_media_AudioTrack(JNIEnv *env) // jniData; javaAudioTrackFields.jniData = env->GetFieldID( audioTrackClass, - JAVA_JNIDATA_FIELD_NAME, "I"); + JAVA_JNIDATA_FIELD_NAME, "J"); if (javaAudioTrackFields.jniData == NULL) { ALOGE("Can't find AudioTrack.%s", JAVA_JNIDATA_FIELD_NAME); return -1; diff --git a/core/jni/android_media_JetPlayer.cpp b/core/jni/android_media_JetPlayer.cpp index 5795aba1cb67..69f57118aa2c 100644 --- a/core/jni/android_media_JetPlayer.cpp +++ b/core/jni/android_media_JetPlayer.cpp @@ -87,12 +87,12 @@ android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this, if (result==EAS_SUCCESS) { // save our newly created C++ JetPlayer in the "nativePlayerInJavaObj" field // of the Java object (in mNativePlayerInJavaObj) - env->SetIntField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (int)lpJet); + env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, (jlong)lpJet); return JNI_TRUE; } else { ALOGE("android_media_JetPlayer_setup(): initialization failed with EAS error code %d", (int)result); delete lpJet; - env->SetIntField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0); + env->SetLongField(weak_this, javaJetPlayerFields.nativePlayerInJavaObj, 0); return JNI_FALSE; } } @@ -103,7 +103,7 @@ static void android_media_JetPlayer_finalize(JNIEnv *env, jobject thiz) { ALOGV("android_media_JetPlayer_finalize(): entering."); - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet != NULL) { lpJet->release(); @@ -119,7 +119,7 @@ static void android_media_JetPlayer_release(JNIEnv *env, jobject thiz) { android_media_JetPlayer_finalize(env, thiz); - env->SetIntField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0); + env->SetLongField(thiz, javaJetPlayerFields.nativePlayerInJavaObj, 0); ALOGV("android_media_JetPlayer_release() done"); } @@ -128,7 +128,7 @@ android_media_JetPlayer_release(JNIEnv *env, jobject thiz) static jboolean android_media_JetPlayer_loadFromFile(JNIEnv *env, jobject thiz, jstring path) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -165,7 +165,7 @@ static jboolean android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -195,7 +195,7 @@ android_media_JetPlayer_loadFromFileD(JNIEnv *env, jobject thiz, static jboolean android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -217,7 +217,7 @@ android_media_JetPlayer_closeFile(JNIEnv *env, jobject thiz) static jboolean android_media_JetPlayer_play(JNIEnv *env, jobject thiz) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -241,7 +241,7 @@ android_media_JetPlayer_play(JNIEnv *env, jobject thiz) static jboolean android_media_JetPlayer_pause(JNIEnv *env, jobject thiz) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -271,7 +271,7 @@ android_media_JetPlayer_queueSegment(JNIEnv *env, jobject thiz, jint segmentNum, jint libNum, jint repeatCount, jint transpose, jint muteFlags, jbyte userID) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -298,7 +298,7 @@ android_media_JetPlayer_queueSegmentMuteArray(JNIEnv *env, jobject thiz, jint segmentNum, jint libNum, jint repeatCount, jint transpose, jbooleanArray muteArray, jbyte userID) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -344,7 +344,7 @@ static jboolean android_media_JetPlayer_setMuteFlags(JNIEnv *env, jobject thiz, jint muteFlags /*unsigned?*/, jboolean bSync) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -369,7 +369,7 @@ static jboolean android_media_JetPlayer_setMuteArray(JNIEnv *env, jobject thiz, jbooleanArray muteArray, jboolean bSync) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -415,7 +415,7 @@ static jboolean android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz, jint trackId, jboolean muteFlag, jboolean bSync) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -441,7 +441,7 @@ android_media_JetPlayer_setMuteFlag(JNIEnv *env, jobject thiz, static jboolean android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -466,7 +466,7 @@ android_media_JetPlayer_triggerClip(JNIEnv *env, jobject thiz, jint clipId) static jboolean android_media_JetPlayer_clearQueue(JNIEnv *env, jobject thiz) { - JetPlayer *lpJet = (JetPlayer *)env->GetIntField( + JetPlayer *lpJet = (JetPlayer *)env->GetLongField( thiz, javaJetPlayerFields.nativePlayerInJavaObj); if (lpJet == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -533,7 +533,7 @@ int register_android_media_JetPlayer(JNIEnv *env) // Get the mNativePlayerInJavaObj variable field javaJetPlayerFields.nativePlayerInJavaObj = env->GetFieldID( jetPlayerClass, - JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "I"); + JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J"); if (javaJetPlayerFields.nativePlayerInJavaObj == NULL) { ALOGE("Can't find JetPlayer.%s", JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME); return -1; diff --git a/core/jni/android_media_RemoteDisplay.cpp b/core/jni/android_media_RemoteDisplay.cpp index 463be5e74f25..1cd3fbbadcb2 100644 --- a/core/jni/android_media_RemoteDisplay.cpp +++ b/core/jni/android_media_RemoteDisplay.cpp @@ -134,7 +134,7 @@ private: // ---------------------------------------------------------------------------- -static jint nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceStr) { +static jlong nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceStr) { ScopedUtfChars iface(env, ifaceStr); sp<IServiceManager> sm = defaultServiceManager(); @@ -155,20 +155,20 @@ static jint nativeListen(JNIEnv* env, jobject remoteDisplayObj, jstring ifaceStr } NativeRemoteDisplay* wrapper = new NativeRemoteDisplay(display, client); - return reinterpret_cast<jint>(wrapper); + return reinterpret_cast<jlong>(wrapper); } -static void nativePause(JNIEnv* env, jobject remoteDisplayObj, jint ptr) { +static void nativePause(JNIEnv* env, jobject remoteDisplayObj, jlong ptr) { NativeRemoteDisplay* wrapper = reinterpret_cast<NativeRemoteDisplay*>(ptr); wrapper->pause(); } -static void nativeResume(JNIEnv* env, jobject remoteDisplayObj, jint ptr) { +static void nativeResume(JNIEnv* env, jobject remoteDisplayObj, jlong ptr) { NativeRemoteDisplay* wrapper = reinterpret_cast<NativeRemoteDisplay*>(ptr); wrapper->resume(); } -static void nativeDispose(JNIEnv* env, jobject remoteDisplayObj, jint ptr) { +static void nativeDispose(JNIEnv* env, jobject remoteDisplayObj, jlong ptr) { NativeRemoteDisplay* wrapper = reinterpret_cast<NativeRemoteDisplay*>(ptr); delete wrapper; } @@ -176,13 +176,13 @@ static void nativeDispose(JNIEnv* env, jobject remoteDisplayObj, jint ptr) { // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { - {"nativeListen", "(Ljava/lang/String;)I", + {"nativeListen", "(Ljava/lang/String;)J", (void*)nativeListen }, - {"nativeDispose", "(I)V", + {"nativeDispose", "(J)V", (void*)nativeDispose }, - {"nativePause", "(I)V", + {"nativePause", "(J)V", (void*)nativePause }, - {"nativeResume", "(I)V", + {"nativeResume", "(J)V", (void*)nativeResume }, }; diff --git a/core/jni/android_media_ToneGenerator.cpp b/core/jni/android_media_ToneGenerator.cpp index 76e42bcaea26..ca00709e179c 100644 --- a/core/jni/android_media_ToneGenerator.cpp +++ b/core/jni/android_media_ToneGenerator.cpp @@ -39,9 +39,9 @@ struct fields_t { static fields_t fields; static jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, jint toneType, jint durationMs) { - ALOGV("android_media_ToneGenerator_startTone: %x", (int)thiz); + ALOGV("android_media_ToneGenerator_startTone: %p", thiz); - ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, + ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, fields.context); if (lpToneGen == NULL) { jniThrowRuntimeException(env, "Method called after release()"); @@ -52,12 +52,12 @@ static jboolean android_media_ToneGenerator_startTone(JNIEnv *env, jobject thiz, } static void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) { - ALOGV("android_media_ToneGenerator_stopTone: %x", (int)thiz); + ALOGV("android_media_ToneGenerator_stopTone: %p", thiz); - ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, + ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, fields.context); - ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)lpToneGen); + ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); if (lpToneGen == NULL) { jniThrowRuntimeException(env, "Method called after release()"); return; @@ -66,7 +66,7 @@ static void android_media_ToneGenerator_stopTone(JNIEnv *env, jobject thiz) { } static jint android_media_ToneGenerator_getAudioSessionId(JNIEnv *env, jobject thiz) { - ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, + ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, fields.context); if (lpToneGen == NULL) { jniThrowRuntimeException(env, "Method called after release()"); @@ -76,11 +76,11 @@ static jint android_media_ToneGenerator_getAudioSessionId(JNIEnv *env, jobject t } static void android_media_ToneGenerator_release(JNIEnv *env, jobject thiz) { - ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, + ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, fields.context); - ALOGV("android_media_ToneGenerator_release lpToneGen: %x", (int)lpToneGen); + ALOGV("android_media_ToneGenerator_release lpToneGen: %p", lpToneGen); - env->SetIntField(thiz, fields.context, 0); + env->SetLongField(thiz, fields.context, 0); delete lpToneGen; } @@ -89,11 +89,11 @@ static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, jint streamType, jint volume) { ToneGenerator *lpToneGen = new ToneGenerator((audio_stream_type_t) streamType, AudioSystem::linearToLog(volume), true); - env->SetIntField(thiz, fields.context, 0); + env->SetLongField(thiz, fields.context, 0); - ALOGV("android_media_ToneGenerator_native_setup jobject: %x", (int)thiz); + ALOGV("android_media_ToneGenerator_native_setup jobject: %p", thiz); - ALOGV("ToneGenerator lpToneGen: %x", (unsigned int)lpToneGen); + ALOGV("ToneGenerator lpToneGen: %p", lpToneGen); if (!lpToneGen->isInited()) { ALOGE("ToneGenerator init failed"); @@ -103,16 +103,16 @@ static void android_media_ToneGenerator_native_setup(JNIEnv *env, jobject thiz, } // Stow our new C++ ToneGenerator in an opaque field in the Java object. - env->SetIntField(thiz, fields.context, (int)lpToneGen); + env->SetLongField(thiz, fields.context, (jlong)lpToneGen); - ALOGV("ToneGenerator fields.context: %x", env->GetIntField(thiz, fields.context)); + ALOGV("ToneGenerator fields.context: %p", (void*) env->GetLongField(thiz, fields.context)); } static void android_media_ToneGenerator_native_finalize(JNIEnv *env, jobject thiz) { - ALOGV("android_media_ToneGenerator_native_finalize jobject: %x", (int)thiz); + ALOGV("android_media_ToneGenerator_native_finalize jobject: %p", thiz); - ToneGenerator *lpToneGen = (ToneGenerator *)env->GetIntField(thiz, + ToneGenerator *lpToneGen = (ToneGenerator *)env->GetLongField(thiz, fields.context); if (lpToneGen != NULL) { @@ -142,12 +142,12 @@ int register_android_media_ToneGenerator(JNIEnv *env) { return -1; } - fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.context == NULL) { ALOGE("Can't find ToneGenerator.mNativeContext"); return -1; } - ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %x", (unsigned int)fields.context); + ALOGV("register_android_media_ToneGenerator ToneGenerator fields.context: %p", fields.context); return AndroidRuntime::registerNativeMethods(env, "android/media/ToneGenerator", gMethods, NELEM(gMethods)); diff --git a/core/jni/android_os_MemoryFile.cpp b/core/jni/android_os_MemoryFile.cpp index 71341916ce68..88a3738de587 100644 --- a/core/jni/android_os_MemoryFile.cpp +++ b/core/jni/android_os_MemoryFile.cpp @@ -43,17 +43,17 @@ static jobject android_os_MemoryFile_open(JNIEnv* env, jobject clazz, jstring na return jniCreateFileDescriptor(env, result); } -static jint android_os_MemoryFile_mmap(JNIEnv* env, jobject clazz, jobject fileDescriptor, +static jlong android_os_MemoryFile_mmap(JNIEnv* env, jobject clazz, jobject fileDescriptor, jint length, jint prot) { int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); - jint result = (jint)mmap(NULL, length, prot, MAP_SHARED, fd, 0); + jlong result = (jlong)mmap(NULL, length, prot, MAP_SHARED, fd, 0); if (!result) jniThrowException(env, "java/io/IOException", "mmap failed"); return result; } -static void android_os_MemoryFile_munmap(JNIEnv* env, jobject clazz, jint addr, jint length) +static void android_os_MemoryFile_munmap(JNIEnv* env, jobject clazz, jlong addr, jint length) { int result = munmap((void *)addr, length); if (result < 0) @@ -70,7 +70,7 @@ static void android_os_MemoryFile_close(JNIEnv* env, jobject clazz, jobject file } static jint android_os_MemoryFile_read(JNIEnv* env, jobject clazz, - jobject fileDescriptor, jint address, jbyteArray buffer, jint srcOffset, jint destOffset, + jobject fileDescriptor, jlong address, jbyteArray buffer, jint srcOffset, jint destOffset, jint count, jboolean unpinned) { int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); @@ -89,7 +89,7 @@ static jint android_os_MemoryFile_read(JNIEnv* env, jobject clazz, } static jint android_os_MemoryFile_write(JNIEnv* env, jobject clazz, - jobject fileDescriptor, jint address, jbyteArray buffer, jint srcOffset, jint destOffset, + jobject fileDescriptor, jlong address, jbyteArray buffer, jint srcOffset, jint destOffset, jint count, jboolean unpinned) { int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); @@ -138,11 +138,11 @@ static jint android_os_MemoryFile_get_size(JNIEnv* env, jobject clazz, static const JNINativeMethod methods[] = { {"native_open", "(Ljava/lang/String;I)Ljava/io/FileDescriptor;", (void*)android_os_MemoryFile_open}, - {"native_mmap", "(Ljava/io/FileDescriptor;II)I", (void*)android_os_MemoryFile_mmap}, - {"native_munmap", "(II)V", (void*)android_os_MemoryFile_munmap}, + {"native_mmap", "(Ljava/io/FileDescriptor;II)J", (void*)android_os_MemoryFile_mmap}, + {"native_munmap", "(JI)V", (void*)android_os_MemoryFile_munmap}, {"native_close", "(Ljava/io/FileDescriptor;)V", (void*)android_os_MemoryFile_close}, - {"native_read", "(Ljava/io/FileDescriptor;I[BIIIZ)I", (void*)android_os_MemoryFile_read}, - {"native_write", "(Ljava/io/FileDescriptor;I[BIIIZ)V", (void*)android_os_MemoryFile_write}, + {"native_read", "(Ljava/io/FileDescriptor;J[BIIIZ)I", (void*)android_os_MemoryFile_read}, + {"native_write", "(Ljava/io/FileDescriptor;J[BIIIZ)V", (void*)android_os_MemoryFile_write}, {"native_pin", "(Ljava/io/FileDescriptor;Z)V", (void*)android_os_MemoryFile_pin}, {"native_get_size", "(Ljava/io/FileDescriptor;)I", (void*)android_os_MemoryFile_get_size} diff --git a/core/jni/android_os_MessageQueue.cpp b/core/jni/android_os_MessageQueue.cpp index c9c372089288..a8ed89554261 100644 --- a/core/jni/android_os_MessageQueue.cpp +++ b/core/jni/android_os_MessageQueue.cpp @@ -110,11 +110,11 @@ void NativeMessageQueue::wake() { // ---------------------------------------------------------------------------- sp<MessageQueue> android_os_MessageQueue_getMessageQueue(JNIEnv* env, jobject messageQueueObj) { - jint intPtr = env->GetIntField(messageQueueObj, gMessageQueueClassInfo.mPtr); - return reinterpret_cast<NativeMessageQueue*>(intPtr); + jlong ptr = env->GetLongField(messageQueueObj, gMessageQueueClassInfo.mPtr); + return reinterpret_cast<NativeMessageQueue*>(ptr); } -static jint android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) { +static jlong android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) { NativeMessageQueue* nativeMessageQueue = new NativeMessageQueue(); if (!nativeMessageQueue) { jniThrowRuntimeException(env, "Unable to allocate native queue"); @@ -122,26 +122,26 @@ static jint android_os_MessageQueue_nativeInit(JNIEnv* env, jclass clazz) { } nativeMessageQueue->incStrong(env); - return reinterpret_cast<jint>(nativeMessageQueue); + return reinterpret_cast<jlong>(nativeMessageQueue); } -static void android_os_MessageQueue_nativeDestroy(JNIEnv* env, jclass clazz, jint ptr) { +static void android_os_MessageQueue_nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) { NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); nativeMessageQueue->decStrong(env); } static void android_os_MessageQueue_nativePollOnce(JNIEnv* env, jclass clazz, - jint ptr, jint timeoutMillis) { + jlong ptr, jint timeoutMillis) { NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); nativeMessageQueue->pollOnce(env, timeoutMillis); } -static void android_os_MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jint ptr) { +static void android_os_MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jlong ptr) { NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); return nativeMessageQueue->wake(); } -static jboolean android_os_MessageQueue_nativeIsIdling(JNIEnv* env, jclass clazz, jint ptr) { +static jboolean android_os_MessageQueue_nativeIsIdling(JNIEnv* env, jclass clazz, jlong ptr) { NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); return nativeMessageQueue->getLooper()->isIdling(); } @@ -150,11 +150,11 @@ static jboolean android_os_MessageQueue_nativeIsIdling(JNIEnv* env, jclass clazz static JNINativeMethod gMessageQueueMethods[] = { /* name, signature, funcPtr */ - { "nativeInit", "()I", (void*)android_os_MessageQueue_nativeInit }, - { "nativeDestroy", "(I)V", (void*)android_os_MessageQueue_nativeDestroy }, - { "nativePollOnce", "(II)V", (void*)android_os_MessageQueue_nativePollOnce }, - { "nativeWake", "(I)V", (void*)android_os_MessageQueue_nativeWake }, - { "nativeIsIdling", "(I)Z", (void*)android_os_MessageQueue_nativeIsIdling } + { "nativeInit", "()J", (void*)android_os_MessageQueue_nativeInit }, + { "nativeDestroy", "(J)V", (void*)android_os_MessageQueue_nativeDestroy }, + { "nativePollOnce", "(JI)V", (void*)android_os_MessageQueue_nativePollOnce }, + { "nativeWake", "(J)V", (void*)android_os_MessageQueue_nativeWake }, + { "nativeIsIdling", "(J)Z", (void*)android_os_MessageQueue_nativeIsIdling } }; #define FIND_CLASS(var, className) \ @@ -174,7 +174,7 @@ int register_android_os_MessageQueue(JNIEnv* env) { FIND_CLASS(clazz, "android/os/MessageQueue"); GET_FIELD_ID(gMessageQueueClassInfo.mPtr, clazz, - "mPtr", "I"); + "mPtr", "J"); return 0; } diff --git a/core/jni/android_view_InputChannel.cpp b/core/jni/android_view_InputChannel.cpp index ce475e0998f3..d667920045e7 100644 --- a/core/jni/android_view_InputChannel.cpp +++ b/core/jni/android_view_InputChannel.cpp @@ -81,14 +81,14 @@ void NativeInputChannel::invokeAndRemoveDisposeCallback(JNIEnv* env, jobject obj static NativeInputChannel* android_view_InputChannel_getNativeInputChannel(JNIEnv* env, jobject inputChannelObj) { - jint intPtr = env->GetIntField(inputChannelObj, gInputChannelClassInfo.mPtr); - return reinterpret_cast<NativeInputChannel*>(intPtr); + jlong longPtr = env->GetLongField(inputChannelObj, gInputChannelClassInfo.mPtr); + return reinterpret_cast<NativeInputChannel*>(longPtr); } static void android_view_InputChannel_setNativeInputChannel(JNIEnv* env, jobject inputChannelObj, NativeInputChannel* nativeInputChannel) { - env->SetIntField(inputChannelObj, gInputChannelClassInfo.mPtr, - reinterpret_cast<jint>(nativeInputChannel)); + env->SetLongField(inputChannelObj, gInputChannelClassInfo.mPtr, + reinterpret_cast<jlong>(nativeInputChannel)); } sp<InputChannel> android_view_InputChannel_getInputChannel(JNIEnv* env, jobject inputChannelObj) { @@ -296,7 +296,7 @@ int register_android_view_InputChannel(JNIEnv* env) { FIND_CLASS(gInputChannelClassInfo.clazz, "android/view/InputChannel"); GET_FIELD_ID(gInputChannelClassInfo.mPtr, gInputChannelClassInfo.clazz, - "mPtr", "I"); + "mPtr", "J"); GET_METHOD_ID(gInputChannelClassInfo.ctor, gInputChannelClassInfo.clazz, "<init>", "()V"); diff --git a/core/jni/android_view_InputEventReceiver.cpp b/core/jni/android_view_InputEventReceiver.cpp index 92a3e62a8d5f..f36bf31daa5f 100644 --- a/core/jni/android_view_InputEventReceiver.cpp +++ b/core/jni/android_view_InputEventReceiver.cpp @@ -330,7 +330,7 @@ status_t NativeInputEventReceiver::consumeEvents(JNIEnv* env, } -static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, +static jlong nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, jobject inputChannelObj, jobject messageQueueObj) { sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, inputChannelObj); @@ -356,17 +356,17 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject receiverWeak, } receiver->incStrong(gInputEventReceiverClassInfo.clazz); // retain a reference for the object - return reinterpret_cast<jint>(receiver.get()); + return reinterpret_cast<jlong>(receiver.get()); } -static void nativeDispose(JNIEnv* env, jclass clazz, jint receiverPtr) { +static void nativeDispose(JNIEnv* env, jclass clazz, jlong receiverPtr) { sp<NativeInputEventReceiver> receiver = reinterpret_cast<NativeInputEventReceiver*>(receiverPtr); receiver->dispose(); receiver->decStrong(gInputEventReceiverClassInfo.clazz); // drop reference held by the object } -static void nativeFinishInputEvent(JNIEnv* env, jclass clazz, jint receiverPtr, +static void nativeFinishInputEvent(JNIEnv* env, jclass clazz, jlong receiverPtr, jint seq, jboolean handled) { sp<NativeInputEventReceiver> receiver = reinterpret_cast<NativeInputEventReceiver*>(receiverPtr); @@ -378,7 +378,7 @@ static void nativeFinishInputEvent(JNIEnv* env, jclass clazz, jint receiverPtr, } } -static bool nativeConsumeBatchedInputEvents(JNIEnv* env, jclass clazz, jint receiverPtr, +static jboolean nativeConsumeBatchedInputEvents(JNIEnv* env, jclass clazz, jlong receiverPtr, jlong frameTimeNanos) { sp<NativeInputEventReceiver> receiver = reinterpret_cast<NativeInputEventReceiver*>(receiverPtr); @@ -389,22 +389,22 @@ static bool nativeConsumeBatchedInputEvents(JNIEnv* env, jclass clazz, jint rece String8 message; message.appendFormat("Failed to consume batched input event. status=%d", status); jniThrowRuntimeException(env, message.string()); - return false; + return JNI_FALSE; } - return consumedBatch; + return consumedBatch ? JNI_TRUE : JNI_FALSE; } static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/view/InputChannel;Landroid/os/MessageQueue;)I", + "(Ljava/lang/ref/WeakReference;Landroid/view/InputChannel;Landroid/os/MessageQueue;)J", (void*)nativeInit }, - { "nativeDispose", "(I)V", + { "nativeDispose", "(J)V", (void*)nativeDispose }, - { "nativeFinishInputEvent", "(IIZ)V", + { "nativeFinishInputEvent", "(JIZ)V", (void*)nativeFinishInputEvent }, - { "nativeConsumeBatchedInputEvents", "(IJ)Z", + { "nativeConsumeBatchedInputEvents", "(JJ)Z", (void*)nativeConsumeBatchedInputEvents }, }; diff --git a/core/jni/android_view_InputEventSender.cpp b/core/jni/android_view_InputEventSender.cpp index e4b65a18bf47..f156b9ada99e 100644 --- a/core/jni/android_view_InputEventSender.cpp +++ b/core/jni/android_view_InputEventSender.cpp @@ -230,7 +230,7 @@ status_t NativeInputEventSender::receiveFinishedSignals(JNIEnv* env) { } -static jint nativeInit(JNIEnv* env, jclass clazz, jobject senderWeak, +static jlong nativeInit(JNIEnv* env, jclass clazz, jobject senderWeak, jobject inputChannelObj, jobject messageQueueObj) { sp<InputChannel> inputChannel = android_view_InputChannel_getInputChannel(env, inputChannelObj); @@ -256,17 +256,17 @@ static jint nativeInit(JNIEnv* env, jclass clazz, jobject senderWeak, } sender->incStrong(gInputEventSenderClassInfo.clazz); // retain a reference for the object - return reinterpret_cast<jint>(sender.get()); + return reinterpret_cast<jlong>(sender.get()); } -static void nativeDispose(JNIEnv* env, jclass clazz, jint senderPtr) { +static void nativeDispose(JNIEnv* env, jclass clazz, jlong senderPtr) { sp<NativeInputEventSender> sender = reinterpret_cast<NativeInputEventSender*>(senderPtr); sender->dispose(); sender->decStrong(gInputEventSenderClassInfo.clazz); // drop reference held by the object } -static jboolean nativeSendKeyEvent(JNIEnv* env, jclass clazz, jint senderPtr, +static jboolean nativeSendKeyEvent(JNIEnv* env, jclass clazz, jlong senderPtr, jint seq, jobject eventObj) { sp<NativeInputEventSender> sender = reinterpret_cast<NativeInputEventSender*>(senderPtr); @@ -276,7 +276,7 @@ static jboolean nativeSendKeyEvent(JNIEnv* env, jclass clazz, jint senderPtr, return !status; } -static jboolean nativeSendMotionEvent(JNIEnv* env, jclass clazz, jint senderPtr, +static jboolean nativeSendMotionEvent(JNIEnv* env, jclass clazz, jlong senderPtr, jint seq, jobject eventObj) { sp<NativeInputEventSender> sender = reinterpret_cast<NativeInputEventSender*>(senderPtr); @@ -289,13 +289,13 @@ static jboolean nativeSendMotionEvent(JNIEnv* env, jclass clazz, jint senderPtr, static JNINativeMethod gMethods[] = { /* name, signature, funcPtr */ { "nativeInit", - "(Ljava/lang/ref/WeakReference;Landroid/view/InputChannel;Landroid/os/MessageQueue;)I", + "(Ljava/lang/ref/WeakReference;Landroid/view/InputChannel;Landroid/os/MessageQueue;)J", (void*)nativeInit }, - { "nativeDispose", "(I)V", + { "nativeDispose", "(J)V", (void*)nativeDispose }, - { "nativeSendKeyEvent", "(IILandroid/view/KeyEvent;)Z", + { "nativeSendKeyEvent", "(JILandroid/view/KeyEvent;)Z", (void*)nativeSendKeyEvent }, - { "nativeSendMotionEvent", "(IILandroid/view/MotionEvent;)Z", + { "nativeSendMotionEvent", "(JILandroid/view/MotionEvent;)Z", (void*)nativeSendMotionEvent }, }; diff --git a/core/jni/android_view_InputQueue.cpp b/core/jni/android_view_InputQueue.cpp index 7532c9da49e1..21b73b1480dd 100644 --- a/core/jni/android_view_InputQueue.cpp +++ b/core/jni/android_view_InputQueue.cpp @@ -151,7 +151,7 @@ void InputQueue::handleMessage(const Message& message) { mFinishedEvents.removeAt(0); } env->CallVoidMethod(inputQueueObj.get(), gInputQueueClassInfo.finishInputEvent, - reinterpret_cast<jint>(event), handled); + reinterpret_cast<jlong>(event), handled); recycleInputEvent(event); } break; @@ -193,7 +193,7 @@ InputQueue* InputQueue::createQueue(jobject inputQueueObj, const sp<Looper>& loo return new InputQueue(inputQueueObj, looper, pipeFds[0], pipeFds[1]); } -static jint nativeInit(JNIEnv* env, jobject clazz, jobject queueWeak, jobject jMsgQueue) { +static jlong nativeInit(JNIEnv* env, jobject clazz, jobject queueWeak, jobject jMsgQueue) { sp<MessageQueue> messageQueue = android_os_MessageQueue_getMessageQueue(env, jMsgQueue); if (messageQueue == NULL) { jniThrowRuntimeException(env, "MessageQueue is not initialized."); @@ -205,16 +205,16 @@ static jint nativeInit(JNIEnv* env, jobject clazz, jobject queueWeak, jobject jM return 0; } queue->incStrong(&gInputQueueClassInfo); - return reinterpret_cast<jint>(queue.get()); + return reinterpret_cast<jlong>(queue.get()); } -static void nativeDispose(JNIEnv* env, jobject clazz, jint ptr) { +static void nativeDispose(JNIEnv* env, jobject clazz, jlong ptr) { sp<InputQueue> queue = reinterpret_cast<InputQueue*>(ptr); queue->detachLooper(); queue->decStrong(&gInputQueueClassInfo); } -static jint nativeSendKeyEvent(JNIEnv* env, jobject clazz, jint ptr, jobject eventObj, +static jlong nativeSendKeyEvent(JNIEnv* env, jobject clazz, jlong ptr, jobject eventObj, jboolean predispatch) { InputQueue* queue = reinterpret_cast<InputQueue*>(ptr); KeyEvent* event = queue->createKeyEvent(); @@ -230,10 +230,10 @@ static jint nativeSendKeyEvent(JNIEnv* env, jobject clazz, jint ptr, jobject eve } queue->enqueueEvent(event); - return reinterpret_cast<jint>(event); + return reinterpret_cast<jlong>(event); } -static jint nativeSendMotionEvent(JNIEnv* env, jobject clazz, jint ptr, jobject eventObj) { +static jlong nativeSendMotionEvent(JNIEnv* env, jobject clazz, jlong ptr, jobject eventObj) { sp<InputQueue> queue = reinterpret_cast<InputQueue*>(ptr); MotionEvent* originalEvent = android_view_MotionEvent_getNativePtr(env, eventObj); if (!originalEvent) { @@ -243,15 +243,15 @@ static jint nativeSendMotionEvent(JNIEnv* env, jobject clazz, jint ptr, jobject MotionEvent* event = queue->createMotionEvent(); event->copyFrom(originalEvent, true /* keepHistory */); queue->enqueueEvent(event); - return reinterpret_cast<jint>(event); + return reinterpret_cast<jlong>(event); } static const JNINativeMethod g_methods[] = { - { "nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;)I", + { "nativeInit", "(Ljava/lang/ref/WeakReference;Landroid/os/MessageQueue;)J", (void*) nativeInit }, - { "nativeDispose", "(I)V", (void*) nativeDispose }, - { "nativeSendKeyEvent", "(ILandroid/view/KeyEvent;Z)I", (void*) nativeSendKeyEvent }, - { "nativeSendMotionEvent", "(ILandroid/view/MotionEvent;)I", (void*) nativeSendMotionEvent }, + { "nativeDispose", "(J)V", (void*) nativeDispose }, + { "nativeSendKeyEvent", "(JLandroid/view/KeyEvent;Z)J", (void*) nativeSendKeyEvent }, + { "nativeSendMotionEvent", "(JLandroid/view/MotionEvent;)J", (void*) nativeSendMotionEvent }, }; static const char* const kInputQueuePathName = "android/view/InputQueue"; @@ -272,7 +272,7 @@ int register_android_view_InputQueue(JNIEnv* env) { jclass clazz; FIND_CLASS(clazz, kInputQueuePathName); - GET_METHOD_ID(gInputQueueClassInfo.finishInputEvent, clazz, "finishInputEvent", "(IZ)V"); + GET_METHOD_ID(gInputQueueClassInfo.finishInputEvent, clazz, "finishInputEvent", "(JZ)V"); return AndroidRuntime::registerNativeMethods( env, kInputQueuePathName, diff --git a/core/jni/android_view_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp index ffe2deaba8c6..62d51296cbbf 100644 --- a/core/jni/android_view_KeyCharacterMap.cpp +++ b/core/jni/android_view_KeyCharacterMap.cpp @@ -75,10 +75,10 @@ jobject android_view_KeyCharacterMap_create(JNIEnv* env, int32_t deviceId, } return env->NewObject(gKeyCharacterMapClassInfo.clazz, gKeyCharacterMapClassInfo.ctor, - reinterpret_cast<jint>(map)); + reinterpret_cast<jlong>(map)); } -static jint nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) { +static jlong nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) { Parcel* parcel = parcelForJavaObject(env, parcelObj); if (!parcel) { return 0; @@ -95,10 +95,10 @@ static jint nativeReadFromParcel(JNIEnv *env, jobject clazz, jobject parcelObj) } NativeKeyCharacterMap* map = new NativeKeyCharacterMap(deviceId, kcm); - return reinterpret_cast<jint>(map); + return reinterpret_cast<jlong>(map); } -static void nativeWriteToParcel(JNIEnv* env, jobject clazz, jint ptr, jobject parcelObj) { +static void nativeWriteToParcel(JNIEnv* env, jobject clazz, jlong ptr, jobject parcelObj) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); Parcel* parcel = parcelForJavaObject(env, parcelObj); if (parcel) { @@ -107,18 +107,18 @@ static void nativeWriteToParcel(JNIEnv* env, jobject clazz, jint ptr, jobject pa } } -static void nativeDispose(JNIEnv *env, jobject clazz, jint ptr) { +static void nativeDispose(JNIEnv *env, jobject clazz, jlong ptr) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); delete map; } -static jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jint ptr, +static jchar nativeGetCharacter(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode, jint metaState) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); return map->getMap()->getCharacter(keyCode, metaState); } -static jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, +static jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode, jint metaState, jobject fallbackActionObj) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); KeyCharacterMap::FallbackAction fallbackAction; @@ -133,12 +133,12 @@ static jboolean nativeGetFallbackAction(JNIEnv *env, jobject clazz, jint ptr, ji return result; } -static jchar nativeGetNumber(JNIEnv *env, jobject clazz, jint ptr, jint keyCode) { +static jchar nativeGetNumber(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); return map->getMap()->getNumber(keyCode); } -static jchar nativeGetMatch(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, +static jchar nativeGetMatch(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode, jcharArray charsArray, jint metaState) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); @@ -154,17 +154,17 @@ static jchar nativeGetMatch(JNIEnv *env, jobject clazz, jint ptr, jint keyCode, return result; } -static jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jint ptr, jint keyCode) { +static jchar nativeGetDisplayLabel(JNIEnv *env, jobject clazz, jlong ptr, jint keyCode) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); return map->getMap()->getDisplayLabel(keyCode); } -static jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jint ptr) { +static jint nativeGetKeyboardType(JNIEnv *env, jobject clazz, jlong ptr) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); return map->getMap()->getKeyboardType(); } -static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jint ptr, +static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jlong ptr, jcharArray charsArray) { NativeKeyCharacterMap* map = reinterpret_cast<NativeKeyCharacterMap*>(ptr); @@ -199,25 +199,25 @@ static jobjectArray nativeGetEvents(JNIEnv *env, jobject clazz, jint ptr, static JNINativeMethod g_methods[] = { /* name, signature, funcPtr */ - { "nativeReadFromParcel", "(Landroid/os/Parcel;)I", + { "nativeReadFromParcel", "(Landroid/os/Parcel;)J", (void*)nativeReadFromParcel }, - { "nativeWriteToParcel", "(ILandroid/os/Parcel;)V", + { "nativeWriteToParcel", "(JLandroid/os/Parcel;)V", (void*)nativeWriteToParcel }, - { "nativeDispose", "(I)V", + { "nativeDispose", "(J)V", (void*)nativeDispose }, - { "nativeGetCharacter", "(III)C", + { "nativeGetCharacter", "(JII)C", (void*)nativeGetCharacter }, - { "nativeGetFallbackAction", "(IIILandroid/view/KeyCharacterMap$FallbackAction;)Z", + { "nativeGetFallbackAction", "(JIILandroid/view/KeyCharacterMap$FallbackAction;)Z", (void*)nativeGetFallbackAction }, - { "nativeGetNumber", "(II)C", + { "nativeGetNumber", "(JI)C", (void*)nativeGetNumber }, - { "nativeGetMatch", "(II[CI)C", + { "nativeGetMatch", "(JI[CI)C", (void*)nativeGetMatch }, - { "nativeGetDisplayLabel", "(II)C", + { "nativeGetDisplayLabel", "(JI)C", (void*)nativeGetDisplayLabel }, - { "nativeGetKeyboardType", "(I)I", + { "nativeGetKeyboardType", "(J)I", (void*)nativeGetKeyboardType }, - { "nativeGetEvents", "(I[C)[Landroid/view/KeyEvent;", + { "nativeGetEvents", "(J[C)[Landroid/view/KeyEvent;", (void*)nativeGetEvents }, }; @@ -239,7 +239,7 @@ int register_android_view_KeyCharacterMap(JNIEnv* env) gKeyCharacterMapClassInfo.clazz = jclass(env->NewGlobalRef(gKeyCharacterMapClassInfo.clazz)); GET_METHOD_ID(gKeyCharacterMapClassInfo.ctor, gKeyCharacterMapClassInfo.clazz, - "<init>", "(I)V"); + "<init>", "(J)V"); FIND_CLASS(gKeyEventClassInfo.clazz, "android/view/KeyEvent"); gKeyEventClassInfo.clazz = jclass(env->NewGlobalRef(gKeyEventClassInfo.clazz)); diff --git a/core/jni/android_view_MotionEvent.cpp b/core/jni/android_view_MotionEvent.cpp index f1b90e1ecf64..76e145b782f0 100644 --- a/core/jni/android_view_MotionEvent.cpp +++ b/core/jni/android_view_MotionEvent.cpp @@ -67,13 +67,13 @@ MotionEvent* android_view_MotionEvent_getNativePtr(JNIEnv* env, jobject eventObj return NULL; } return reinterpret_cast<MotionEvent*>( - env->GetIntField(eventObj, gMotionEventClassInfo.mNativePtr)); + env->GetLongField(eventObj, gMotionEventClassInfo.mNativePtr)); } static void android_view_MotionEvent_setNativePtr(JNIEnv* env, jobject eventObj, MotionEvent* event) { - env->SetIntField(eventObj, gMotionEventClassInfo.mNativePtr, - reinterpret_cast<int>(event)); + env->SetLongField(eventObj, gMotionEventClassInfo.mNativePtr, + reinterpret_cast<jlong>(event)); } jobject android_view_MotionEvent_obtainAsCopy(JNIEnv* env, const MotionEvent* event) { @@ -334,8 +334,8 @@ static void pointerPropertiesFromNative(JNIEnv* env, const PointerProperties* po // ---------------------------------------------------------------------------- -static jint android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz, - jint nativePtr, +static jlong android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz, + jlong nativePtr, jint deviceId, jint source, jint action, jint flags, jint edgeFlags, jint metaState, jint buttonState, jfloat xOffset, jfloat yOffset, jfloat xPrecision, jfloat yPrecision, @@ -377,7 +377,7 @@ static jint android_view_MotionEvent_nativeInitialize(JNIEnv* env, jclass clazz, xOffset, yOffset, xPrecision, yPrecision, downTimeNanos, eventTimeNanos, pointerCount, pointerProperties, rawPointerCoords); - return reinterpret_cast<jint>(event); + return reinterpret_cast<jlong>(event); Error: if (!nativePtr) { @@ -386,25 +386,25 @@ Error: return 0; } -static jint android_view_MotionEvent_nativeCopy(JNIEnv* env, jclass clazz, - jint destNativePtr, jint sourceNativePtr, jboolean keepHistory) { +static jlong android_view_MotionEvent_nativeCopy(JNIEnv* env, jclass clazz, + jlong destNativePtr, jlong sourceNativePtr, jboolean keepHistory) { MotionEvent* destEvent = reinterpret_cast<MotionEvent*>(destNativePtr); if (!destEvent) { destEvent = new MotionEvent(); } MotionEvent* sourceEvent = reinterpret_cast<MotionEvent*>(sourceNativePtr); destEvent->copyFrom(sourceEvent, keepHistory); - return reinterpret_cast<jint>(destEvent); + return reinterpret_cast<jlong>(destEvent); } static void android_view_MotionEvent_nativeDispose(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); delete event; } static void android_view_MotionEvent_nativeAddBatch(JNIEnv* env, jclass clazz, - jint nativePtr, jlong eventTimeNanos, jobjectArray pointerCoordsObjArray, + jlong nativePtr, jlong eventTimeNanos, jobjectArray pointerCoordsObjArray, jint metaState) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); @@ -430,127 +430,127 @@ static void android_view_MotionEvent_nativeAddBatch(JNIEnv* env, jclass clazz, } static jint android_view_MotionEvent_nativeGetDeviceId(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getDeviceId(); } static jint android_view_MotionEvent_nativeGetSource(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getSource(); } static void android_view_MotionEvent_nativeSetSource(JNIEnv* env, jclass clazz, - jint nativePtr, jint source) { + jlong nativePtr, jint source) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->setSource(source); } static jint android_view_MotionEvent_nativeGetAction(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getAction(); } static void android_view_MotionEvent_nativeSetAction(JNIEnv* env, jclass clazz, - jint nativePtr, jint action) { + jlong nativePtr, jint action) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->setAction(action); } static jboolean android_view_MotionEvent_nativeIsTouchEvent(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->isTouchEvent(); } static jint android_view_MotionEvent_nativeGetFlags(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getFlags(); } static void android_view_MotionEvent_nativeSetFlags(JNIEnv* env, jclass clazz, - jint nativePtr, jint flags) { + jlong nativePtr, jint flags) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->setFlags(flags); } static jint android_view_MotionEvent_nativeGetEdgeFlags(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getEdgeFlags(); } static void android_view_MotionEvent_nativeSetEdgeFlags(JNIEnv* env, jclass clazz, - jint nativePtr, jint edgeFlags) { + jlong nativePtr, jint edgeFlags) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->setEdgeFlags(edgeFlags); } static jint android_view_MotionEvent_nativeGetMetaState(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getMetaState(); } static jint android_view_MotionEvent_nativeGetButtonState(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getButtonState(); } static void android_view_MotionEvent_nativeOffsetLocation(JNIEnv* env, jclass clazz, - jint nativePtr, jfloat deltaX, jfloat deltaY) { + jlong nativePtr, jfloat deltaX, jfloat deltaY) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->offsetLocation(deltaX, deltaY); } static jfloat android_view_MotionEvent_nativeGetXOffset(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getXOffset(); } static jfloat android_view_MotionEvent_nativeGetYOffset(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getYOffset(); } static jfloat android_view_MotionEvent_nativeGetXPrecision(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getXPrecision(); } static jfloat android_view_MotionEvent_nativeGetYPrecision(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getYPrecision(); } static jlong android_view_MotionEvent_nativeGetDownTimeNanos(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return event->getDownTime(); } static void android_view_MotionEvent_nativeSetDownTimeNanos(JNIEnv* env, jclass clazz, - jint nativePtr, jlong downTimeNanos) { + jlong nativePtr, jlong downTimeNanos) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->setDownTime(downTimeNanos); } static jint android_view_MotionEvent_nativeGetPointerCount(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return jint(event->getPointerCount()); } static jint android_view_MotionEvent_nativeGetPointerId(JNIEnv* env, jclass clazz, - jint nativePtr, jint pointerIndex) { + jlong nativePtr, jint pointerIndex) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount)) { @@ -560,7 +560,7 @@ static jint android_view_MotionEvent_nativeGetPointerId(JNIEnv* env, jclass claz } static jint android_view_MotionEvent_nativeGetToolType(JNIEnv* env, jclass clazz, - jint nativePtr, jint pointerIndex) { + jlong nativePtr, jint pointerIndex) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount)) { @@ -570,19 +570,19 @@ static jint android_view_MotionEvent_nativeGetToolType(JNIEnv* env, jclass clazz } static jint android_view_MotionEvent_nativeFindPointerIndex(JNIEnv* env, jclass clazz, - jint nativePtr, jint pointerId) { + jlong nativePtr, jint pointerId) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return jint(event->findPointerIndex(pointerId)); } static jint android_view_MotionEvent_nativeGetHistorySize(JNIEnv* env, jclass clazz, - jint nativePtr) { + jlong nativePtr) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); return jint(event->getHistorySize()); } static jlong android_view_MotionEvent_nativeGetEventTimeNanos(JNIEnv* env, jclass clazz, - jint nativePtr, jint historyPos) { + jlong nativePtr, jint historyPos) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); if (historyPos == HISTORY_CURRENT) { return event->getEventTime(); @@ -596,7 +596,7 @@ static jlong android_view_MotionEvent_nativeGetEventTimeNanos(JNIEnv* env, jclas } static jfloat android_view_MotionEvent_nativeGetRawAxisValue(JNIEnv* env, jclass clazz, - jint nativePtr, jint axis, jint pointerIndex, jint historyPos) { + jlong nativePtr, jint axis, jint pointerIndex, jint historyPos) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount)) { @@ -615,7 +615,7 @@ static jfloat android_view_MotionEvent_nativeGetRawAxisValue(JNIEnv* env, jclass } static jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass clazz, - jint nativePtr, jint axis, jint pointerIndex, jint historyPos) { + jlong nativePtr, jint axis, jint pointerIndex, jint historyPos) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount)) { @@ -634,7 +634,7 @@ static jfloat android_view_MotionEvent_nativeGetAxisValue(JNIEnv* env, jclass cl } static void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass clazz, - jint nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) { + jlong nativePtr, jint pointerIndex, jint historyPos, jobject outPointerCoordsObj) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount) @@ -657,7 +657,7 @@ static void android_view_MotionEvent_nativeGetPointerCoords(JNIEnv* env, jclass } static void android_view_MotionEvent_nativeGetPointerProperties(JNIEnv* env, jclass clazz, - jint nativePtr, jint pointerIndex, jobject outPointerPropertiesObj) { + jlong nativePtr, jint pointerIndex, jobject outPointerPropertiesObj) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); size_t pointerCount = event->getPointerCount(); if (!validatePointerIndex(env, pointerIndex, pointerCount) @@ -670,13 +670,13 @@ static void android_view_MotionEvent_nativeGetPointerProperties(JNIEnv* env, jcl } static void android_view_MotionEvent_nativeScale(JNIEnv* env, jclass clazz, - jint nativePtr, jfloat scale) { + jlong nativePtr, jfloat scale) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); event->scale(scale); } static void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz, - jint nativePtr, jobject matrixObj) { + jlong nativePtr, jobject matrixObj) { SkMatrix* matrix = android_graphics_Matrix_getSkMatrix(env, matrixObj); MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); @@ -693,8 +693,8 @@ static void android_view_MotionEvent_nativeTransform(JNIEnv* env, jclass clazz, event->transform(m); } -static jint android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass clazz, - jint nativePtr, jobject parcelObj) { +static jlong android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass clazz, + jlong nativePtr, jobject parcelObj) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); if (!event) { event = new MotionEvent(); @@ -710,11 +710,11 @@ static jint android_view_MotionEvent_nativeReadFromParcel(JNIEnv* env, jclass cl jniThrowRuntimeException(env, "Failed to read MotionEvent parcel."); return 0; } - return reinterpret_cast<jint>(event); + return reinterpret_cast<jlong>(event); } static void android_view_MotionEvent_nativeWriteToParcel(JNIEnv* env, jclass clazz, - jint nativePtr, jobject parcelObj) { + jlong nativePtr, jobject parcelObj) { MotionEvent* event = reinterpret_cast<MotionEvent*>(nativePtr); Parcel* parcel = parcelForJavaObject(env, parcelObj); @@ -729,116 +729,116 @@ static void android_view_MotionEvent_nativeWriteToParcel(JNIEnv* env, jclass cla static JNINativeMethod gMotionEventMethods[] = { /* name, signature, funcPtr */ { "nativeInitialize", - "(IIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;" - "[Landroid/view/MotionEvent$PointerCoords;)I", + "(JIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;" + "[Landroid/view/MotionEvent$PointerCoords;)J", (void*)android_view_MotionEvent_nativeInitialize }, { "nativeCopy", - "(IIZ)I", + "(JJZ)J", (void*)android_view_MotionEvent_nativeCopy }, { "nativeDispose", - "(I)V", + "(J)V", (void*)android_view_MotionEvent_nativeDispose }, { "nativeAddBatch", - "(IJ[Landroid/view/MotionEvent$PointerCoords;I)V", + "(JJ[Landroid/view/MotionEvent$PointerCoords;I)V", (void*)android_view_MotionEvent_nativeAddBatch }, { "nativeGetDeviceId", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetDeviceId }, { "nativeGetSource", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetSource }, { "nativeSetSource", - "(II)I", + "(JI)I", (void*)android_view_MotionEvent_nativeSetSource }, { "nativeGetAction", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetAction }, { "nativeSetAction", - "(II)V", + "(JI)V", (void*)android_view_MotionEvent_nativeSetAction }, { "nativeIsTouchEvent", - "(I)Z", + "(J)Z", (void*)android_view_MotionEvent_nativeIsTouchEvent }, { "nativeGetFlags", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetFlags }, { "nativeSetFlags", - "(II)V", + "(JI)V", (void*)android_view_MotionEvent_nativeSetFlags }, { "nativeGetEdgeFlags", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetEdgeFlags }, { "nativeSetEdgeFlags", - "(II)V", + "(JI)V", (void*)android_view_MotionEvent_nativeSetEdgeFlags }, { "nativeGetMetaState", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetMetaState }, { "nativeGetButtonState", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetButtonState }, { "nativeOffsetLocation", - "(IFF)V", + "(JFF)V", (void*)android_view_MotionEvent_nativeOffsetLocation }, { "nativeGetXOffset", - "(I)F", + "(J)F", (void*)android_view_MotionEvent_nativeGetXOffset }, { "nativeGetYOffset", - "(I)F", + "(J)F", (void*)android_view_MotionEvent_nativeGetYOffset }, { "nativeGetXPrecision", - "(I)F", + "(J)F", (void*)android_view_MotionEvent_nativeGetXPrecision }, { "nativeGetYPrecision", - "(I)F", + "(J)F", (void*)android_view_MotionEvent_nativeGetYPrecision }, { "nativeGetDownTimeNanos", - "(I)J", + "(J)J", (void*)android_view_MotionEvent_nativeGetDownTimeNanos }, { "nativeSetDownTimeNanos", - "(IJ)V", + "(JJ)V", (void*)android_view_MotionEvent_nativeSetDownTimeNanos }, { "nativeGetPointerCount", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetPointerCount }, { "nativeGetPointerId", - "(II)I", + "(JI)I", (void*)android_view_MotionEvent_nativeGetPointerId }, { "nativeGetToolType", - "(II)I", + "(JI)I", (void*)android_view_MotionEvent_nativeGetToolType }, { "nativeFindPointerIndex", - "(II)I", + "(JI)I", (void*)android_view_MotionEvent_nativeFindPointerIndex }, { "nativeGetHistorySize", - "(I)I", + "(J)I", (void*)android_view_MotionEvent_nativeGetHistorySize }, { "nativeGetEventTimeNanos", - "(II)J", + "(JI)J", (void*)android_view_MotionEvent_nativeGetEventTimeNanos }, { "nativeGetRawAxisValue", - "(IIII)F", + "(JIII)F", (void*)android_view_MotionEvent_nativeGetRawAxisValue }, { "nativeGetAxisValue", - "(IIII)F", + "(JIII)F", (void*)android_view_MotionEvent_nativeGetAxisValue }, { "nativeGetPointerCoords", - "(IIILandroid/view/MotionEvent$PointerCoords;)V", + "(JIILandroid/view/MotionEvent$PointerCoords;)V", (void*)android_view_MotionEvent_nativeGetPointerCoords }, { "nativeGetPointerProperties", - "(IILandroid/view/MotionEvent$PointerProperties;)V", + "(JILandroid/view/MotionEvent$PointerProperties;)V", (void*)android_view_MotionEvent_nativeGetPointerProperties }, { "nativeScale", - "(IF)V", + "(JF)V", (void*)android_view_MotionEvent_nativeScale }, { "nativeTransform", - "(ILandroid/graphics/Matrix;)V", + "(JLandroid/graphics/Matrix;)V", (void*)android_view_MotionEvent_nativeTransform }, { "nativeReadFromParcel", - "(ILandroid/os/Parcel;)I", + "(JLandroid/os/Parcel;)J", (void*)android_view_MotionEvent_nativeReadFromParcel }, { "nativeWriteToParcel", - "(ILandroid/os/Parcel;)V", + "(JLandroid/os/Parcel;)V", (void*)android_view_MotionEvent_nativeWriteToParcel }, }; @@ -871,7 +871,7 @@ int register_android_view_MotionEvent(JNIEnv* env) { GET_METHOD_ID(gMotionEventClassInfo.recycle, gMotionEventClassInfo.clazz, "recycle", "()V"); GET_FIELD_ID(gMotionEventClassInfo.mNativePtr, gMotionEventClassInfo.clazz, - "mNativePtr", "I"); + "mNativePtr", "J"); jclass clazz; FIND_CLASS(clazz, "android/view/MotionEvent$PointerCoords"); diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp index 90ba2ba849e8..1e36932ac3d7 100644 --- a/core/jni/android_view_VelocityTracker.cpp +++ b/core/jni/android_view_VelocityTracker.cpp @@ -138,26 +138,26 @@ bool VelocityTrackerState::getEstimator(int32_t id, VelocityTracker::Estimator* // --- JNI Methods --- -static jint android_view_VelocityTracker_nativeInitialize(JNIEnv* env, jclass clazz, +static jlong android_view_VelocityTracker_nativeInitialize(JNIEnv* env, jclass clazz, jstring strategyStr) { if (strategyStr) { ScopedUtfChars strategy(env, strategyStr); - return reinterpret_cast<jint>(new VelocityTrackerState(strategy.c_str())); + return reinterpret_cast<jlong>(new VelocityTrackerState(strategy.c_str())); } - return reinterpret_cast<jint>(new VelocityTrackerState(NULL)); + return reinterpret_cast<jlong>(new VelocityTrackerState(NULL)); } -static void android_view_VelocityTracker_nativeDispose(JNIEnv* env, jclass clazz, jint ptr) { +static void android_view_VelocityTracker_nativeDispose(JNIEnv* env, jclass clazz, jlong ptr) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); delete state; } -static void android_view_VelocityTracker_nativeClear(JNIEnv* env, jclass clazz, jint ptr) { +static void android_view_VelocityTracker_nativeClear(JNIEnv* env, jclass clazz, jlong ptr) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); state->clear(); } -static void android_view_VelocityTracker_nativeAddMovement(JNIEnv* env, jclass clazz, jint ptr, +static void android_view_VelocityTracker_nativeAddMovement(JNIEnv* env, jclass clazz, jlong ptr, jobject eventObj) { const MotionEvent* event = android_view_MotionEvent_getNativePtr(env, eventObj); if (!event) { @@ -170,13 +170,13 @@ static void android_view_VelocityTracker_nativeAddMovement(JNIEnv* env, jclass c } static void android_view_VelocityTracker_nativeComputeCurrentVelocity(JNIEnv* env, jclass clazz, - jint ptr, jint units, jfloat maxVelocity) { + jlong ptr, jint units, jfloat maxVelocity) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); state->computeCurrentVelocity(units, maxVelocity); } static jfloat android_view_VelocityTracker_nativeGetXVelocity(JNIEnv* env, jclass clazz, - jint ptr, jint id) { + jlong ptr, jint id) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); float vx; state->getVelocity(id, &vx, NULL); @@ -184,7 +184,7 @@ static jfloat android_view_VelocityTracker_nativeGetXVelocity(JNIEnv* env, jclas } static jfloat android_view_VelocityTracker_nativeGetYVelocity(JNIEnv* env, jclass clazz, - jint ptr, jint id) { + jlong ptr, jint id) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); float vy; state->getVelocity(id, NULL, &vy); @@ -192,7 +192,7 @@ static jfloat android_view_VelocityTracker_nativeGetYVelocity(JNIEnv* env, jclas } static jboolean android_view_VelocityTracker_nativeGetEstimator(JNIEnv* env, jclass clazz, - jint ptr, jint id, jobject outEstimatorObj) { + jlong ptr, jint id, jobject outEstimatorObj) { VelocityTrackerState* state = reinterpret_cast<VelocityTrackerState*>(ptr); VelocityTracker::Estimator estimator; bool result = state->getEstimator(id, &estimator); @@ -217,28 +217,28 @@ static jboolean android_view_VelocityTracker_nativeGetEstimator(JNIEnv* env, jcl static JNINativeMethod gVelocityTrackerMethods[] = { /* name, signature, funcPtr */ { "nativeInitialize", - "(Ljava/lang/String;)I", + "(Ljava/lang/String;)J", (void*)android_view_VelocityTracker_nativeInitialize }, { "nativeDispose", - "(I)V", + "(J)V", (void*)android_view_VelocityTracker_nativeDispose }, { "nativeClear", - "(I)V", + "(J)V", (void*)android_view_VelocityTracker_nativeClear }, { "nativeAddMovement", - "(ILandroid/view/MotionEvent;)V", + "(JLandroid/view/MotionEvent;)V", (void*)android_view_VelocityTracker_nativeAddMovement }, { "nativeComputeCurrentVelocity", - "(IIF)V", + "(JIF)V", (void*)android_view_VelocityTracker_nativeComputeCurrentVelocity }, { "nativeGetXVelocity", - "(II)F", + "(JI)F", (void*)android_view_VelocityTracker_nativeGetXVelocity }, { "nativeGetYVelocity", - "(II)F", + "(JI)F", (void*)android_view_VelocityTracker_nativeGetYVelocity }, { "nativeGetEstimator", - "(IILandroid/view/VelocityTracker$Estimator;)Z", + "(JILandroid/view/VelocityTracker$Estimator;)Z", (void*)android_view_VelocityTracker_nativeGetEstimator }, }; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ca74fa4f4b21..13f5e1ce26be 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1719,6 +1719,14 @@ android:label="@string/permlab_manageCaCertificates" android:description="@string/permdesc_manageCaCertificates" /> + <!-- Allows an application to do certain operations needed for + interacting with the recovery (system update) system. --> + <permission android:name="android.permission.RECOVERY" + android:permissionGroup="android.permission-group.SYSTEM_TOOLS" + android:protectionLevel="signature|system" + android:label="@string/permlab_recovery" + android:description="@string/permdesc_recovery" /> + <!-- ========================================= --> <!-- Permissions for special development tools --> <!-- ========================================= --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index bbe39094e045..abae8636cb81 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3644,6 +3644,11 @@ <!-- Description of an application permission that lets it control keyguard. --> <string name="permdesc_control_keyguard">Allows an application to control keguard.</string> + <!-- Title of an application permission that lets it interact with recovery. --> + <string name="permlab_recovery">Interact with update and recovery system</string> + <!-- Description of an application permission that lets it control keyguard. --> + <string name="permdesc_recovery">Allows an application to interact with the recovery system and system updates.</string> + <!-- Shown in the tutorial for tap twice for zoom control. --> <string name="tutorial_double_tap_to_zoom_message_short">Touch twice for zoom control</string> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 4acafad58235..512c9b8bd8ae 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -32,262 +32,731 @@ easier. --> <resources> <!-- Widget Styles --> - <style name="Widget.DeviceDefault" parent="Widget.Quantum"/> - <style name="Widget.DeviceDefault.Button" parent="Widget.Quantum.Button"/> - <style name="Widget.DeviceDefault.Button.Small" parent="Widget.Quantum.Button.Small"/> - <style name="Widget.DeviceDefault.Button.Inset" parent="Widget.Quantum.Button.Inset"/> - <style name="Widget.DeviceDefault.Button.Toggle" parent="Widget.Quantum.Button.Toggle"/> - <style name="Widget.DeviceDefault.TextView" parent="Widget.Quantum.TextView"/> - <style name="Widget.DeviceDefault.CheckedTextView" parent="Widget.Quantum.CheckedTextView"/> - <style name="Widget.DeviceDefault.AutoCompleteTextView" parent="Widget.Quantum.AutoCompleteTextView"/> - <style name="Widget.DeviceDefault.CompoundButton.CheckBox" parent="Widget.Quantum.CompoundButton.CheckBox"/> - <style name="Widget.DeviceDefault.ListView.DropDown" parent="Widget.Quantum.ListView.DropDown"/> - <style name="Widget.DeviceDefault.EditText" parent="Widget.Quantum.EditText"/> - <style name="Widget.DeviceDefault.ExpandableListView" parent="Widget.Quantum.ExpandableListView"/> - <style name="Widget.DeviceDefault.GridView" parent="Widget.Quantum.GridView"/> - <style name="Widget.DeviceDefault.ImageButton" parent="Widget.Quantum.ImageButton"/> - <style name="Widget.DeviceDefault.ListView" parent="Widget.Quantum.ListView"/> - <style name="Widget.DeviceDefault.PopupWindow" parent="Widget.Quantum.PopupWindow"/> - <style name="Widget.DeviceDefault.ProgressBar" parent="Widget.Quantum.ProgressBar"/> - <style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Quantum.ProgressBar.Horizontal"/> - <style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Quantum.ProgressBar.Small"/> - <style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Quantum.ProgressBar.Small.Title"/> - <style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Quantum.ProgressBar.Large"/> - <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Quantum.SeekBar"/> - <style name="Widget.DeviceDefault.RatingBar" parent="Widget.Quantum.RatingBar"/> - <style name="Widget.DeviceDefault.RatingBar.Indicator" parent="Widget.Quantum.RatingBar.Indicator"/> - <style name="Widget.DeviceDefault.RatingBar.Small" parent="Widget.Quantum.RatingBar.Small"/> - <style name="Widget.DeviceDefault.CompoundButton.RadioButton" parent="Widget.Quantum.CompoundButton.RadioButton"/> - <style name="Widget.DeviceDefault.ScrollView" parent="Widget.Quantum.ScrollView"/> - <style name="Widget.DeviceDefault.HorizontalScrollView" parent="Widget.Quantum.HorizontalScrollView"/> - <style name="Widget.DeviceDefault.Spinner" parent="Widget.Quantum.Spinner"/> - <style name="Widget.DeviceDefault.CompoundButton.Star" parent="Widget.Quantum.CompoundButton.Star"/> - <style name="Widget.DeviceDefault.TabWidget" parent="Widget.Quantum.TabWidget"/> - <style name="Widget.DeviceDefault.WebTextView" parent="Widget.Quantum.WebTextView"/> - <style name="Widget.DeviceDefault.WebView" parent="Widget.Quantum.WebView"/> - <style name="Widget.DeviceDefault.DropDownItem" parent="Widget.Quantum.DropDownItem"/> - <style name="Widget.DeviceDefault.DropDownItem.Spinner" parent="Widget.Quantum.DropDownItem.Spinner"/> - <style name="Widget.DeviceDefault.TextView.SpinnerItem" parent="Widget.Quantum.TextView.SpinnerItem"/> - <style name="Widget.DeviceDefault.ListPopupWindow" parent="Widget.Quantum.ListPopupWindow"/> - <style name="Widget.DeviceDefault.PopupMenu" parent="Widget.Quantum.PopupMenu"/> - <style name="Widget.DeviceDefault.ActionButton" parent="Widget.Quantum.ActionButton"/> - <style name="Widget.DeviceDefault.ActionButton.Overflow" parent="Widget.Quantum.ActionButton.Overflow"/> - <style name="Widget.DeviceDefault.ActionButton.TextButton" parent="Widget.Quantum.ActionButton.TextButton"/> - <style name="Widget.DeviceDefault.ActionMode" parent="Widget.Quantum.ActionMode"/> - <style name="Widget.DeviceDefault.ActionButton.CloseMode" parent="Widget.Quantum.ActionButton.CloseMode"/> - <style name="Widget.DeviceDefault.ActionBar" parent="Widget.Quantum.ActionBar"/> - <style name="Widget.DeviceDefault.Button.Borderless" parent="Widget.Quantum.Button.Borderless"/> - <style name="Widget.DeviceDefault.Tab" parent="Widget.Quantum.Tab"/> - <style name="Widget.DeviceDefault.CalendarView" parent="Widget.Quantum.CalendarView"/> - <style name="Widget.DeviceDefault.DatePicker" parent="Widget.Quantum.DatePicker"/> - <style name="Widget.DeviceDefault.ActionBar.TabView" parent="Widget.Quantum.ActionBar.TabView"/> - <style name="Widget.DeviceDefault.ActionBar.TabText" parent="Widget.Quantum.ActionBar.TabText"/> - <style name="Widget.DeviceDefault.ActionBar.TabBar" parent="Widget.Quantum.ActionBar.TabBar"/> - <style name="Widget.DeviceDefault.ActionBar.Solid" parent="Widget.Quantum.ActionBar.Solid"/> - <style name="Widget.DeviceDefault.Button.Borderless.Small" parent="Widget.Quantum.Button.Borderless.Small"/> - <style name="Widget.DeviceDefault.AbsListView" parent="Widget.Quantum.AbsListView"/> - <style name="Widget.DeviceDefault.Spinner.DropDown.ActionBar" parent="Widget.Quantum.Spinner.DropDown.ActionBar"/> - <style name="Widget.DeviceDefault.PopupWindow.ActionMode" parent="Widget.Quantum.PopupWindow.ActionMode"/> - <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Quantum.CompoundButton.Switch"/> - <style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Quantum.ExpandableListView.White"/> - <style name="Widget.DeviceDefault.FastScroll" parent="Widget.Quantum.FastScroll"/> - <style name="Widget.DeviceDefault.FragmentBreadCrumbs" parent="Widget.Quantum.FragmentBreadCrumbs"/> - <style name="Widget.DeviceDefault.Gallery" parent="Widget.Quantum.Gallery"/> - <style name="Widget.DeviceDefault.GestureOverlayView" parent="Widget.Quantum.GestureOverlayView"/> - <style name="Widget.DeviceDefault.ImageWell" parent="Widget.Quantum.ImageWell"/> - <style name="Widget.DeviceDefault.KeyboardView" parent="Widget.Quantum.KeyboardView"/> - <style name="Widget.DeviceDefault.ListView.White" parent="Widget.Quantum.ListView.White"/> - <style name="Widget.DeviceDefault.NumberPicker" parent="Widget.Quantum.NumberPicker"/> - <style name="Widget.DeviceDefault.PreferenceFrameLayout" parent="Widget.Quantum.PreferenceFrameLayout"/> - <style name="Widget.DeviceDefault.ProgressBar.Inverse" parent="Widget.Quantum.ProgressBar.Inverse"/> - <style name="Widget.DeviceDefault.ProgressBar.Large.Inverse" parent="Widget.Quantum.ProgressBar.Large.Inverse"/> - <style name="Widget.DeviceDefault.ProgressBar.Small.Inverse" parent="Widget.Quantum.ProgressBar.Small.Inverse"/> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowLarge" parent="Widget.Quantum.QuickContactBadge.WindowLarge"/> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowMedium" parent="Widget.Quantum.QuickContactBadge.WindowMedium"/> - <style name="Widget.DeviceDefault.QuickContactBadge.WindowSmall" parent="Widget.Quantum.QuickContactBadge.WindowSmall"/> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowLarge" parent="Widget.Quantum.QuickContactBadgeSmall.WindowLarge"/> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowMedium" parent="Widget.Quantum.QuickContactBadgeSmall.WindowMedium"/> - <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowSmall" parent="Widget.Quantum.QuickContactBadgeSmall.WindowSmall"/> - <style name="Widget.DeviceDefault.Spinner.DropDown" parent="Widget.Quantum.Spinner.DropDown"/> - <style name="Widget.DeviceDefault.StackView" parent="Widget.Quantum.StackView"/> - <style name="Widget.DeviceDefault.TextSelectHandle" parent="Widget.Quantum.TextSelectHandle"/> - <style name="Widget.DeviceDefault.TextSuggestionsPopupWindow" parent="Widget.Quantum.TextSuggestionsPopupWindow"/> - <style name="Widget.DeviceDefault.TextView.ListSeparator" parent="Widget.Quantum.TextView.ListSeparator"/> - <style name="Widget.DeviceDefault.TimePicker" parent="Widget.Quantum.TimePicker"/> - <style name="Widget.DeviceDefault.Light" parent="Widget.Quantum.Light"/> - <style name="Widget.DeviceDefault.Light.Button" parent="Widget.Quantum.Light.Button"/> - <style name="Widget.DeviceDefault.Light.Button.Small" parent="Widget.Quantum.Light.Button.Small"/> - <style name="Widget.DeviceDefault.Light.Button.Inset" parent="Widget.Quantum.Light.Button.Inset"/> - <style name="Widget.DeviceDefault.Light.Button.Toggle" parent="Widget.Quantum.Light.Button.Toggle"/> - <style name="Widget.DeviceDefault.Light.TextView" parent="Widget.Quantum.Light.TextView"/> - <style name="Widget.DeviceDefault.Light.CheckedTextView" parent="Widget.Quantum.Light.CheckedTextView"/> - <style name="Widget.DeviceDefault.Light.AutoCompleteTextView" parent="Widget.Quantum.Light.AutoCompleteTextView"/> - <style name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" parent="Widget.Quantum.Light.CompoundButton.CheckBox"/> - <style name="Widget.DeviceDefault.Light.ListView.DropDown" parent="Widget.Quantum.Light.ListView.DropDown"/> - <style name="Widget.DeviceDefault.Light.EditText" parent="Widget.Quantum.Light.EditText"/> - <style name="Widget.DeviceDefault.Light.ExpandableListView" parent="Widget.Quantum.Light.ExpandableListView"/> - <style name="Widget.DeviceDefault.Light.FastScroll" parent="Widget.Quantum.Light.FastScroll"/> - <style name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" parent="Widget.Quantum.Light.FragmentBreadCrumbs"/> - <style name="Widget.DeviceDefault.Light.GridView" parent="Widget.Quantum.Light.GridView"/> - <style name="Widget.DeviceDefault.Light.ImageButton" parent="Widget.Quantum.Light.ImageButton"/> - <style name="Widget.DeviceDefault.Light.ListView" parent="Widget.Quantum.Light.ListView"/> - <style name="Widget.DeviceDefault.Light.PopupWindow" parent="Widget.Quantum.Light.PopupWindow"/> - <style name="Widget.DeviceDefault.Light.ProgressBar" parent="Widget.Quantum.Light.ProgressBar"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" parent="Widget.Quantum.Light.ProgressBar.Horizontal"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small" parent="Widget.Quantum.Light.ProgressBar.Small"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" parent="Widget.Quantum.Light.ProgressBar.Small.Title"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Large" parent="Widget.Quantum.Light.ProgressBar.Large"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Inverse" parent="Widget.Quantum.Light.ProgressBar.Inverse"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" parent="Widget.Quantum.Light.ProgressBar.Small.Inverse"/> - <style name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" parent="Widget.Quantum.Light.ProgressBar.Large.Inverse"/> - <style name="Widget.DeviceDefault.Light.SeekBar" parent="Widget.Quantum.Light.SeekBar"/> - <style name="Widget.DeviceDefault.Light.RatingBar" parent="Widget.Quantum.Light.RatingBar"/> - <style name="Widget.DeviceDefault.Light.RatingBar.Indicator" parent="Widget.Quantum.Light.RatingBar.Indicator"/> - <style name="Widget.DeviceDefault.Light.RatingBar.Small" parent="Widget.Quantum.Light.RatingBar.Small"/> - <style name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" parent="Widget.Quantum.Light.CompoundButton.RadioButton"/> - <style name="Widget.DeviceDefault.Light.ScrollView" parent="Widget.Quantum.Light.ScrollView"/> - <style name="Widget.DeviceDefault.Light.HorizontalScrollView" parent="Widget.Quantum.Light.HorizontalScrollView"/> - <style name="Widget.DeviceDefault.Light.Spinner" parent="Widget.Quantum.Light.Spinner"/> - <style name="Widget.DeviceDefault.Light.CompoundButton.Star" parent="Widget.Quantum.Light.CompoundButton.Star"/> - <style name="Widget.DeviceDefault.Light.TabWidget" parent="Widget.Quantum.Light.TabWidget"/> - <style name="Widget.DeviceDefault.Light.WebTextView" parent="Widget.Quantum.Light.WebTextView"/> - <style name="Widget.DeviceDefault.Light.WebView" parent="Widget.Quantum.Light.WebView"/> - <style name="Widget.DeviceDefault.Light.DropDownItem" parent="Widget.Quantum.Light.DropDownItem"/> - <style name="Widget.DeviceDefault.Light.DropDownItem.Spinner" parent="Widget.Quantum.Light.DropDownItem.Spinner"/> - <style name="Widget.DeviceDefault.Light.TextView.SpinnerItem" parent="Widget.Quantum.Light.TextView.SpinnerItem"/> - <style name="Widget.DeviceDefault.Light.ListPopupWindow" parent="Widget.Quantum.Light.ListPopupWindow"/> - <style name="Widget.DeviceDefault.Light.PopupMenu" parent="Widget.Quantum.Light.PopupMenu"/> - <style name="Widget.DeviceDefault.Light.Tab" parent="Widget.Quantum.Light.Tab"/> - <style name="Widget.DeviceDefault.Light.CalendarView" parent="Widget.Quantum.Light.CalendarView"/> - <style name="Widget.DeviceDefault.Light.Button.Borderless.Small" parent="Widget.Quantum.Light.Button.Borderless.Small"/> - <style name="Widget.DeviceDefault.Light.ActionButton" parent="Widget.Quantum.Light.ActionButton"/> - <style name="Widget.DeviceDefault.Light.ActionButton.Overflow" parent="Widget.Quantum.Light.ActionButton.Overflow"/> - <style name="Widget.DeviceDefault.Light.ActionMode" parent="Widget.Quantum.Light.ActionMode"/> - <style name="Widget.DeviceDefault.Light.ActionButton.CloseMode" parent="Widget.Quantum.Light.ActionButton.CloseMode"/> - <style name="Widget.DeviceDefault.Light.ActionBar" parent="Widget.Quantum.Light.ActionBar"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabView" parent="Widget.Quantum.Light.ActionBar.TabView"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabText" parent="Widget.Quantum.Light.ActionBar.TabText"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabBar" parent="Widget.Quantum.Light.ActionBar.TabBar"/> - <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Quantum.Light.ActionBar.Solid"/> - <style name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" parent="Widget.Quantum.Light.ActionBar.Solid.Inverse"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" parent="Widget.Quantum.Light.ActionBar.TabBar.Inverse"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" parent="Widget.Quantum.Light.ActionBar.TabView.Inverse"/> - <style name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" parent="Widget.Quantum.Light.ActionBar.TabText.Inverse"/> - <style name="Widget.DeviceDefault.Light.ActionMode.Inverse" parent="Widget.Quantum.Light.ActionMode.Inverse"/> - <style name="Widget.DeviceDefault.Light.AbsListView" parent="Widget.Quantum.Light.AbsListView"/> - <style name="Widget.DeviceDefault.Light.Spinner.DropDown.ActionBar" parent="Widget.Quantum.Light.Spinner.DropDown.ActionBar"/> - <style name="Widget.DeviceDefault.Light.PopupWindow.ActionMode" parent="Widget.Quantum.Light.PopupWindow.ActionMode"/> - <style name="Widget.DeviceDefault.Light.Button.Borderless" parent="Widget.Quantum.Light.Button.Borderless"/> - <style name="Widget.DeviceDefault.Light.DatePicker" parent="Widget.Quantum.Light.DatePicker"/> - <style name="Widget.DeviceDefault.Light.ExpandableListView.White" parent="Widget.Quantum.Light.ExpandableListView.White"/> - <style name="Widget.DeviceDefault.Light.Gallery" parent="Widget.Quantum.Light.Gallery"/> - <style name="Widget.DeviceDefault.Light.GestureOverlayView" parent="Widget.Quantum.Light.GestureOverlayView"/> - <style name="Widget.DeviceDefault.Light.ImageWell" parent="Widget.Quantum.Light.ImageWell"/> - <style name="Widget.DeviceDefault.Light.ListView.White" parent="Widget.Quantum.Light.ListView.White"/> - <style name="Widget.DeviceDefault.Light.NumberPicker" parent="Widget.Quantum.Light.NumberPicker"/> - <style name="Widget.DeviceDefault.Light.Spinner.DropDown" parent="Widget.Quantum.Light.Spinner.DropDown"/> - <style name="Widget.DeviceDefault.Light.TextView.ListSeparator" parent="Widget.Quantum.Light.TextView.ListSeparator"/> - <style name="Widget.DeviceDefault.Light.TimePicker" parent="Widget.Quantum.Light.TimePicker"/> - <style name="Widget.DeviceDefault.Light.TextSuggestionsPopupWindow" parent="Widget.Quantum.Light.TextSuggestionsPopupWindow"/> + <style name="Widget.DeviceDefault" parent="Widget.Holo" > + + </style> + <style name="Widget.DeviceDefault.Button" parent="Widget.Holo.Button" > + + </style> + <style name="Widget.DeviceDefault.Button.Small" parent="Widget.Holo.Button.Small" > + + </style> + <style name="Widget.DeviceDefault.Button.Inset" parent="Widget.Holo.Button.Inset" > + + </style> + <style name="Widget.DeviceDefault.Button.Toggle" parent="Widget.Holo.Button.Toggle" > + + </style> + <style name="Widget.DeviceDefault.TextView" parent="Widget.Holo.TextView" > + + </style> + <style name="Widget.DeviceDefault.CheckedTextView" parent="Widget.Holo.CheckedTextView" > + + </style> + <style name="Widget.DeviceDefault.AutoCompleteTextView" parent="Widget.Holo.AutoCompleteTextView" > + + </style> + <style name="Widget.DeviceDefault.CompoundButton.CheckBox" parent="Widget.Holo.CompoundButton.CheckBox" > + + </style> + <style name="Widget.DeviceDefault.ListView.DropDown" parent="Widget.Holo.ListView.DropDown" > + + </style> + <style name="Widget.DeviceDefault.EditText" parent="Widget.Holo.EditText" > + + </style> + <style name="Widget.DeviceDefault.ExpandableListView" parent="Widget.Holo.ExpandableListView" > + + </style> + <style name="Widget.DeviceDefault.GridView" parent="Widget.Holo.GridView" > + + </style> + <style name="Widget.DeviceDefault.ImageButton" parent="Widget.Holo.ImageButton" > + + </style> + <style name="Widget.DeviceDefault.ListView" parent="Widget.Holo.ListView" > + + </style> + <style name="Widget.DeviceDefault.PopupWindow" parent="Widget.Holo.PopupWindow" > + + </style> + <style name="Widget.DeviceDefault.ProgressBar" parent="Widget.Holo.ProgressBar" > + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Horizontal" parent="Widget.Holo.ProgressBar.Horizontal" > + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Small" parent="Widget.Holo.ProgressBar.Small" > + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Small.Title" parent="Widget.Holo.ProgressBar.Small.Title" > + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Large" parent="Widget.Holo.ProgressBar.Large" > + + </style> + <style name="Widget.DeviceDefault.SeekBar" parent="Widget.Holo.SeekBar" > + + </style> + <style name="Widget.DeviceDefault.RatingBar" parent="Widget.Holo.RatingBar" > + + </style> + <style name="Widget.DeviceDefault.RatingBar.Indicator" parent="Widget.Holo.RatingBar.Indicator" > + + </style> + <style name="Widget.DeviceDefault.RatingBar.Small" parent="Widget.Holo.RatingBar.Small" > + + </style> + <style name="Widget.DeviceDefault.CompoundButton.RadioButton" parent="Widget.Holo.CompoundButton.RadioButton" > + + </style> + <style name="Widget.DeviceDefault.ScrollView" parent="Widget.Holo.ScrollView" > + + </style> + <style name="Widget.DeviceDefault.HorizontalScrollView" parent="Widget.Holo.HorizontalScrollView" > + + </style> + <style name="Widget.DeviceDefault.Spinner" parent="Widget.Holo.Spinner" > + + </style> + <style name="Widget.DeviceDefault.CompoundButton.Star" parent="Widget.Holo.CompoundButton.Star" > + + </style> + <style name="Widget.DeviceDefault.TabWidget" parent="Widget.Holo.TabWidget" > + + </style> + <style name="Widget.DeviceDefault.WebTextView" parent="Widget.Holo.WebTextView" > + + </style> + <style name="Widget.DeviceDefault.WebView" parent="Widget.Holo.WebView" > + + </style> + <style name="Widget.DeviceDefault.DropDownItem" parent="Widget.Holo.DropDownItem" > + + </style> + <style name="Widget.DeviceDefault.DropDownItem.Spinner" parent="Widget.Holo.DropDownItem.Spinner" > + + </style> + <style name="Widget.DeviceDefault.TextView.SpinnerItem" parent="Widget.Holo.TextView.SpinnerItem" > + + </style> + <style name="Widget.DeviceDefault.ListPopupWindow" parent="Widget.Holo.ListPopupWindow" > + + </style> + <style name="Widget.DeviceDefault.PopupMenu" parent="Widget.Holo.PopupMenu" > + + </style> + <style name="Widget.DeviceDefault.ActionButton" parent="Widget.Holo.ActionButton" > + + </style> + <style name="Widget.DeviceDefault.ActionButton.Overflow" parent="Widget.Holo.ActionButton.Overflow" > + + </style> + <style name="Widget.DeviceDefault.ActionButton.TextButton" parent="Widget.Holo.ActionButton.TextButton" > + + </style> + <style name="Widget.DeviceDefault.ActionMode" parent="Widget.Holo.ActionMode" > + + </style> + <style name="Widget.DeviceDefault.ActionButton.CloseMode" parent="Widget.Holo.ActionButton.CloseMode" > + + </style> + <style name="Widget.DeviceDefault.ActionBar" parent="Widget.Holo.ActionBar" > + + </style> + <style name="Widget.DeviceDefault.Button.Borderless" parent="Widget.Holo.Button.Borderless" > + + </style> + <style name="Widget.DeviceDefault.Tab" parent="Widget.Holo.Tab" > + + </style> + <style name="Widget.DeviceDefault.CalendarView" parent="Widget.Holo.CalendarView" > + + </style> + <style name="Widget.DeviceDefault.DatePicker" parent="Widget.Holo.DatePicker" > + + </style> + <style name="Widget.DeviceDefault.ActionBar.TabView" parent="Widget.Holo.ActionBar.TabView" > + + </style> + <style name="Widget.DeviceDefault.ActionBar.TabText" parent="Widget.Holo.ActionBar.TabText" > + + </style> + <style name="Widget.DeviceDefault.ActionBar.TabBar" parent="Widget.Holo.ActionBar.TabBar" > + + </style> + <style name="Widget.DeviceDefault.ActionBar.Solid" parent="Widget.Holo.ActionBar.Solid" > + + </style> + <style name="Widget.DeviceDefault.Button.Borderless.Small" parent="Widget.Holo.Button.Borderless.Small" > + + </style> + <style name="Widget.DeviceDefault.AbsListView" parent="Widget.Holo.AbsListView" > + + </style> + <style name="Widget.DeviceDefault.Spinner.DropDown.ActionBar" parent="Widget.Holo.Spinner.DropDown.ActionBar" > + + </style> + <style name="Widget.DeviceDefault.PopupWindow.ActionMode" parent="Widget.Holo.PopupWindow.ActionMode" > + + </style> + <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Holo.CompoundButton.Switch"> + + </style> + <style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Holo.ExpandableListView.White"> + + </style> + <style name="Widget.DeviceDefault.FastScroll" parent="Widget.Holo.FastScroll"> + + </style> + <style name="Widget.DeviceDefault.FragmentBreadCrumbs" parent="Widget.Holo.FragmentBreadCrumbs"> + + </style> + <style name="Widget.DeviceDefault.Gallery" parent="Widget.Holo.Gallery"> + + </style> + <style name="Widget.DeviceDefault.GestureOverlayView" parent="Widget.Holo.GestureOverlayView"> + + </style> + <style name="Widget.DeviceDefault.ImageWell" parent="Widget.Holo.ImageWell"> + + </style> + <style name="Widget.DeviceDefault.KeyboardView" parent="Widget.Holo.KeyboardView"> + + </style> + <style name="Widget.DeviceDefault.ListView.White" parent="Widget.Holo.ListView.White"> + + </style> + <style name="Widget.DeviceDefault.NumberPicker" parent="Widget.Holo.NumberPicker"> + + </style> + <style name="Widget.DeviceDefault.PreferenceFrameLayout" parent="Widget.Holo.PreferenceFrameLayout"> + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Inverse" parent="Widget.Holo.ProgressBar.Inverse"> + + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Large.Inverse" parent="Widget.Holo.ProgressBar.Large.Inverse"> + + </style> + <style name="Widget.DeviceDefault.ProgressBar.Small.Inverse" parent="Widget.Holo.ProgressBar.Small.Inverse"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowLarge" parent="Widget.Holo.QuickContactBadge.WindowLarge"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowMedium" parent="Widget.Holo.QuickContactBadge.WindowMedium"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadge.WindowSmall" parent="Widget.Holo.QuickContactBadge.WindowSmall"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowLarge" parent="Widget.Holo.QuickContactBadgeSmall.WindowLarge"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowMedium" parent="Widget.Holo.QuickContactBadgeSmall.WindowMedium"> + + </style> + <style name="Widget.DeviceDefault.QuickContactBadgeSmall.WindowSmall" parent="Widget.Holo.QuickContactBadgeSmall.WindowSmall"> + + </style> + <style name="Widget.DeviceDefault.Spinner.DropDown" parent="Widget.Holo.Spinner.DropDown"> + + </style> + <style name="Widget.DeviceDefault.StackView" parent="Widget.Holo.StackView"> + + </style> + <style name="Widget.DeviceDefault.TextSelectHandle" parent="Widget.Holo.TextSelectHandle"> + + </style> + <style name="Widget.DeviceDefault.TextSuggestionsPopupWindow" parent="Widget.Holo.TextSuggestionsPopupWindow"> + + </style> + <style name="Widget.DeviceDefault.TextView.ListSeparator" parent="Widget.Holo.TextView.ListSeparator"> + + </style> + <style name="Widget.DeviceDefault.TimePicker" parent="Widget.Holo.TimePicker"> + + </style> + <style name="Widget.DeviceDefault.Light" parent="Widget.Holo.Light" > + + </style> + <style name="Widget.DeviceDefault.Light.Button" parent="Widget.Holo.Light.Button" > + + </style> + <style name="Widget.DeviceDefault.Light.Button.Small" parent="Widget.Holo.Light.Button.Small" > + + </style> + <style name="Widget.DeviceDefault.Light.Button.Inset" parent="Widget.Holo.Light.Button.Inset" > + + </style> + <style name="Widget.DeviceDefault.Light.Button.Toggle" parent="Widget.Holo.Light.Button.Toggle" > + + </style> + <style name="Widget.DeviceDefault.Light.TextView" parent="Widget.Holo.Light.TextView" > + + </style> + <style name="Widget.DeviceDefault.Light.CheckedTextView" parent="Widget.Holo.Light.CheckedTextView" > + + </style> + <style name="Widget.DeviceDefault.Light.AutoCompleteTextView" parent="Widget.Holo.Light.AutoCompleteTextView" > + + </style> + <style name="Widget.DeviceDefault.Light.CompoundButton.CheckBox" parent="Widget.Holo.Light.CompoundButton.CheckBox" > + + </style> + <style name="Widget.DeviceDefault.Light.ListView.DropDown" parent="Widget.Holo.Light.ListView.DropDown" > + + </style> + <style name="Widget.DeviceDefault.Light.EditText" parent="Widget.Holo.Light.EditText" > + + </style> + <style name="Widget.DeviceDefault.Light.ExpandableListView" parent="Widget.Holo.Light.ExpandableListView" > + + </style> + <style name="Widget.DeviceDefault.Light.FastScroll" parent="Widget.Holo.Light.FastScroll"> + + </style> + <style name="Widget.DeviceDefault.Light.FragmentBreadCrumbs" parent="Widget.Holo.Light.FragmentBreadCrumbs"> + + </style> + <style name="Widget.DeviceDefault.Light.GridView" parent="Widget.Holo.Light.GridView" > + + </style> + <style name="Widget.DeviceDefault.Light.ImageButton" parent="Widget.Holo.Light.ImageButton" > + + </style> + <style name="Widget.DeviceDefault.Light.ListView" parent="Widget.Holo.Light.ListView" > + + </style> + <style name="Widget.DeviceDefault.Light.PopupWindow" parent="Widget.Holo.Light.PopupWindow" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar" parent="Widget.Holo.Light.ProgressBar" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Horizontal" parent="Widget.Holo.Light.ProgressBar.Horizontal" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small" parent="Widget.Holo.Light.ProgressBar.Small" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Title" parent="Widget.Holo.Light.ProgressBar.Small.Title" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Large" parent="Widget.Holo.Light.ProgressBar.Large" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Inverse" parent="Widget.Holo.Light.ProgressBar.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Small.Inverse" parent="Widget.Holo.Light.ProgressBar.Small.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ProgressBar.Large.Inverse" parent="Widget.Holo.Light.ProgressBar.Large.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.SeekBar" parent="Widget.Holo.Light.SeekBar" > + + </style> + <style name="Widget.DeviceDefault.Light.RatingBar" parent="Widget.Holo.Light.RatingBar" > + + </style> + <style name="Widget.DeviceDefault.Light.RatingBar.Indicator" parent="Widget.Holo.Light.RatingBar.Indicator" > + + </style> + <style name="Widget.DeviceDefault.Light.RatingBar.Small" parent="Widget.Holo.Light.RatingBar.Small" > + + </style> + <style name="Widget.DeviceDefault.Light.CompoundButton.RadioButton" parent="Widget.Holo.Light.CompoundButton.RadioButton" > + + </style> + <style name="Widget.DeviceDefault.Light.ScrollView" parent="Widget.Holo.Light.ScrollView" > + + </style> + <style name="Widget.DeviceDefault.Light.HorizontalScrollView" parent="Widget.Holo.Light.HorizontalScrollView" > + + </style> + <style name="Widget.DeviceDefault.Light.Spinner" parent="Widget.Holo.Light.Spinner" > + + </style> + <style name="Widget.DeviceDefault.Light.CompoundButton.Star" parent="Widget.Holo.Light.CompoundButton.Star" > + + </style> + <style name="Widget.DeviceDefault.Light.TabWidget" parent="Widget.Holo.Light.TabWidget" > + + </style> + <style name="Widget.DeviceDefault.Light.WebTextView" parent="Widget.Holo.Light.WebTextView" > + + </style> + <style name="Widget.DeviceDefault.Light.WebView" parent="Widget.Holo.Light.WebView" > + + </style> + <style name="Widget.DeviceDefault.Light.DropDownItem" parent="Widget.Holo.Light.DropDownItem" > + + </style> + <style name="Widget.DeviceDefault.Light.DropDownItem.Spinner" parent="Widget.Holo.Light.DropDownItem.Spinner" > + + </style> + <style name="Widget.DeviceDefault.Light.TextView.SpinnerItem" parent="Widget.Holo.Light.TextView.SpinnerItem" > + + </style> + <style name="Widget.DeviceDefault.Light.ListPopupWindow" parent="Widget.Holo.Light.ListPopupWindow" > + + </style> + <style name="Widget.DeviceDefault.Light.PopupMenu" parent="Widget.Holo.Light.PopupMenu" > + + </style> + <style name="Widget.DeviceDefault.Light.Tab" parent="Widget.Holo.Light.Tab" > + + </style> + <style name="Widget.DeviceDefault.Light.CalendarView" parent="Widget.Holo.Light.CalendarView" > + + </style> + <style name="Widget.DeviceDefault.Light.Button.Borderless.Small" parent="Widget.Holo.Light.Button.Borderless.Small" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionButton" parent="Widget.Holo.Light.ActionButton" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionButton.Overflow" parent="Widget.Holo.Light.ActionButton.Overflow" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionMode" parent="Widget.Holo.Light.ActionMode" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionButton.CloseMode" parent="Widget.Holo.Light.ActionButton.CloseMode" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar" parent="Widget.Holo.Light.ActionBar" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabView" parent="Widget.Holo.Light.ActionBar.TabView" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabText" parent="Widget.Holo.Light.ActionBar.TabText" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabBar" parent="Widget.Holo.Light.ActionBar.TabBar" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.Solid" parent="Widget.Holo.Light.ActionBar.Solid" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.Solid.Inverse" parent="Widget.Holo.Light.ActionBar.Solid.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabBar.Inverse" parent="Widget.Holo.Light.ActionBar.TabBar.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabView.Inverse" parent="Widget.Holo.Light.ActionBar.TabView.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionBar.TabText.Inverse" parent="Widget.Holo.Light.ActionBar.TabText.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.ActionMode.Inverse" parent="Widget.Holo.Light.ActionMode.Inverse" > + + </style> + <style name="Widget.DeviceDefault.Light.AbsListView" parent="Widget.Holo.Light.AbsListView" > + + </style> + <style name="Widget.DeviceDefault.Light.Spinner.DropDown.ActionBar" parent="Widget.Holo.Light.Spinner.DropDown.ActionBar" > + + </style> + <style name="Widget.DeviceDefault.Light.PopupWindow.ActionMode" parent="Widget.Holo.Light.PopupWindow.ActionMode" > + + </style> + <style name="Widget.DeviceDefault.Light.Button.Borderless" parent="Widget.Holo.Light.Button.Borderless"> + + </style> + <style name="Widget.DeviceDefault.Light.DatePicker" parent="Widget.Holo.Light.DatePicker"> + + </style> + <style name="Widget.DeviceDefault.Light.ExpandableListView.White" parent="Widget.Holo.Light.ExpandableListView.White"> + + </style> + <style name="Widget.DeviceDefault.Light.Gallery" parent="Widget.Holo.Light.Gallery"> + + </style> + <style name="Widget.DeviceDefault.Light.GestureOverlayView" parent="Widget.Holo.Light.GestureOverlayView"> + + </style> + <style name="Widget.DeviceDefault.Light.ImageWell" parent="Widget.Holo.Light.ImageWell"> + + </style> + <style name="Widget.DeviceDefault.Light.ListView.White" parent="Widget.Holo.Light.ListView.White"> + + </style> + <style name="Widget.DeviceDefault.Light.NumberPicker" parent="Widget.Holo.Light.NumberPicker"> + + </style> + <style name="Widget.DeviceDefault.Light.Spinner.DropDown" parent="Widget.Holo.Light.Spinner.DropDown"> + + </style> + <style name="Widget.DeviceDefault.Light.TextView.ListSeparator" parent="Widget.Holo.Light.TextView.ListSeparator"> + + </style> + <style name="Widget.DeviceDefault.Light.TimePicker" parent="Widget.Holo.Light.TimePicker"> + + </style> + <style name="Widget.DeviceDefault.Light.TextSuggestionsPopupWindow" parent="Widget.Holo.Light.TextSuggestionsPopupWindow"> + + </style> <!-- Text Appearance Styles --> - <style name="TextAppearance.DeviceDefault" parent="TextAppearance.Quantum"/> - <style name="TextAppearance.DeviceDefault.Inverse" parent="TextAppearance.Quantum.Inverse"/> - <style name="TextAppearance.DeviceDefault.Large" parent="TextAppearance.Quantum.Large"/> - <style name="TextAppearance.DeviceDefault.Large.Inverse" parent="TextAppearance.Quantum.Large.Inverse"/> - <style name="TextAppearance.DeviceDefault.Medium" parent="TextAppearance.Quantum.Medium"/> - <style name="TextAppearance.DeviceDefault.Medium.Inverse" parent="TextAppearance.Quantum.Medium.Inverse"/> - <style name="TextAppearance.DeviceDefault.Small" parent="TextAppearance.Quantum.Small"/> - <style name="TextAppearance.DeviceDefault.Small.Inverse" parent="TextAppearance.Quantum.Small.Inverse"/> - <style name="TextAppearance.DeviceDefault.SearchResult.Title" parent="TextAppearance.Quantum.SearchResult.Title"/> - <style name="TextAppearance.DeviceDefault.SearchResult.Subtitle" parent="TextAppearance.Quantum.SearchResult.Subtitle"/> - <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Quantum.Widget"/> - <style name="TextAppearance.DeviceDefault.Widget.Button" parent="TextAppearance.Quantum.Widget.Button"/> - <style name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" parent="TextAppearance.Quantum.Widget.IconMenu.Item"/> - <style name="TextAppearance.DeviceDefault.Widget.TabWidget" parent="TextAppearance.Quantum.Widget.TabWidget"/> - <style name="TextAppearance.DeviceDefault.Widget.TextView" parent="TextAppearance.Quantum.Widget.TextView"/> - <style name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" parent="TextAppearance.Quantum.Widget.TextView.PopupMenu"/> - <style name="TextAppearance.DeviceDefault.Widget.DropDownHint" parent="TextAppearance.Quantum.Widget.DropDownHint"/> - <style name="TextAppearance.DeviceDefault.Widget.DropDownItem" parent="TextAppearance.Quantum.Widget.DropDownItem"/> - <style name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" parent="TextAppearance.Quantum.Widget.TextView.SpinnerItem"/> - <style name="TextAppearance.DeviceDefault.Widget.EditText" parent="TextAppearance.Quantum.Widget.EditText"/> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu" parent="TextAppearance.Quantum.Widget.PopupMenu"/> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" parent="TextAppearance.Quantum.Widget.PopupMenu.Large"/> - <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" parent="TextAppearance.Quantum.Widget.PopupMenu.Small"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Quantum.Widget.ActionBar.Title"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" parent="TextAppearance.Quantum.Widget.ActionBar.Subtitle"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" parent="TextAppearance.Quantum.Widget.ActionMode.Title"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" parent="TextAppearance.Quantum.Widget.ActionMode.Subtitle"/> - <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Quantum.WindowTitle"/> - <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Quantum.DialogWindowTitle"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Quantum.Widget.ActionBar.Title.Inverse"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.Quantum.Widget.ActionBar.Subtitle.Inverse"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" parent="TextAppearance.Quantum.Widget.ActionMode.Title.Inverse"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Quantum.Widget.ActionMode.Subtitle.Inverse"/> - <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" parent="TextAppearance.Quantum.Widget.ActionBar.Menu"/> - <style name="TextAppearance.DeviceDefault.Light" parent="TextAppearance.Quantum.Light"/> - <style name="TextAppearance.DeviceDefault.Light.Inverse" parent="TextAppearance.Quantum.Light.Inverse"/> - <style name="TextAppearance.DeviceDefault.Light.Large" parent="TextAppearance.Quantum.Light.Large"/> - <style name="TextAppearance.DeviceDefault.Light.Large.Inverse" parent="TextAppearance.Quantum.Light.Large.Inverse"/> - <style name="TextAppearance.DeviceDefault.Light.Medium" parent="TextAppearance.Quantum.Light.Medium"/> - <style name="TextAppearance.DeviceDefault.Light.Medium.Inverse" parent="TextAppearance.Quantum.Light.Medium.Inverse"/> - <style name="TextAppearance.DeviceDefault.Light.SearchResult.Subtitle" parent="TextAppearance.Quantum.Light.SearchResult.Subtitle"/> - <style name="TextAppearance.DeviceDefault.Light.SearchResult.Title" parent="TextAppearance.Quantum.Light.SearchResult.Title"/> - <style name="TextAppearance.DeviceDefault.Light.Small" parent="TextAppearance.Quantum.Light.Small"/> - <style name="TextAppearance.DeviceDefault.Light.Small.Inverse" parent="TextAppearance.Quantum.Light.Small.Inverse"/> - <style name="TextAppearance.DeviceDefault.Light.Widget.Button" parent="TextAppearance.Quantum.Light.Widget.Button"/> - <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Large" parent="TextAppearance.Quantum.Light.Widget.PopupMenu.Large"/> - <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Small" parent="TextAppearance.Quantum.Light.Widget.PopupMenu.Small"/> + <style name="TextAppearance.DeviceDefault" parent="TextAppearance.Holo" > + + </style> + <style name="TextAppearance.DeviceDefault.Inverse" parent="TextAppearance.Holo.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Large" parent="TextAppearance.Holo.Large" > + + </style> + <style name="TextAppearance.DeviceDefault.Large.Inverse" parent="TextAppearance.Holo.Large.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Medium" parent="TextAppearance.Holo.Medium" > + + </style> + <style name="TextAppearance.DeviceDefault.Medium.Inverse" parent="TextAppearance.Holo.Medium.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Small" parent="TextAppearance.Holo.Small" > + + </style> + <style name="TextAppearance.DeviceDefault.Small.Inverse" parent="TextAppearance.Holo.Small.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.SearchResult.Title" parent="TextAppearance.Holo.SearchResult.Title" > + + </style> + <style name="TextAppearance.DeviceDefault.SearchResult.Subtitle" parent="TextAppearance.Holo.SearchResult.Subtitle" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget" parent="TextAppearance.Holo.Widget" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.Button" parent="TextAppearance.Holo.Widget.Button" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.IconMenu.Item" parent="TextAppearance.Holo.Widget.IconMenu.Item" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.TabWidget" parent="TextAppearance.Holo.Widget.TabWidget" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.TextView" parent="TextAppearance.Holo.Widget.TextView" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.TextView.PopupMenu" parent="TextAppearance.Holo.Widget.TextView.PopupMenu" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.DropDownHint" parent="TextAppearance.Holo.Widget.DropDownHint" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.DropDownItem" parent="TextAppearance.Holo.Widget.DropDownItem" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.TextView.SpinnerItem" parent="TextAppearance.Holo.Widget.TextView.SpinnerItem" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.EditText" parent="TextAppearance.Holo.Widget.EditText" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu" parent="TextAppearance.Holo.Widget.PopupMenu" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Large" parent="TextAppearance.Holo.Widget.PopupMenu.Large" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.PopupMenu.Small" parent="TextAppearance.Holo.Widget.PopupMenu.Small" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title" parent="TextAppearance.Holo.Widget.ActionBar.Title" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle" parent="TextAppearance.Holo.Widget.ActionBar.Subtitle" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title" parent="TextAppearance.Holo.Widget.ActionMode.Title" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle" parent="TextAppearance.Holo.Widget.ActionMode.Subtitle" > + + </style> + <style name="TextAppearance.DeviceDefault.WindowTitle" parent="TextAppearance.Holo.WindowTitle" > + + </style> + <style name="TextAppearance.DeviceDefault.DialogWindowTitle" parent="TextAppearance.Holo.DialogWindowTitle" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Title.Inverse" parent="TextAppearance.Holo.Widget.ActionBar.Title.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Subtitle.Inverse" parent="TextAppearance.Holo.Widget.ActionBar.Subtitle.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Title.Inverse" parent="TextAppearance.Holo.Widget.ActionMode.Title.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionMode.Subtitle.Inverse" parent="TextAppearance.Holo.Widget.ActionMode.Subtitle.Inverse" > + + </style> + <style name="TextAppearance.DeviceDefault.Widget.ActionBar.Menu" parent="TextAppearance.Holo.Widget.ActionBar.Menu" > + + </style> + <style name="TextAppearance.DeviceDefault.Light" parent="TextAppearance.Holo.Light"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Inverse" parent="TextAppearance.Holo.Light.Inverse"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Large" parent="TextAppearance.Holo.Light.Large"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Large.Inverse" parent="TextAppearance.Holo.Light.Large.Inverse"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Medium" parent="TextAppearance.Holo.Light.Medium"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Medium.Inverse" parent="TextAppearance.Holo.Light.Medium.Inverse"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.SearchResult.Subtitle" parent="TextAppearance.Holo.Light.SearchResult.Subtitle"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.SearchResult.Title" parent="TextAppearance.Holo.Light.SearchResult.Title"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Small" parent="TextAppearance.Holo.Light.Small"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Small.Inverse" parent="TextAppearance.Holo.Light.Small.Inverse"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Widget.Button" parent="TextAppearance.Holo.Light.Widget.Button"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Large" parent="TextAppearance.Holo.Light.Widget.PopupMenu.Large"> + + </style> + <style name="TextAppearance.DeviceDefault.Light.Widget.PopupMenu.Small" parent="TextAppearance.Holo.Light.Widget.PopupMenu.Small"> + + </style> <!-- Preference Styles --> - <style name="Preference.DeviceDefault" parent="Preference.Quantum"/> - <style name="Preference.DeviceDefault.Category" parent="Preference.Quantum.Category"/> - <style name="Preference.DeviceDefault.CheckBoxPreference" parent="Preference.Quantum.CheckBoxPreference"/> - <style name="Preference.DeviceDefault.DialogPreference" parent="Preference.Quantum.DialogPreference"/> - <style name="Preference.DeviceDefault.DialogPreference.EditTextPreference" parent="Preference.Quantum.DialogPreference.EditTextPreference"/> - <style name="Preference.DeviceDefault.DialogPreference.YesNoPreference" parent="Preference.Quantum.DialogPreference.YesNoPreference"/> - <style name="Preference.DeviceDefault.Information" parent="Preference.Quantum.Information"/> - <style name="Preference.DeviceDefault.PreferenceScreen" parent="Preference.Quantum.PreferenceScreen"/> - <style name="Preference.DeviceDefault.RingtonePreference" parent="Preference.Quantum.RingtonePreference"/> - <style name="Preference.DeviceDefault.SwitchPreference" parent="Preference.Quantum.SwitchPreference"/> + <style name="Preference.DeviceDefault" parent="Preference.Holo"> + + </style> + <style name="Preference.DeviceDefault.Category" parent="Preference.Holo.Category"> + + </style> + <style name="Preference.DeviceDefault.CheckBoxPreference" parent="Preference.Holo.CheckBoxPreference"> + + </style> + <style name="Preference.DeviceDefault.DialogPreference" parent="Preference.Holo.DialogPreference"> + + </style> + <style name="Preference.DeviceDefault.DialogPreference.EditTextPreference" parent="Preference.Holo.DialogPreference.EditTextPreference"> + + </style> + <style name="Preference.DeviceDefault.DialogPreference.YesNoPreference" parent="Preference.Holo.DialogPreference.YesNoPreference"> + + </style> + <style name="Preference.DeviceDefault.Information" parent="Preference.Holo.Information"> + + </style> + <style name="Preference.DeviceDefault.PreferenceScreen" parent="Preference.Holo.PreferenceScreen"> + + </style> + <style name="Preference.DeviceDefault.RingtonePreference" parent="Preference.Holo.RingtonePreference"> + + </style> + <style name="Preference.DeviceDefault.SwitchPreference" parent="Preference.Holo.SwitchPreference"> + + </style> <!-- AlertDialog Styles --> - <style name="AlertDialog.DeviceDefault" parent="AlertDialog.Quantum"/> - <style name="AlertDialog.DeviceDefault.Light" parent="AlertDialog.Quantum.Light"/> + <style name="AlertDialog.DeviceDefault" parent="AlertDialog.Holo"> + + </style> + <style name="AlertDialog.DeviceDefault.Light" parent="AlertDialog.Holo.Light" > + + </style> <!-- Animation Styles --> - <style name="Animation.DeviceDefault.Activity" parent="Animation.Quantum.Activity"/> - <style name="Animation.DeviceDefault.Dialog" parent="Animation.Quantum.Dialog"/> + <style name="Animation.DeviceDefault.Activity" parent="Animation.Holo.Activity"> + + </style> + <style name="Animation.DeviceDefault.Dialog" parent="Animation.Holo.Dialog"> + + </style> <!-- DialogWindowTitle Styles --> - <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Quantum"/> - <style name="DialogWindowTitle.DeviceDefault.Light" parent="DialogWindowTitle.Quantum.Light"/> + <style name="DialogWindowTitle.DeviceDefault" parent="DialogWindowTitle.Holo"> + + </style> + <style name="DialogWindowTitle.DeviceDefault.Light" parent="DialogWindowTitle.Holo.Light"> + + </style> <!-- WindowTitle Styles --> - <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Quantum"/> - <style name="WindowTitleBackground.DeviceDefault" parent="WindowTitleBackground.Quantum"/> + <style name="WindowTitle.DeviceDefault" parent="WindowTitle.Holo"> + + </style> + <style name="WindowTitleBackground.DeviceDefault" parent="WindowTitleBackground.Holo"> + + </style> <!-- Other Styles --> - <style name="DeviceDefault.ButtonBar" parent="Quantum.ButtonBar"/> - <style name="DeviceDefault.ButtonBar.AlertDialog" parent="Quantum.ButtonBar.AlertDialog"/> - <style name="DeviceDefault.SegmentedButton" parent="Quantum.SegmentedButton"/> - <style name="DeviceDefault.Light.ButtonBar" parent="Quantum.Light.ButtonBar"/> - <style name="DeviceDefault.Light.ButtonBar.AlertDialog" parent="Quantum.Light.ButtonBar.AlertDialog"/> - <style name="DeviceDefault.Light.SegmentedButton" parent="Quantum.Light.SegmentedButton"/> - - <style name="Widget.DeviceDefault.MediaRouteButton" parent="Widget.Quantum.MediaRouteButton" /> - <style name="Widget.DeviceDefault.Light.MediaRouteButton" parent="Widget.Quantum.Light.MediaRouteButton" /> - - <style name="TextAppearance.DeviceDefault.TimePicker.TimeLabel" parent="TextAppearance.Quantum.TimePicker.TimeLabel"/> - <style name="TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel" parent="TextAppearance.Quantum.Light.TimePicker.TimeLabel"/> - <style name="TextAppearance.DeviceDefault.TimePicker.AmPmLabel" parent="TextAppearance.Quantum.TimePicker.AmPmLabel"/> - <style name="TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel" parent="TextAppearance.Quantum.Light.TimePicker.AmPmLabel"/> - <style name="Theme.DeviceDefault.Dialog.TimePicker" parent="Theme.Quantum.Dialog.TimePicker"/> - <style name="Theme.DeviceDefault.Light.Dialog.TimePicker" parent="Theme.Quantum.Light.Dialog.TimePicker"/> + <style name="DeviceDefault.ButtonBar" parent="Holo.ButtonBar" > + + </style> + <style name="DeviceDefault.ButtonBar.AlertDialog" parent="Holo.ButtonBar.AlertDialog" > + + </style> + <style name="DeviceDefault.SegmentedButton" parent="Holo.SegmentedButton" > + + </style> + <style name="DeviceDefault.Light.ButtonBar" parent="Holo.Light.ButtonBar" > + + </style> + <style name="DeviceDefault.Light.ButtonBar.AlertDialog" parent="Holo.Light.ButtonBar.AlertDialog" > + + </style> + <style name="DeviceDefault.Light.SegmentedButton" parent="Holo.Light.SegmentedButton" > + + </style> + + <style name="Widget.DeviceDefault.MediaRouteButton" parent="Widget.Holo.MediaRouteButton" /> + <style name="Widget.DeviceDefault.Light.MediaRouteButton" parent="Widget.Holo.Light.MediaRouteButton" /> + + <style name="TextAppearance.DeviceDefault.TimePicker.TimeLabel" parent="TextAppearance.Holo.TimePicker.TimeLabel"> + </style> + + <style name="TextAppearance.DeviceDefault.Light.TimePicker.TimeLabel" parent="TextAppearance.Holo.Light.TimePicker.TimeLabel"> + </style> + + <style name="TextAppearance.DeviceDefault.TimePicker.AmPmLabel" parent="TextAppearance.Holo.TimePicker.AmPmLabel"> + </style> + + <style name="TextAppearance.DeviceDefault.Light.TimePicker.AmPmLabel" parent="TextAppearance.Holo.Light.TimePicker.AmPmLabel"> + </style> + + <style name="Theme.DeviceDefault.Dialog.TimePicker" parent="Theme.Holo.Dialog.TimePicker"> + </style> + + <style name="Theme.DeviceDefault.Light.Dialog.TimePicker" parent="Theme.Holo.Light.Dialog.TimePicker"> + </style> + </resources> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 8dac95ca6788..19556a1be990 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -32,24 +32,24 @@ easier. --> <resources> - <!-- The default theme for apps that target API level 20 and higher. + <!-- The default theme for apps that target API level 14 and higher. <p>The DeviceDefault themes are aliases for a specific device’s native look and feel. The DeviceDefault theme family and widget style family offer ways for you to target your app to a device’s native theme with all device customizations intact.</p> - <p>For example, when you set your app's {@code targetSdkVersion} to 20 or higher, this + <p>For example, when you set your app's {@code targetSdkVersion} to 14 or higher, this theme is applied to your application by default. As such, your app might appear with the - {@link #Theme_Quantum_Light Quantum.Light} styles on one device, but with a different set of styles on + {@link #Theme_Holo Holo} styles on one device, but with a different set of styles on another device. This is great if you want your app to fit with the device's native look and feel. If, however, you prefer to keep your UI style the same across all devices, you should - apply a specific theme such as {@link #Theme_Quantum_Light Quantum.Light} or one of your own design. - For more information, read <a - href="http://android-developers.blogspot.com/20XX/XX/quantum-everywhere.html">Quantum.Light + apply a specific theme such as {@link #Theme_Holo Holo} or one of your own design. For more + information, read <a + href="http://android-developers.blogspot.com/2012/01/holo-everywhere.html">Holo Everywhere</a>.</p> <p>Styles used by the DeviceDefault theme are named using the convention Type.DeviceDefault.Etc (for example, {@code Widget.DeviceDefault.Button} and {@code TextAppearance.DeviceDefault.Widget.PopupMenu.Large}).</p> --> - <style name="Theme.DeviceDefault" parent="Theme.Quantum" > + <style name="Theme.DeviceDefault" parent="Theme.Holo" > <!-- Text styles --> <item name="textAppearance">@android:style/TextAppearance.DeviceDefault</item> <item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Inverse</item> @@ -210,29 +210,29 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar --> - <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Quantum.NoActionBar" > + <style name="Theme.DeviceDefault.NoActionBar" parent="Theme.Holo.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar. This theme sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.Fullscreen" parent="Theme.Quantum.NoActionBar.Fullscreen" > + <style name="Theme.DeviceDefault.NoActionBar.Fullscreen" parent="Theme.Holo.NoActionBar.Fullscreen" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with no action bar and no status bar and extending in to overscan region. This theme sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Quantum.NoActionBar.Overscan" > + <style name="Theme.DeviceDefault.NoActionBar.Overscan" parent="Theme.Holo.NoActionBar.Overscan" > </style> <!-- Variant of {@link #Theme_DeviceDefault} that has no title bar and translucent system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and {@link android.R.attr#windowTranslucentNavigation} to true. --> - <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Quantum.NoActionBar.TranslucentDecor" > + <style name="Theme.DeviceDefault.NoActionBar.TranslucentDecor" parent="Theme.Holo.NoActionBar.TranslucentDecor" > </style> <!-- Variant of {@link #Theme_DeviceDefault} with a light-colored style --> - <style name="Theme.DeviceDefault.Light" parent="Theme.Quantum.Light" > + <style name="Theme.DeviceDefault.Light" parent="Theme.Holo.Light" > <!-- Text styles --> <item name="textAppearance">@android:style/TextAppearance.DeviceDefault.Light</item> <item name="textAppearanceInverse">@android:style/TextAppearance.DeviceDefault.Light.Inverse</item> @@ -387,29 +387,29 @@ easier. <item name="mediaRouteButtonStyle">@android:style/Widget.DeviceDefault.Light.MediaRouteButton</item> </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar --> - <style name="Theme.DeviceDefault.Light.NoActionBar" parent="Theme.Quantum.Light.NoActionBar" > + <style name="Theme.DeviceDefault.Light.NoActionBar" parent="Theme.Holo.Light.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar. This theme sets {@link android.R.attr#windowFullscreen} to true. --> - <style name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" parent="Theme.Quantum.Light.NoActionBar.Fullscreen" > + <style name="Theme.DeviceDefault.Light.NoActionBar.Fullscreen" parent="Theme.Holo.Light.NoActionBar.Fullscreen" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} with no action bar and no status bar and extending in to overscan region. This theme sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan} to true. --> <style name="Theme.DeviceDefault.Light.NoActionBar.Overscan" - parent="Theme.Quantum.Light.NoActionBar.Overscan" > + parent="Theme.Holo.Light.NoActionBar.Overscan" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light} that has no title bar and translucent system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and {@link android.R.attr#windowTranslucentNavigation} to true. --> <style name="Theme.DeviceDefault.Light.NoActionBar.TranslucentDecor" - parent="Theme.Quantum.Light.NoActionBar.TranslucentDecor" > + parent="Theme.Holo.Light.NoActionBar.TranslucentDecor" > </style> <!-- DeviceDefault theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog. --> - <style name="Theme.DeviceDefault.Dialog" parent="Theme.Quantum.Dialog" > + <style name="Theme.DeviceDefault.Dialog" parent="Theme.Holo.Dialog" > <item name="android:windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault</item> <item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Dialog</item> @@ -421,16 +421,16 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Dialog.MinWidth" parent="Theme.Quantum.Dialog.MinWidth" > + <style name="Theme.DeviceDefault.Dialog.MinWidth" parent="Theme.Holo.Dialog.MinWidth" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog} without an action bar --> - <style name="Theme.DeviceDefault.Dialog.NoActionBar" parent="Theme.Quantum.Dialog.NoActionBar" > + <style name="Theme.DeviceDefault.Dialog.NoActionBar" parent="Theme.Holo.Dialog.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Dialog_NoActionBar} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" parent="Theme.Quantum.Dialog.NoActionBar.MinWidth" > + <style name="Theme.DeviceDefault.Dialog.NoActionBar.MinWidth" parent="Theme.Holo.Dialog.NoActionBar.MinWidth" > </style> @@ -453,7 +453,7 @@ easier. <!-- DeviceDefault light theme for dialog windows and activities. This changes the window to be floating (not fill the entire screen), and puts a frame around its contents. You can set this theme on an activity if you would like to make an activity that looks like a Dialog.--> - <style name="Theme.DeviceDefault.Light.Dialog" parent="Theme.Quantum.Light.Dialog" > + <style name="Theme.DeviceDefault.Light.Dialog" parent="Theme.Holo.Light.Dialog" > <item name="android:windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault.Light</item> <item name="android:windowAnimationStyle">@android:style/Animation.DeviceDefault.Dialog</item> @@ -465,16 +465,16 @@ easier. </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Light.Dialog.MinWidth" parent="Theme.Quantum.Light.Dialog.MinWidth" > + <style name="Theme.DeviceDefault.Light.Dialog.MinWidth" parent="Theme.Holo.Light.Dialog.MinWidth" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog} without an action bar --> - <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Quantum.Light.Dialog.NoActionBar" > + <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar" parent="Theme.Holo.Light.Dialog.NoActionBar" > </style> <!-- Variant of {@link #Theme_DeviceDefault_Light_Dialog_NoActionBar} that has a nice minimum width for a regular dialog. --> - <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" parent="Theme.Quantum.Light.Dialog.NoActionBar.MinWidth" > + <style name="Theme.DeviceDefault.Light.Dialog.NoActionBar.MinWidth" parent="Theme.Holo.Light.Dialog.NoActionBar.MinWidth" > </style> @@ -496,65 +496,65 @@ easier. <!-- DeviceDefault theme for a window that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Quantum.DialogWhenLarge" > + <style name="Theme.DeviceDefault.DialogWhenLarge" parent="Theme.Holo.DialogWhenLarge" > </style> <!-- DeviceDefault theme for a window without an action bar that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" parent="Theme.Quantum.DialogWhenLarge.NoActionBar" > + <style name="Theme.DeviceDefault.DialogWhenLarge.NoActionBar" parent="Theme.Holo.DialogWhenLarge.NoActionBar" > </style> <!-- DeviceDefault light theme for a window that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.Light.DialogWhenLarge" parent="Theme.Quantum.Light.DialogWhenLarge" > + <style name="Theme.DeviceDefault.Light.DialogWhenLarge" parent="Theme.Holo.Light.DialogWhenLarge" > </style> <!-- DeviceDefault light theme for a window without an action bar that will be displayed either full-screen on smaller screens (small, normal) or as a dialog on larger screens (large, xlarge). --> - <style name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" parent="Theme.Quantum.Light.DialogWhenLarge.NoActionBar" > + <style name="Theme.DeviceDefault.Light.DialogWhenLarge.NoActionBar" parent="Theme.Holo.Light.DialogWhenLarge.NoActionBar" > </style> <!-- DeviceDefault theme for a presentation window on a secondary display. --> - <style name="Theme.DeviceDefault.Dialog.Presentation" parent="Theme.Quantum.Dialog.Presentation"> + <style name="Theme.DeviceDefault.Dialog.Presentation" parent="Theme.Holo.Dialog.Presentation"> </style> <!-- DeviceDefault light theme for a presentation window on a secondary display. --> - <style name="Theme.DeviceDefault.Light.Dialog.Presentation" parent="Theme.Quantum.Light.Dialog.Presentation"> + <style name="Theme.DeviceDefault.Light.Dialog.Presentation" parent="Theme.Holo.Light.Dialog.Presentation"> </style> <!-- DeviceDefault theme for panel windows. This removes all extraneous window decorations, so you basically have an empty rectangle in which to place your content. It makes the window floating, with a transparent background, and turns off dimming behind the window. --> - <style name="Theme.DeviceDefault.Panel" parent="Theme.Quantum.Panel" > + <style name="Theme.DeviceDefault.Panel" parent="Theme.Holo.Panel" > </style> <!-- DeviceDefault light theme for panel windows. This removes all extraneous window decorations, so you basically have an empty rectangle in which to place your content. It makes the window floating, with a transparent background, and turns off dimming behind the window. --> - <style name="Theme.DeviceDefault.Light.Panel" parent="Theme.Quantum.Light.Panel" > + <style name="Theme.DeviceDefault.Light.Panel" parent="Theme.Holo.Light.Panel" > </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear behind them. --> - <style name="Theme.DeviceDefault.Wallpaper" parent="Theme.Quantum.Wallpaper" > + <style name="Theme.DeviceDefault.Wallpaper" parent="Theme.Holo.Wallpaper" > </style> <!-- DeviceDefault theme for windows that want to have the user's selected wallpaper appear behind them and without an action bar. --> - <style name="Theme.DeviceDefault.Wallpaper.NoTitleBar" parent="Theme.Quantum.Wallpaper.NoTitleBar" > + <style name="Theme.DeviceDefault.Wallpaper.NoTitleBar" parent="Theme.Holo.Wallpaper.NoTitleBar" > </style> <!-- DeviceDefault style for input methods, which is used by the {@link android.inputmethodservice.InputMethodService} class.--> - <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Quantum.InputMethod" > + <style name="Theme.DeviceDefault.InputMethod" parent="Theme.Holo.InputMethod" > </style> <!-- Variant of the DeviceDefault (light) theme that has a solid (opaque) action bar with an inverse color profile. --> - <style name="Theme.DeviceDefault.Light.DarkActionBar" parent="Theme.Quantum.Light.DarkActionBar" > + <style name="Theme.DeviceDefault.Light.DarkActionBar" parent="Theme.Holo.Light.DarkActionBar" > <item name="android:actionBarStyle">@android:style/Widget.DeviceDefault.Light.ActionBar.Solid.Inverse</item> <item name="actionDropDownStyle">@android:style/Widget.DeviceDefault.Spinner.DropDown.ActionBar</item> @@ -569,20 +569,20 @@ easier. </style> - <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Quantum.Dialog.Alert"> + <style name="Theme.DeviceDefault.Dialog.Alert" parent="Theme.Holo.Dialog.Alert"> <item name="windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault</item> </style> - <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Quantum.Light.Dialog.Alert"> + <style name="Theme.DeviceDefault.Light.Dialog.Alert" parent="Theme.Holo.Light.Dialog.Alert"> <item name="windowTitleStyle">@android:style/DialogWindowTitle.DeviceDefault.Light</item> </style> - <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Quantum.SearchBar"> + <style name="Theme.DeviceDefault.SearchBar" parent="Theme.Holo.SearchBar"> </style> - <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.Quantum.Light.SearchBar"> + <style name="Theme.DeviceDefault.Light.SearchBar" parent="Theme.Holo.Light.SearchBar"> </style> - <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Quantum.Dialog.NoFrame"> + <style name="Theme.DeviceDefault.Dialog.NoFrame" parent="Theme.Holo.Dialog.NoFrame"> </style> </resources> diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd index dd29b82b2205..46ad90529ae9 100644 --- a/docs/html/google/play/billing/billing_admin.jd +++ b/docs/html/google/play/billing/billing_admin.jd @@ -153,8 +153,7 @@ number of in-app items.</p> </li> <li><strong>Description</strong> <p>The description is a long descriptor for the item. For example, "Instantly puts creatures to - sleep. Does not work on angry elves." Every item must have a description. The description is - visible to users during checkout. Descriptions can be up to 80 characters in length.</p> + sleep. Does not work on angry elves." Every item must have a description. Descriptions can be up to 80 characters in length.</p> </li> <li><strong>Price</strong> <p>You must provide a default price in your home currency. You can also provide prices in other diff --git a/docs/html/google/play/billing/billing_overview.jd b/docs/html/google/play/billing/billing_overview.jd index 581c648e5e58..301d9119a459 100644 --- a/docs/html/google/play/billing/billing_overview.jd +++ b/docs/html/google/play/billing/billing_overview.jd @@ -130,13 +130,6 @@ Google Play sends your application the purchase details, such as the order number, the order date and time, and the price paid. At no point does your application have to handle any financial transactions; that role is provided by Google Play.</p> -<img src="{@docRoot}images/in-app-billing/v3/iab_v3_checkout_flow.png" height="382" id="figure1" /> -<p class="img-caption"> - <strong>Figure 1.</strong> Applications initiate In-app Billing requests -through their own UI (first screen). Google Play responds to the request by -providing the checkout user interface (middle screen). When checkout is -complete, the application resumes. -</p> <h2 id="samples">Sample Application</h2> <p>To help you integrate In-app Billing into your application, the Android SDK diff --git a/docs/html/guide/topics/media/mediaplayer.jd b/docs/html/guide/topics/media/mediaplayer.jd index 63c04a219f95..6d03af61b2e8 100644 --- a/docs/html/guide/topics/media/mediaplayer.jd +++ b/docs/html/guide/topics/media/mediaplayer.jd @@ -119,7 +119,7 @@ mediaPlayer.start(); // no need to call prepare(); create() does that for you <p>In this case, a "raw" resource is a file that the system does not try to parse in any particular way. However, the content of this resource should not -be raw audio. It should be a properly encoded and formatted media file in one +be raw audio. It should be a properly encoded and formatted media file in one of the supported formats.</p> <p>And here is how you might play from a URI available locally in the system @@ -207,7 +207,7 @@ call {@link android.media.MediaPlayer#stop stop()}, however, notice that you cannot call {@link android.media.MediaPlayer#start start()} again until you prepare the {@link android.media.MediaPlayer} again.</p> -<p>Always keep <a href='{@docRoot}images/mediaplayer_state_diagram.gif'>the state diagram</a> +<p>Always keep <a href='{@docRoot}images/mediaplayer_state_diagram.gif'>the state diagram</a> in mind when writing code that interacts with a {@link android.media.MediaPlayer} object, because calling its methods from the wrong state is a common cause of bugs.</p> @@ -238,7 +238,7 @@ mediaPlayer = null; <p>As an example, consider the problems that could happen if you forgot to release the {@link android.media.MediaPlayer} when your activity is stopped, but create a new one when the activity starts again. As you may know, when the user changes the -screen orientation (or changes the device configuration in another way), +screen orientation (or changes the device configuration in another way), the system handles that by restarting the activity (by default), so you might quickly consume all of the system resources as the user rotates the device back and forth between portrait and landscape, because at each @@ -287,7 +287,7 @@ For example:</p> <pre> public class MyService extends Service implements MediaPlayer.OnPreparedListener { - private static final ACTION_PLAY = "com.example.action.PLAY"; + private static final String ACTION_PLAY = "com.example.action.PLAY"; MediaPlayer mMediaPlayer = null; public int onStartCommand(Intent intent, int flags, int startId) { @@ -346,7 +346,7 @@ and you must reset it before you can use it again. <p>When designing applications that play media in the background, the device may go to sleep while your service is running. Because the Android system tries to conserve -battery while the device is sleeping, the system tries to shut off any +battery while the device is sleeping, the system tries to shut off any of the phone's features that are not necessary, including the CPU and the WiFi hardware. However, if your service is playing or streaming music, you want to prevent @@ -473,7 +473,7 @@ the user might not hear the notification tone due to the loud music. Starting wi Android 2.2, the platform offers a way for applications to negotiate their use of the device's audio output. This mechanism is called Audio Focus.</p> -<p>When your application needs to output audio such as music or a notification, +<p>When your application needs to output audio such as music or a notification, you should always request audio focus. Once it has focus, it can use the sound output freely, but it should always listen for focus changes. If it is notified that it has lost the audio @@ -691,7 +691,7 @@ adding the following to your manifest:</p> intent. You should then implement this class:</p> <pre> -public class MusicIntentReceiver implements android.content.BroadcastReceiver { +public class MusicIntentReceiver extends android.content.BroadcastReceiver { @Override public void onReceive(Context ctx, Intent intent) { if (intent.getAction().equals( diff --git a/docs/html/tools/support-library/setup.jd b/docs/html/tools/support-library/setup.jd index 2d2065ad089e..2325a1387235 100644 --- a/docs/html/tools/support-library/setup.jd +++ b/docs/html/tools/support-library/setup.jd @@ -206,6 +206,14 @@ project</a> based on the support library code:</p> <li>In the properties window, click <strong>OK</strong>.</li> </ol> +<p class="note"> + <strong>Note:</strong> If you are using the {@code android-support-v7-mediarouter} support + library, you should note that it depends on the {@code android-support-v7-appcompat} library. + In order for the v7 mediarouter library to compile, you must import both library projects into + your development workspace. Then follow the procedure above to add the v7 appcompat project as a + library to the v7 mediarouter library project. +</p> + </div> </div> diff --git a/docs/html/training/articles/perf-jni.jd b/docs/html/training/articles/perf-jni.jd index 435d231768f7..1a40f6237679 100644 --- a/docs/html/training/articles/perf-jni.jd +++ b/docs/html/training/articles/perf-jni.jd @@ -444,7 +444,9 @@ adb shell start</pre> <pre>D Late-enabling CheckJNI</pre> - +<p>You can also set the <code>android:debuggable</code> attribute in your application's manifest to +turn on CheckJNI just for your app. Note that the Android build tools will do this automatically for +certain build types. <a name="native_libraries" id="native_libraries"></a> diff --git a/docs/html/training/managing-audio/audio-focus.jd b/docs/html/training/managing-audio/audio-focus.jd index 33f04e99f466..6dcaa7f8105e 100644 --- a/docs/html/training/managing-audio/audio-focus.jd +++ b/docs/html/training/managing-audio/audio-focus.jd @@ -68,7 +68,7 @@ int result = am.requestAudioFocus(afChangeListener, AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { - am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); + am.registerMediaButtonEventReceiver(RemoteControlReceiver); // Start playback. } </pre> @@ -118,7 +118,7 @@ app requests it. How your app responds to a loss of audio focus depends on the m loss.</p> <p>The {@link android.media.AudioManager.OnAudioFocusChangeListener#onAudioFocusChange -onAudioFocusChange()} callback method of they audio focus change listener you registered when +onAudioFocusChange()} callback method of the audio focus change listener you registered when requesting audio focus receives a parameter that describes the focus change event. Specifically, the possible focus loss events mirror the focus request types from the previous section—permanent loss, transient loss, and transient with ducking permitted.</p> diff --git a/graphics/java/android/graphics/BitmapRegionDecoder.java b/graphics/java/android/graphics/BitmapRegionDecoder.java index 3a99977df758..e689b083ad97 100644 --- a/graphics/java/android/graphics/BitmapRegionDecoder.java +++ b/graphics/java/android/graphics/BitmapRegionDecoder.java @@ -33,7 +33,7 @@ import java.io.InputStream; * */ public final class BitmapRegionDecoder { - private int mNativeBitmapRegionDecoder; + private long mNativeBitmapRegionDecoder; private boolean mRecycled; // ensures that the native decoder object exists and that only one decode can // occur at a time. @@ -114,7 +114,7 @@ public final class BitmapRegionDecoder { boolean isShareable) throws IOException { if (is instanceof AssetManager.AssetInputStream) { return nativeNewInstance( - ((AssetManager.AssetInputStream) is).getAssetInt(), + ((AssetManager.AssetInputStream) is).getNativeAsset(), isShareable); } else { // pass some temp storage down to the native code. 1024 is made up, @@ -165,7 +165,7 @@ public final class BitmapRegionDecoder { This can be called from JNI code. */ - private BitmapRegionDecoder(int decoder) { + private BitmapRegionDecoder(long decoder) { mNativeBitmapRegionDecoder = decoder; mRecycled = false; } @@ -254,12 +254,12 @@ public final class BitmapRegionDecoder { } } - private static native Bitmap nativeDecodeRegion(int lbm, + private static native Bitmap nativeDecodeRegion(long lbm, int start_x, int start_y, int width, int height, BitmapFactory.Options options); - private static native int nativeGetWidth(int lbm); - private static native int nativeGetHeight(int lbm); - private static native void nativeClean(int lbm); + private static native int nativeGetWidth(long lbm); + private static native int nativeGetHeight(long lbm); + private static native void nativeClean(long lbm); private static native BitmapRegionDecoder nativeNewInstance( byte[] data, int offset, int length, boolean isShareable); @@ -268,5 +268,5 @@ public final class BitmapRegionDecoder { private static native BitmapRegionDecoder nativeNewInstance( InputStream is, byte[] storage, boolean isShareable); private static native BitmapRegionDecoder nativeNewInstance( - int asset, boolean isShareable); + long asset, boolean isShareable); } diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java index 9419faf15ff8..b0a4553cf759 100644 --- a/graphics/java/android/graphics/Movie.java +++ b/graphics/java/android/graphics/Movie.java @@ -21,9 +21,9 @@ import java.io.InputStream; import java.io.FileInputStream; public class Movie { - private final int mNativeMovie; + private final long mNativeMovie; - private Movie(int nativeMovie) { + private Movie(long nativeMovie) { if (nativeMovie == 0) { throw new RuntimeException("native movie creation failed"); } @@ -48,19 +48,19 @@ public class Movie { return null; } if (is instanceof AssetManager.AssetInputStream) { - final int asset = ((AssetManager.AssetInputStream) is).getAssetInt(); + final long asset = ((AssetManager.AssetInputStream) is).getNativeAsset(); return nativeDecodeAsset(asset); } return nativeDecodeStream(is); } - private static native Movie nativeDecodeAsset(int asset); + private static native Movie nativeDecodeAsset(long asset); private static native Movie nativeDecodeStream(InputStream is); public static native Movie decodeByteArray(byte[] data, int offset, int length); - private static native void nativeDestructor(int nativeMovie); + private static native void nativeDestructor(long nativeMovie); public static Movie decodeFile(String pathName) { InputStream is; diff --git a/graphics/java/android/graphics/PathMeasure.java b/graphics/java/android/graphics/PathMeasure.java index dba194393b62..ba2228c56e36 100644 --- a/graphics/java/android/graphics/PathMeasure.java +++ b/graphics/java/android/graphics/PathMeasure.java @@ -144,16 +144,16 @@ public class PathMeasure { native_destroy(native_instance); } - private static native int native_create(int native_path, boolean forceClosed); - private static native void native_setPath(int native_instance, int native_path, boolean forceClosed); - private static native float native_getLength(int native_instance); - private static native boolean native_getPosTan(int native_instance, float distance, float pos[], float tan[]); - private static native boolean native_getMatrix(int native_instance, float distance, int native_matrix, int flags); - private static native boolean native_getSegment(int native_instance, float startD, float stopD, int native_path, boolean startWithMoveTo); - private static native boolean native_isClosed(int native_instance); - private static native boolean native_nextContour(int native_instance); - private static native void native_destroy(int native_instance); + private static native long native_create(long native_path, boolean forceClosed); + private static native void native_setPath(long native_instance, long native_path, boolean forceClosed); + private static native float native_getLength(long native_instance); + private static native boolean native_getPosTan(long native_instance, float distance, float pos[], float tan[]); + private static native boolean native_getMatrix(long native_instance, float distance, long native_matrix, int flags); + private static native boolean native_getSegment(long native_instance, float startD, float stopD, long native_path, boolean startWithMoveTo); + private static native boolean native_isClosed(long native_instance); + private static native boolean native_nextContour(long native_instance); + private static native void native_destroy(long native_instance); - /* package */private final int native_instance; + /* package */private final long native_instance; } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 0947d3e122a3..a4891f81d13b 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -107,13 +107,13 @@ public class AudioRecord * Accessed by native methods: provides access to C++ AudioRecord object */ @SuppressWarnings("unused") - private int mNativeRecorderInJavaObj; + private long mNativeRecorderInJavaObj; /** * Accessed by native methods: provides access to the callback data. */ @SuppressWarnings("unused") - private int mNativeCallbackCookie; + private long mNativeCallbackCookie; //--------------------------------------------------------- diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index 3dd6f14f943a..3759108e1817 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -221,13 +221,13 @@ public class AudioTrack * Accessed by native methods: provides access to C++ AudioTrack object. */ @SuppressWarnings("unused") - private int mNativeTrackInJavaObj; + private long mNativeTrackInJavaObj; /** * Accessed by native methods: provides access to the JNI data (i.e. resources used by * the native AudioTrack object, but not stored in it). */ @SuppressWarnings("unused") - private int mJniData; + private long mJniData; //-------------------------------------------------------------------------- diff --git a/media/java/android/media/FaceDetector.java b/media/java/android/media/FaceDetector.java index cf900cece4c3..61991e3735f6 100644 --- a/media/java/android/media/FaceDetector.java +++ b/media/java/android/media/FaceDetector.java @@ -191,9 +191,9 @@ public class FaceDetector { native private void fft_get_face(Face face, int i); native private void fft_destroy(); - private int mFD; - private int mSDK; - private int mDCR; + private long mFD; + private long mSDK; + private long mDCR; private int mWidth; private int mHeight; private int mMaxFaces; diff --git a/media/java/android/media/JetPlayer.java b/media/java/android/media/JetPlayer.java index 06cda34ace73..bd91fc55cd7c 100644 --- a/media/java/android/media/JetPlayer.java +++ b/media/java/android/media/JetPlayer.java @@ -127,7 +127,7 @@ public class JetPlayer * Accessed by native methods: provides access to C++ JetPlayer object */ @SuppressWarnings("unused") - private int mNativePlayerInJavaObj; + private long mNativePlayerInJavaObj; //-------------------------------------------- diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 5175830dd091..ddf88dfdffdc 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -644,5 +644,5 @@ final public class MediaCodec { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaCrypto.java b/media/java/android/media/MediaCrypto.java index 40a132635386..c7c3fc2696dc 100644 --- a/media/java/android/media/MediaCrypto.java +++ b/media/java/android/media/MediaCrypto.java @@ -88,5 +88,5 @@ public final class MediaCrypto { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaExtractor.java b/media/java/android/media/MediaExtractor.java index e558c07d3c87..c3e5035cfe53 100644 --- a/media/java/android/media/MediaExtractor.java +++ b/media/java/android/media/MediaExtractor.java @@ -352,5 +352,5 @@ final public class MediaExtractor { native_init(); } - private int mNativeContext; + private long mNativeContext; } diff --git a/media/java/android/media/MediaMetadataRetriever.java b/media/java/android/media/MediaMetadataRetriever.java index 90144530565b..db27d09caa51 100644 --- a/media/java/android/media/MediaMetadataRetriever.java +++ b/media/java/android/media/MediaMetadataRetriever.java @@ -42,7 +42,7 @@ public class MediaMetadataRetriever // The field below is accessed by native methods @SuppressWarnings("unused") - private int mNativeContext; + private long mNativeContext; private static final int EMBEDDED_PICTURE_TYPE_ANY = 0xFFFF; diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 0e6e8b156b0e..3cceb037b5ba 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -569,8 +569,8 @@ public class MediaPlayer implements SubtitleController.Listener // macro invocation in IMediaPlayer.cpp private final static String IMEDIA_PLAYER = "android.media.IMediaPlayer"; - private int mNativeContext; // accessed by native methods - private int mNativeSurfaceTexture; // accessed by native methods + private long mNativeContext; // accessed by native methods + private long mNativeSurfaceTexture; // accessed by native methods private int mListenerContext; // accessed by native methods private SurfaceHolder mSurfaceHolder; private EventHandler mEventHandler; diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 7b7c06c4ceeb..f8a7bb67daca 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -81,7 +81,7 @@ public class MediaRecorder // The two fields below are accessed by native methods @SuppressWarnings("unused") - private int mNativeContext; + private long mNativeContext; @SuppressWarnings("unused") private Surface mSurface; diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index de3041ed5208..53835e2dbeb2 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -301,7 +301,7 @@ public class MediaScanner // 148 and up don't seem to have been defined yet. }; - private int mNativeContext; + private long mNativeContext; private Context mContext; private String mPackageName; private IContentProvider mMediaProvider; diff --git a/media/java/android/media/RemoteDisplay.java b/media/java/android/media/RemoteDisplay.java index 7afce1aad7fc..4e937a5dc459 100644 --- a/media/java/android/media/RemoteDisplay.java +++ b/media/java/android/media/RemoteDisplay.java @@ -38,12 +38,12 @@ public final class RemoteDisplay { private final Listener mListener; private final Handler mHandler; - private int mPtr; + private long mPtr; - private native int nativeListen(String iface); - private native void nativeDispose(int ptr); - private native void nativePause(int ptr); - private native void nativeResume(int ptr); + private native long nativeListen(String iface); + private native void nativeDispose(long ptr); + private native void nativePause(long ptr); + private native void nativeResume(long ptr); private RemoteDisplay(Listener listener, Handler handler) { mListener = listener; diff --git a/media/java/android/media/SoundPool.java b/media/java/android/media/SoundPool.java index b0c077b188ac..f1b256e0d197 100644 --- a/media/java/android/media/SoundPool.java +++ b/media/java/android/media/SoundPool.java @@ -442,7 +442,7 @@ public class SoundPool { private final static String TAG = "SoundPool"; private final static boolean DEBUG = false; - private int mNativeContext; // accessed by native methods + private long mNativeContext; // accessed by native methods private EventHandler mEventHandler; private SoundPool.OnLoadCompleteListener mOnLoadCompleteListener; diff --git a/media/java/android/media/ToneGenerator.java b/media/java/android/media/ToneGenerator.java index 5592105a66bc..713f147dd4ae 100644 --- a/media/java/android/media/ToneGenerator.java +++ b/media/java/android/media/ToneGenerator.java @@ -887,5 +887,5 @@ public class ToneGenerator protected void finalize() { native_finalize(); } @SuppressWarnings("unused") - private int mNativeContext; // accessed by native methods + private long mNativeContext; // accessed by native methods } diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index b8d437cc97b6..221ea57f8ed8 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -328,20 +328,20 @@ using namespace android; static sp<JMediaCodec> setMediaCodec( JNIEnv *env, jobject thiz, const sp<JMediaCodec> &codec) { - sp<JMediaCodec> old = (JMediaCodec *)env->GetIntField(thiz, gFields.context); + sp<JMediaCodec> old = (JMediaCodec *)env->GetLongField(thiz, gFields.context); if (codec != NULL) { codec->incStrong(thiz); } if (old != NULL) { old->decStrong(thiz); } - env->SetIntField(thiz, gFields.context, (int)codec.get()); + env->SetLongField(thiz, gFields.context, (jlong)codec.get()); return old; } static sp<JMediaCodec> getMediaCodec(JNIEnv *env, jobject thiz) { - return (JMediaCodec *)env->GetIntField(thiz, gFields.context); + return (JMediaCodec *)env->GetLongField(thiz, gFields.context); } static void android_media_MediaCodec_release(JNIEnv *env, jobject thiz) { @@ -710,7 +710,7 @@ static jint android_media_MediaCodec_dequeueInputBuffer( status_t err = codec->dequeueInputBuffer(&index, timeoutUs); if (err == OK) { - return index; + return (jint) index; } return throwExceptionAsNecessary(env, err); @@ -732,7 +732,7 @@ static jint android_media_MediaCodec_dequeueOutputBuffer( env, bufferInfo, &index, timeoutUs); if (err == OK) { - return index; + return (jint) index; } return throwExceptionAsNecessary(env, err); @@ -885,7 +885,7 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) { env, env->FindClass("android/media/MediaCodec")); CHECK(clazz.get() != NULL); - gFields.context = env->GetFieldID(clazz.get(), "mNativeContext", "I"); + gFields.context = env->GetFieldID(clazz.get(), "mNativeContext", "J"); CHECK(gFields.context != NULL); clazz.reset(env->FindClass("android/media/MediaCodec$CryptoInfo")); diff --git a/media/jni/android_media_MediaCrypto.cpp b/media/jni/android_media_MediaCrypto.cpp index d0f56ea57cb7..a6f8dcdda7ba 100644 --- a/media/jni/android_media_MediaCrypto.cpp +++ b/media/jni/android_media_MediaCrypto.cpp @@ -38,7 +38,7 @@ struct fields_t { static fields_t gFields; static sp<JCrypto> getCrypto(JNIEnv *env, jobject thiz) { - return (JCrypto *)env->GetIntField(thiz, gFields.context); + return (JCrypto *)env->GetLongField(thiz, gFields.context); } JCrypto::JCrypto( @@ -146,14 +146,14 @@ using namespace android; static sp<JCrypto> setCrypto( JNIEnv *env, jobject thiz, const sp<JCrypto> &crypto) { - sp<JCrypto> old = (JCrypto *)env->GetIntField(thiz, gFields.context); + sp<JCrypto> old = (JCrypto *)env->GetLongField(thiz, gFields.context); if (crypto != NULL) { crypto->incStrong(thiz); } if (old != NULL) { old->decStrong(thiz); } - env->SetIntField(thiz, gFields.context, (int)crypto.get()); + env->SetLongField(thiz, gFields.context, (jlong)crypto.get()); return old; } @@ -166,7 +166,7 @@ static void android_media_MediaCrypto_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/MediaCrypto"); CHECK(clazz != NULL); - gFields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); } @@ -232,7 +232,7 @@ static jboolean android_media_MediaCrypto_isCryptoSchemeSupportedNative( env, "java/lang/IllegalArgumentException", NULL); - return false; + return JNI_FALSE; } jboolean isCopy; @@ -243,27 +243,27 @@ static jboolean android_media_MediaCrypto_isCryptoSchemeSupportedNative( env->ReleaseByteArrayElements(uuidObj, uuid, 0); uuid = NULL; - return result; + return result ? JNI_TRUE : JNI_FALSE; } static jboolean android_media_MediaCrypto_requiresSecureDecoderComponent( JNIEnv *env, jobject thiz, jstring mimeObj) { if (mimeObj == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return JNI_FALSE; } sp<JCrypto> crypto = getCrypto(env, thiz); if (crypto == NULL) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return JNI_FALSE; } const char *mime = env->GetStringUTFChars(mimeObj, NULL); if (mime == NULL) { - return false; + return JNI_FALSE; } bool result = crypto->requiresSecureDecoderComponent(mime); @@ -271,7 +271,7 @@ static jboolean android_media_MediaCrypto_requiresSecureDecoderComponent( env->ReleaseStringUTFChars(mimeObj, mime); mime = NULL; - return result; + return result ? JNI_TRUE : JNI_FALSE; } static JNINativeMethod gMethods[] = { diff --git a/media/jni/android_media_MediaExtractor.cpp b/media/jni/android_media_MediaExtractor.cpp index 1ac45d4452e3..705de88bba91 100644 --- a/media/jni/android_media_MediaExtractor.cpp +++ b/media/jni/android_media_MediaExtractor.cpp @@ -88,7 +88,7 @@ class JavaDataSourceBridge : public DataSource { env->GetByteArrayRegion(byteArrayObj, 0, size, (jbyte*) buffer); env->DeleteLocalRef(byteArrayObj); if (env->ExceptionCheck()) { - ALOGW("Exception occurred while reading %d at %lld", size, offset); + ALOGW("Exception occurred while reading %zu at %lld", size, offset); LOGW_EX(env); env->ExceptionClear(); return -1; @@ -198,7 +198,7 @@ status_t JMediaExtractor::readSampleData( void *dst = env->GetDirectBufferAddress(byteBuf); - jlong dstSize; + size_t dstSize; jbyteArray byteArray = NULL; if (dst == NULL) { @@ -219,9 +219,9 @@ status_t JMediaExtractor::readSampleData( jboolean isCopy; dst = env->GetByteArrayElements(byteArray, &isCopy); - dstSize = env->GetArrayLength(byteArray); + dstSize = (size_t) env->GetArrayLength(byteArray); } else { - dstSize = env->GetDirectBufferCapacity(byteBuf); + dstSize = (size_t) env->GetDirectBufferCapacity(byteBuf); } if (dstSize < offset) { @@ -299,7 +299,7 @@ using namespace android; static sp<JMediaExtractor> setMediaExtractor( JNIEnv *env, jobject thiz, const sp<JMediaExtractor> &extractor) { sp<JMediaExtractor> old = - (JMediaExtractor *)env->GetIntField(thiz, gFields.context); + (JMediaExtractor *)env->GetLongField(thiz, gFields.context); if (extractor != NULL) { extractor->incStrong(thiz); @@ -307,13 +307,13 @@ static sp<JMediaExtractor> setMediaExtractor( if (old != NULL) { old->decStrong(thiz); } - env->SetIntField(thiz, gFields.context, (int)extractor.get()); + env->SetLongField(thiz, gFields.context, (jlong)extractor.get()); return old; } static sp<JMediaExtractor> getMediaExtractor(JNIEnv *env, jobject thiz) { - return (JMediaExtractor *)env->GetIntField(thiz, gFields.context); + return (JMediaExtractor *)env->GetLongField(thiz, gFields.context); } static void android_media_MediaExtractor_release(JNIEnv *env, jobject thiz) { @@ -329,7 +329,7 @@ static jint android_media_MediaExtractor_getTrackCount( return -1; } - return extractor->countTracks(); + return (jint) extractor->countTracks(); } static jobject android_media_MediaExtractor_getTrackFormatNative( @@ -430,19 +430,19 @@ static jboolean android_media_MediaExtractor_advance( if (extractor == NULL) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return false; + return JNI_FALSE; } status_t err = extractor->advance(); if (err == ERROR_END_OF_STREAM) { - return false; + return JNI_FALSE; } else if (err != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return JNI_FALSE; } - return true; + return JNI_TRUE; } static jint android_media_MediaExtractor_readSampleData( @@ -461,10 +461,10 @@ static jint android_media_MediaExtractor_readSampleData( return -1; } else if (err != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return -1; } - return sampleSize; + return (jint) sampleSize; } static jint android_media_MediaExtractor_getSampleTrackIndex( @@ -483,10 +483,10 @@ static jint android_media_MediaExtractor_getSampleTrackIndex( return -1; } else if (err != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return -1; } - return trackIndex; + return (jint) trackIndex; } static jlong android_media_MediaExtractor_getSampleTime( @@ -505,10 +505,10 @@ static jlong android_media_MediaExtractor_getSampleTime( return -1ll; } else if (err != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return -1ll; } - return sampleTimeUs; + return (jlong) sampleTimeUs; } static jint android_media_MediaExtractor_getSampleFlags( @@ -517,20 +517,20 @@ static jint android_media_MediaExtractor_getSampleFlags( if (extractor == NULL) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return -1ll; + return -1; } uint32_t sampleFlags; status_t err = extractor->getSampleFlags(&sampleFlags); if (err == ERROR_END_OF_STREAM) { - return -1ll; + return -1; } else if (err != OK) { jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - return false; + return -1; } - return sampleFlags; + return (jint) sampleFlags; } static jboolean android_media_MediaExtractor_getSampleCryptoInfo( @@ -539,27 +539,27 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( if (extractor == NULL) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return -1ll; + return JNI_FALSE; } sp<MetaData> meta; status_t err = extractor->getSampleMeta(&meta); if (err != OK) { - return false; + return JNI_FALSE; } uint32_t type; const void *data; size_t size; if (!meta->findData(kKeyEncryptedSizes, &type, &data, &size)) { - return false; + return JNI_FALSE; } size_t numSubSamples = size / sizeof(size_t); if (numSubSamples == 0) { - return false; + return JNI_FALSE; } jintArray numBytesOfEncryptedDataObj = env->NewIntArray(numSubSamples); @@ -576,7 +576,7 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( if (meta->findData(kKeyPlainSizes, &type, &data, &size)) { if (size != encSize) { // The two must be of the same length. - return false; + return JNI_FALSE; } numBytesOfPlainDataObj = env->NewIntArray(numSubSamples); @@ -593,7 +593,7 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( if (meta->findData(kKeyCryptoKey, &type, &data, &size)) { if (size != 16) { // Keys must be 16 bytes in length. - return false; + return JNI_FALSE; } keyObj = env->NewByteArray(size); @@ -608,7 +608,7 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( if (meta->findData(kKeyCryptoIV, &type, &data, &size)) { if (size != 16) { // IVs must be 16 bytes in length. - return false; + return JNI_FALSE; } ivObj = env->NewByteArray(size); @@ -634,14 +634,14 @@ static jboolean android_media_MediaExtractor_getSampleCryptoInfo( ivObj, mode); - return true; + return JNI_TRUE; } static void android_media_MediaExtractor_native_init(JNIEnv *env) { jclass clazz = env->FindClass("android/media/MediaExtractor"); CHECK(clazz != NULL); - gFields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + gFields.context = env->GetFieldID(clazz, "mNativeContext", "J"); CHECK(gFields.context != NULL); clazz = env->FindClass("android/media/MediaCodec$CryptoInfo"); @@ -770,7 +770,7 @@ static jlong android_media_MediaExtractor_getCachedDurationUs( return -1ll; } - return cachedDurationUs; + return (jlong) cachedDurationUs; } static jboolean android_media_MediaExtractor_hasCacheReachedEOS( @@ -779,16 +779,16 @@ static jboolean android_media_MediaExtractor_hasCacheReachedEOS( if (extractor == NULL) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return true; + return JNI_TRUE; } int64_t cachedDurationUs; bool eos; if (!extractor->getCachedDuration(&cachedDurationUs, &eos)) { - return true; + return JNI_TRUE; } - return eos; + return eos ? JNI_TRUE : JNI_FALSE; } static void android_media_MediaExtractor_native_finalize( diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index 297dadfe3dd4..fe69819ab2ff 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -67,15 +67,15 @@ static void process_media_retriever_call(JNIEnv *env, status_t opStatus, const c static MediaMetadataRetriever* getRetriever(JNIEnv* env, jobject thiz) { // No lock is needed, since it is called internally by other methods that are protected - MediaMetadataRetriever* retriever = (MediaMetadataRetriever*) env->GetIntField(thiz, fields.context); + MediaMetadataRetriever* retriever = (MediaMetadataRetriever*) env->GetLongField(thiz, fields.context); return retriever; } -static void setRetriever(JNIEnv* env, jobject thiz, int retriever) +static void setRetriever(JNIEnv* env, jobject thiz, MediaMetadataRetriever* retriever) { // No lock is needed, since it is called internally by other methods that are protected - MediaMetadataRetriever *old = (MediaMetadataRetriever*) env->GetIntField(thiz, fields.context); - env->SetIntField(thiz, fields.context, retriever); + MediaMetadataRetriever *old = (MediaMetadataRetriever*) env->GetLongField(thiz, fields.context); + env->SetLongField(thiz, fields.context, (jlong) retriever); } static void @@ -146,10 +146,10 @@ static void android_media_MediaMetadataRetriever_setDataSourceFD(JNIEnv *env, jo int fd = jniGetFDFromFileDescriptor(env, fileDescriptor); if (offset < 0 || length < 0 || fd < 0) { if (offset < 0) { - ALOGE("negative offset (%lld)", offset); + ALOGE("negative offset (%lld)", (long long)offset); } if (length < 0) { - ALOGE("negative length (%lld)", length); + ALOGE("negative length (%lld)", (long long)length); } if (fd < 0) { ALOGE("invalid file descriptor"); @@ -359,7 +359,7 @@ static void android_media_MediaMetadataRetriever_release(JNIEnv *env, jobject th Mutex::Autolock lock(sLock); MediaMetadataRetriever* retriever = getRetriever(env, thiz); delete retriever; - setRetriever(env, thiz, 0); + setRetriever(env, thiz, (MediaMetadataRetriever*) 0); } static void android_media_MediaMetadataRetriever_native_finalize(JNIEnv *env, jobject thiz) @@ -379,7 +379,7 @@ static void android_media_MediaMetadataRetriever_native_init(JNIEnv *env) return; } - fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.context == NULL) { return; } @@ -435,7 +435,7 @@ static void android_media_MediaMetadataRetriever_native_setup(JNIEnv *env, jobje jniThrowException(env, "java/lang/RuntimeException", "Out of memory"); return; } - setRetriever(env, thiz, (int)retriever); + setRetriever(env, thiz, retriever); } // JNI mapping between Java methods and native methods diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 5e3fb1a1be46..9d0d5a6eef78 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -133,21 +133,21 @@ void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *o static sp<MediaPlayer> getMediaPlayer(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); - MediaPlayer* const p = (MediaPlayer*)env->GetIntField(thiz, fields.context); + MediaPlayer* const p = (MediaPlayer*)env->GetLongField(thiz, fields.context); return sp<MediaPlayer>(p); } static sp<MediaPlayer> setMediaPlayer(JNIEnv* env, jobject thiz, const sp<MediaPlayer>& player) { Mutex::Autolock l(sLock); - sp<MediaPlayer> old = (MediaPlayer*)env->GetIntField(thiz, fields.context); + sp<MediaPlayer> old = (MediaPlayer*)env->GetLongField(thiz, fields.context); if (player.get()) { player->incStrong((void*)setMediaPlayer); } if (old != 0) { old->decStrong((void*)setMediaPlayer); } - env->SetIntField(thiz, fields.context, (int)player.get()); + env->SetLongField(thiz, fields.context, (jlong)player.get()); return old; } @@ -244,7 +244,7 @@ android_media_MediaPlayer_setDataSourceFD(JNIEnv *env, jobject thiz, jobject fil static sp<IGraphicBufferProducer> getVideoSurfaceTexture(JNIEnv* env, jobject thiz) { - IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetIntField(thiz, fields.surface_texture); + IGraphicBufferProducer * const p = (IGraphicBufferProducer*)env->GetLongField(thiz, fields.surface_texture); return sp<IGraphicBufferProducer>(p); } @@ -293,7 +293,7 @@ setVideoSurface(JNIEnv *env, jobject thiz, jobject jsurface, jboolean mediaPlaye } } - env->SetIntField(thiz, fields.surface_texture, (int)new_st.get()); + env->SetLongField(thiz, fields.surface_texture, (jlong)new_st.get()); // This will fail if the media player has not been initialized yet. This // can be the case if setDisplay() on MediaPlayer.java has been called @@ -384,7 +384,7 @@ android_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return false; + return JNI_FALSE; } const jboolean is_playing = mp->isPlaying(); @@ -393,7 +393,7 @@ android_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) } static void -android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, int msec) +android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, jint msec) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { @@ -404,7 +404,7 @@ android_media_MediaPlayer_seekTo(JNIEnv *env, jobject thiz, int msec) process_media_player_call( env, thiz, mp->seekTo(msec), NULL, NULL ); } -static int +static jint android_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); @@ -418,10 +418,10 @@ android_media_MediaPlayer_getVideoWidth(JNIEnv *env, jobject thiz) w = 0; } ALOGV("getVideoWidth: %d", w); - return w; + return (jint) w; } -static int +static jint android_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); @@ -435,11 +435,11 @@ android_media_MediaPlayer_getVideoHeight(JNIEnv *env, jobject thiz) h = 0; } ALOGV("getVideoHeight: %d", h); - return h; + return (jint) h; } -static int +static jint android_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); @@ -450,10 +450,10 @@ android_media_MediaPlayer_getCurrentPosition(JNIEnv *env, jobject thiz) int msec; process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); ALOGV("getCurrentPosition: %d (msec)", msec); - return msec; + return (jint) msec; } -static int +static jint android_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); @@ -464,7 +464,7 @@ android_media_MediaPlayer_getDuration(JNIEnv *env, jobject thiz) int msec; process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); ALOGV("getDuration: %d (msec)", msec); - return msec; + return (jint) msec; } static void @@ -480,7 +480,7 @@ android_media_MediaPlayer_reset(JNIEnv *env, jobject thiz) } static void -android_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, int streamtype) +android_media_MediaPlayer_setAudioStreamType(JNIEnv *env, jobject thiz, jint streamtype) { ALOGV("setAudioStreamType: %d", streamtype); sp<MediaPlayer> mp = getMediaPlayer(env, thiz); @@ -510,21 +510,21 @@ android_media_MediaPlayer_isLooping(JNIEnv *env, jobject thiz) sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return false; + return JNI_FALSE; } - return mp->isLooping(); + return mp->isLooping() ? JNI_TRUE : JNI_FALSE; } static void -android_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, float leftVolume, float rightVolume) +android_media_MediaPlayer_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) { - ALOGV("setVolume: left %f right %f", leftVolume, rightVolume); + ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } - process_media_player_call( env, thiz, mp->setVolume(leftVolume, rightVolume), NULL, NULL ); + process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); } // Sends the request and reply parcels to the media player via the @@ -544,7 +544,7 @@ android_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, // Don't use process_media_player_call which use the async loop to // report errors, instead returns the status. - return media_player->invoke(*request, reply); + return (jint) media_player->invoke(*request, reply); } // Sends the new filter to the client. @@ -564,7 +564,7 @@ android_media_MediaPlayer_setMetadataFilter(JNIEnv *env, jobject thiz, jobject r return UNKNOWN_ERROR; } - return media_player->setMetadataFilter(*filter); + return (jint) media_player->setMetadataFilter(*filter); } static jboolean @@ -574,14 +574,14 @@ android_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update sp<MediaPlayer> media_player = getMediaPlayer(env, thiz); if (media_player == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); - return false; + return JNI_FALSE; } Parcel *metadata = parcelForJavaObject(env, reply); if (metadata == NULL ) { jniThrowException(env, "java/lang/RuntimeException", "Reply parcel is null"); - return false; + return JNI_FALSE; } metadata->freeData(); @@ -589,7 +589,11 @@ android_media_MediaPlayer_getMetadata(JNIEnv *env, jobject thiz, jboolean update // metadata. Note however that the parcel actually starts with the // return code so you should not rewind the parcel using // setDataPosition(0). - return media_player->getMetadata(update_only, apply_filter, metadata) == OK; + if (media_player->getMetadata(update_only, apply_filter, metadata) == OK) { + return JNI_TRUE; + } else { + return JNI_FALSE; + } } // This function gets some field IDs, which in turn causes class initialization. @@ -605,7 +609,7 @@ android_media_MediaPlayer_native_init(JNIEnv *env) return; } - fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.context == NULL) { return; } @@ -616,7 +620,7 @@ android_media_MediaPlayer_native_init(JNIEnv *env) return; } - fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "I"); + fields.surface_texture = env->GetFieldID(clazz, "mNativeSurfaceTexture", "J"); if (fields.surface_texture == NULL) { return; } @@ -696,7 +700,7 @@ static jint android_media_MediaPlayer_get_audio_session_id(JNIEnv *env, jobject return 0; } - return mp->getAudioSessionId(); + return (jint) mp->getAudioSessionId(); } static void @@ -733,7 +737,7 @@ android_media_MediaPlayer_pullBatteryData(JNIEnv *env, jobject thiz, jobject jav Parcel *reply = parcelForJavaObject(env, java_reply); - return service->pullBatteryData(reply); + return (jint) service->pullBatteryData(reply); } static jint @@ -772,7 +776,7 @@ android_media_MediaPlayer_setRetransmitEndpoint(JNIEnv *env, jobject thiz, jniThrowException(env, "java/lang/IllegalStateException", NULL); } - return ret; + return (jint) ret; } static void diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp index 3fbb8ba09ba3..48a91321f57c 100644 --- a/media/jni/android_media_MediaProfiles.cpp +++ b/media/jni/android_media_MediaProfiles.cpp @@ -48,7 +48,7 @@ static jint android_media_MediaProfiles_native_get_num_file_formats(JNIEnv *env, jobject thiz) { ALOGV("native_get_num_file_formats"); - return sProfiles->getOutputFileFormats().size(); + return (jint) sProfiles->getOutputFileFormats().size(); } static jint @@ -119,7 +119,7 @@ static jint android_media_MediaProfiles_native_get_num_audio_encoders(JNIEnv *env, jobject thiz) { ALOGV("native_get_num_audio_encoders"); - return sProfiles->getAudioEncoders().size(); + return (jint) sProfiles->getAudioEncoders().size(); } static jobject @@ -223,18 +223,18 @@ android_media_MediaProfiles_native_has_camcorder_profile(JNIEnv *env, jobject th { ALOGV("native_has_camcorder_profile: %d %d", id, quality); if (!isCamcorderQualityKnown(quality)) { - return false; + return JNI_FALSE; } camcorder_quality q = static_cast<camcorder_quality>(quality); - return sProfiles->hasCamcorderProfile(id, q); + return sProfiles->hasCamcorderProfile(id, q) ? JNI_TRUE : JNI_FALSE; } static jint android_media_MediaProfiles_native_get_num_video_decoders(JNIEnv *env, jobject thiz) { ALOGV("native_get_num_video_decoders"); - return sProfiles->getVideoDecoders().size(); + return (jint) sProfiles->getVideoDecoders().size(); } static jint @@ -255,7 +255,7 @@ static jint android_media_MediaProfiles_native_get_num_audio_decoders(JNIEnv *env, jobject thiz) { ALOGV("native_get_num_audio_decoders"); - return sProfiles->getAudioDecoders().size(); + return (jint) sProfiles->getAudioDecoders().size(); } static jint @@ -276,7 +276,7 @@ static jint android_media_MediaProfiles_native_get_num_image_encoding_quality_levels(JNIEnv *env, jobject thiz, jint cameraId) { ALOGV("native_get_num_image_encoding_quality_levels"); - return sProfiles->getImageEncodingQualityLevels(cameraId).size(); + return (jint) sProfiles->getImageEncodingQualityLevels(cameraId).size(); } static jint @@ -284,7 +284,7 @@ android_media_MediaProfiles_native_get_image_encoding_quality_level(JNIEnv *env, { ALOGV("native_get_image_encoding_quality_level"); Vector<int> levels = sProfiles->getImageEncodingQualityLevels(cameraId); - if (index < 0 || index >= levels.size()) { + if (index < 0 || index >= (jint) levels.size()) { jniThrowException(env, "java/lang/IllegalArgumentException", "out of array boundary"); return -1; } diff --git a/media/jni/android_media_MediaRecorder.cpp b/media/jni/android_media_MediaRecorder.cpp index ac863e1f436b..fd69cad67e3b 100644 --- a/media/jni/android_media_MediaRecorder.cpp +++ b/media/jni/android_media_MediaRecorder.cpp @@ -128,21 +128,21 @@ static bool process_media_recorder_call(JNIEnv *env, status_t opStatus, const ch static sp<MediaRecorder> getMediaRecorder(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); - MediaRecorder* const p = (MediaRecorder*)env->GetIntField(thiz, fields.context); + MediaRecorder* const p = (MediaRecorder*)env->GetLongField(thiz, fields.context); return sp<MediaRecorder>(p); } static sp<MediaRecorder> setMediaRecorder(JNIEnv* env, jobject thiz, const sp<MediaRecorder>& recorder) { Mutex::Autolock l(sLock); - sp<MediaRecorder> old = (MediaRecorder*)env->GetIntField(thiz, fields.context); + sp<MediaRecorder> old = (MediaRecorder*)env->GetLongField(thiz, fields.context); if (recorder.get()) { recorder->incStrong(thiz); } if (old != 0) { old->decStrong(thiz); } - env->SetIntField(thiz, fields.context, (int)recorder.get()); + env->SetLongField(thiz, fields.context, (jlong)recorder.get()); return old; } @@ -334,14 +334,14 @@ android_media_MediaRecorder_prepare(JNIEnv *env, jobject thiz) process_media_recorder_call(env, mr->prepare(), "java/io/IOException", "prepare failed."); } -static int +static jint android_media_MediaRecorder_native_getMaxAmplitude(JNIEnv *env, jobject thiz) { ALOGV("getMaxAmplitude"); sp<MediaRecorder> mr = getMediaRecorder(env, thiz); int result = 0; process_media_recorder_call(env, mr->getMaxAmplitude(&result), "java/lang/RuntimeException", "getMaxAmplitude failed."); - return result; + return (jint) result; } static jobject @@ -412,7 +412,7 @@ android_media_MediaRecorder_native_init(JNIEnv *env) return; } - fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.context == NULL) { return; } diff --git a/media/jni/android_media_MediaScanner.cpp b/media/jni/android_media_MediaScanner.cpp index 4e3d14e33810..84028b7e136a 100644 --- a/media/jni/android_media_MediaScanner.cpp +++ b/media/jni/android_media_MediaScanner.cpp @@ -226,12 +226,12 @@ private: static MediaScanner *getNativeScanner_l(JNIEnv* env, jobject thiz) { - return (MediaScanner *) env->GetIntField(thiz, fields.context); + return (MediaScanner *) env->GetLongField(thiz, fields.context); } static void setNativeScanner_l(JNIEnv* env, jobject thiz, MediaScanner *s) { - env->SetIntField(thiz, fields.context, (int)s); + env->SetLongField(thiz, fields.context, (jlong)s); } static void @@ -381,7 +381,7 @@ android_media_MediaScanner_native_init(JNIEnv *env) return; } - fields.context = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.context = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.context == NULL) { return; } @@ -398,7 +398,7 @@ android_media_MediaScanner_native_setup(JNIEnv *env, jobject thiz) return; } - env->SetIntField(thiz, fields.context, (int)mp); + env->SetLongField(thiz, fields.context, (jlong)mp); } static void diff --git a/media/jni/soundpool/android_media_SoundPool_SoundPoolImpl.cpp b/media/jni/soundpool/android_media_SoundPool_SoundPoolImpl.cpp index 260485063f62..9cc55abe2f1b 100644 --- a/media/jni/soundpool/android_media_SoundPool_SoundPoolImpl.cpp +++ b/media/jni/soundpool/android_media_SoundPool_SoundPoolImpl.cpp @@ -34,11 +34,11 @@ static struct fields_t { } fields; static inline SoundPool* MusterSoundPool(JNIEnv *env, jobject thiz) { - return (SoundPool*)env->GetIntField(thiz, fields.mNativeContext); + return (SoundPool*)env->GetLongField(thiz, fields.mNativeContext); } // ---------------------------------------------------------------------------- -static int +static jint android_media_SoundPool_SoundPoolImpl_load_URL(JNIEnv *env, jobject thiz, jstring path, jint priority) { ALOGV("android_media_SoundPool_SoundPoolImpl_load_URL"); @@ -50,29 +50,29 @@ android_media_SoundPool_SoundPoolImpl_load_URL(JNIEnv *env, jobject thiz, jstrin const char* s = env->GetStringUTFChars(path, NULL); int id = ap->load(s, priority); env->ReleaseStringUTFChars(path, s); - return id; + return (jint) id; } -static int +static jint android_media_SoundPool_SoundPoolImpl_load_FD(JNIEnv *env, jobject thiz, jobject fileDescriptor, jlong offset, jlong length, jint priority) { ALOGV("android_media_SoundPool_SoundPoolImpl_load_FD"); SoundPool *ap = MusterSoundPool(env, thiz); if (ap == NULL) return 0; - return ap->load(jniGetFDFromFileDescriptor(env, fileDescriptor), + return (jint) ap->load(jniGetFDFromFileDescriptor(env, fileDescriptor), int64_t(offset), int64_t(length), int(priority)); } -static bool +static jboolean android_media_SoundPool_SoundPoolImpl_unload(JNIEnv *env, jobject thiz, jint sampleID) { ALOGV("android_media_SoundPool_SoundPoolImpl_unload\n"); SoundPool *ap = MusterSoundPool(env, thiz); - if (ap == NULL) return 0; - return ap->unload(sampleID); + if (ap == NULL) return JNI_FALSE; + return ap->unload(sampleID) ? JNI_TRUE : JNI_FALSE; } -static int +static jint android_media_SoundPool_SoundPoolImpl_play(JNIEnv *env, jobject thiz, jint sampleID, jfloat leftVolume, jfloat rightVolume, jint priority, jint loop, jfloat rate) @@ -80,7 +80,7 @@ android_media_SoundPool_SoundPoolImpl_play(JNIEnv *env, jobject thiz, jint sampl ALOGV("android_media_SoundPool_SoundPoolImpl_play\n"); SoundPool *ap = MusterSoundPool(env, thiz); if (ap == NULL) return 0; - return ap->play(sampleID, leftVolume, rightVolume, priority, loop, rate); + return (jint) ap->play(sampleID, leftVolume, rightVolume, priority, loop, rate); } static void @@ -130,22 +130,22 @@ android_media_SoundPool_SoundPoolImpl_stop(JNIEnv *env, jobject thiz, jint chann static void android_media_SoundPool_SoundPoolImpl_setVolume(JNIEnv *env, jobject thiz, jint channelID, - float leftVolume, float rightVolume) + jfloat leftVolume, jfloat rightVolume) { ALOGV("android_media_SoundPool_SoundPoolImpl_setVolume"); SoundPool *ap = MusterSoundPool(env, thiz); if (ap == NULL) return; - ap->setVolume(channelID, leftVolume, rightVolume); + ap->setVolume(channelID, (float) leftVolume, (float) rightVolume); } static void android_media_SoundPool_SoundPoolImpl_setPriority(JNIEnv *env, jobject thiz, jint channelID, - int priority) + jint priority) { ALOGV("android_media_SoundPool_SoundPoolImpl_setPriority"); SoundPool *ap = MusterSoundPool(env, thiz); if (ap == NULL) return; - ap->setPriority(channelID, priority); + ap->setPriority(channelID, (int) priority); } static void @@ -160,12 +160,12 @@ android_media_SoundPool_SoundPoolImpl_setLoop(JNIEnv *env, jobject thiz, jint ch static void android_media_SoundPool_SoundPoolImpl_setRate(JNIEnv *env, jobject thiz, jint channelID, - float rate) + jfloat rate) { ALOGV("android_media_SoundPool_SoundPoolImpl_setRate"); SoundPool *ap = MusterSoundPool(env, thiz); if (ap == NULL) return; - ap->setRate(channelID, rate); + ap->setRate(channelID, (float) rate); } static void android_media_callback(SoundPoolEvent event, SoundPool* soundPool, void* user) @@ -185,7 +185,7 @@ android_media_SoundPool_SoundPoolImpl_native_setup(JNIEnv *env, jobject thiz, jo } // save pointer to SoundPool C++ object in opaque field in Java object - env->SetIntField(thiz, fields.mNativeContext, (int)ap); + env->SetLongField(thiz, fields.mNativeContext, (jlong) ap); // set callback with weak reference jobject globalWeakRef = env->NewGlobalRef(weakRef); @@ -208,7 +208,7 @@ android_media_SoundPool_SoundPoolImpl_release(JNIEnv *env, jobject thiz) // clear callback and native context ap->setCallback(NULL, NULL); - env->SetIntField(thiz, fields.mNativeContext, 0); + env->SetLongField(thiz, fields.mNativeContext, 0); delete ap; } } @@ -299,7 +299,7 @@ jint JNI_OnLoad(JavaVM* vm, void* reserved) goto bail; } - fields.mNativeContext = env->GetFieldID(clazz, "mNativeContext", "I"); + fields.mNativeContext = env->GetFieldID(clazz, "mNativeContext", "J"); if (fields.mNativeContext == NULL) { ALOGE("Can't find SoundPoolImpl.mNativeContext"); goto bail; diff --git a/media/mca/filterfw/jni/jni_gl_environment.cpp b/media/mca/filterfw/jni/jni_gl_environment.cpp index 9abf19134a79..6da7b7c766fd 100644 --- a/media/mca/filterfw/jni/jni_gl_environment.cpp +++ b/media/mca/filterfw/jni/jni_gl_environment.cpp @@ -119,12 +119,12 @@ static sp<MediaRecorder> getMediaRecorder(JNIEnv* env, jobject jmediarecorder) { return NULL; } - jfieldID context = env->GetFieldID(clazz, "mNativeContext", "I"); + jfieldID context = env->GetFieldID(clazz, "mNativeContext", "J"); if (context == NULL) { return NULL; } - MediaRecorder* const p = (MediaRecorder*)env->GetIntField(jmediarecorder, context); + MediaRecorder* const p = (MediaRecorder*)env->GetLongField(jmediarecorder, context); env->DeleteLocalRef(clazz); return sp<MediaRecorder>(p); } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java index 99f775787cec..6120127683b6 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardWidgetPager.java @@ -953,17 +953,13 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit // to keep event dispatch happy. mCameraEventInProgress = true; userActivity(); - startPageWarp(cameraPage); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mCameraEventInProgress = false; - endWarp = isWarping(); break; } dispatchTouchEvent(event); - // This has to happen after the event has been handled by the real widget pager - if (endWarp) stopPageWarp(); } endCameraEvent(); } diff --git a/packages/Keyguard/src/com/android/keyguard/PagedView.java b/packages/Keyguard/src/com/android/keyguard/PagedView.java index 53c17a5e7adc..d233ee938a1d 100644 --- a/packages/Keyguard/src/com/android/keyguard/PagedView.java +++ b/packages/Keyguard/src/com/android/keyguard/PagedView.java @@ -36,15 +36,7 @@ import android.os.Parcelable; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; -import android.view.InputDevice; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.VelocityTracker; -import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; -import android.view.ViewParent; -import android.view.ViewPropertyAnimator; +import android.view.*; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -262,6 +254,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc // Page warping private int mPageSwapIndex = -1; // the page we swapped out if needed private int mPageWarpIndex = -1; // the page we intend to warp + private boolean mWarpPageExposed; private ViewPropertyAnimator mWarpAnimation; @@ -494,9 +487,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mIsPageMoving = true; if (isWarping()) { dispatchOnPageBeginWarp(); - if (mPageSwapIndex != -1) { - swapPages(mPageSwapIndex, mPageWarpIndex); - } } onPageBeginMoving(); } @@ -523,22 +513,13 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (mIsPageMoving) { mIsPageMoving = false; if (isWarping()) { - if (mPageSwapIndex != -1) { - swapPages(mPageSwapIndex, mPageWarpIndex); - } dispatchOnPageEndWarp(); - resetPageWarp(); + mWarpPageExposed = false; } onPageEndMoving(); } } - private void resetPageWarp() { - // TODO: Verify pages have been reset correctly - mPageSwapIndex = -1; - mPageWarpIndex = -1; - } - protected boolean isPageMoving() { return mIsPageMoving; } @@ -794,11 +775,6 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc setHorizontalScrollBarEnabled(true); mFirstLayout = false; } - // If a page was swapped when we rebuilt the layout, swap it again now. - if (mPageSwapIndex != -1) { - if (DEBUG_WARP) Log.v(TAG, "onLayout: swapping pages"); - swapPages(mPageSwapIndex, mPageWarpIndex); - } } protected void screenScrolled(int screenCenter) { @@ -1252,6 +1228,25 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } } + private boolean isHorizontalCameraScroll(MotionEvent ev) { + // Disallow scrolling if we don't have a valid pointer index + final int pointerIndex = ev.findPointerIndex(mActivePointerId); + if (pointerIndex == -1) return false; + + // If we're only allowing edge swipes, we break out early if the down event wasn't + // at the edge. + if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) return false; + + final float x = ev.getX(pointerIndex); + final int xDiff = (int) Math.abs(x - mDownMotionX); + + final int touchSlop = Math.round(TOUCH_SLOP_SCALE * mTouchSlop); + boolean xPaged = xDiff > mPagingTouchSlop; + boolean xMoved = xDiff > touchSlop; + + return mIsCameraEvent && (mUsePagingTouchSlop ? xPaged : xMoved); + } + /* * Determines if we should change the touch state to start scrolling after the * user moves their touch point too far. @@ -1271,14 +1266,12 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (mOnlyAllowEdgeSwipes && !mDownEventOnEdge) return false; final int xDiff = (int) Math.abs(x - mLastMotionX); - final int yDiff = (int) Math.abs(y - mLastMotionY); final int touchSlop = Math.round(TOUCH_SLOP_SCALE * mTouchSlop); boolean xPaged = xDiff > mPagingTouchSlop; boolean xMoved = xDiff > touchSlop; - boolean yMoved = yDiff > touchSlop; - return (xMoved || xPaged || yMoved) && (mUsePagingTouchSlop ? xPaged : xMoved); + return mUsePagingTouchSlop ? xPaged : xMoved; } private void startScrolling(MotionEvent ev) { @@ -1446,7 +1439,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc mTouchX += deltaX; mSmoothingTime = System.nanoTime() / NANOTIME_DIV; if (isWarping()) { - KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(mPageWarpIndex); + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); v.setTranslationX(v.getTranslationX() - deltaX); } else if (!mDeferScrollUpdate) { scrollBy((int) deltaX, 0); @@ -1565,8 +1558,13 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc removeCallbacks(mSidePageHoverRunnable); mSidePageHoverIndex = -1; } - } else if (mIsCameraEvent || determineScrollingStart(ev)) { + } else if (determineScrollingStart(ev)) { + startScrolling(ev); + } else if (isHorizontalCameraScroll(ev)) { startScrolling(ev); + // we need to cancel the camera animation + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); + v.animate().cancel(); } break; @@ -1612,7 +1610,8 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } else if (((isSignificantMove && deltaX < 0 && !isFling) || (isFling && velocityX < 0)) && mCurrentPage < getChildCount() - 1) { - finalPage = returnToOriginalPage ? mCurrentPage : mCurrentPage + 1; + finalPage = returnToOriginalPage ? mCurrentPage : + isWarping() ? getPageWarpIndex() : mCurrentPage + 1; snapToPageWithVelocity(finalPage, velocityX); } else { snapToDestination(); @@ -1929,20 +1928,19 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } protected void snapToPage(int whichPage, int delta, int duration, boolean immediate) { - if (mPageSwapIndex != -1 && whichPage == mPageSwapIndex) { - mNextPage = mPageWarpIndex; // jump to the warp page + if (isWarping() && whichPage == mCurrentPage+1) { + mNextPage = getPageWarpIndex(); // jump to the warp page if (DEBUG_WARP) Log.v(TAG, "snapToPage(" + whichPage + ") : reset mPageSwapIndex"); } else { mNextPage = whichPage; } - if (isWarping()) { + if(mWarpPageExposed) { dispatchOnPageEndWarp(); - notifyPageSwitching(whichPage); - resetPageWarp(); - } else { - notifyPageSwitching(whichPage); + mWarpPageExposed = false; } + notifyPageSwitching(whichPage); + View focusedChild = getFocusedChild(); if (focusedChild != null && whichPage != mCurrentPage && @@ -1973,7 +1971,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } protected boolean isWarping() { - return mPageWarpIndex != -1; + return mWarpPageExposed; } public void scrollLeft() { @@ -2716,6 +2714,12 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc animateWarpPageOffScreen("onScreen end", true); } } + + @Override + public void onAnimationCancel(Animator animation) { + super.onAnimationCancel(animation); + mWarpAnimation = null; + } }; AnimatorListenerAdapter mOffScreenAnimationListener = new AnimatorListenerAdapter() { @@ -2723,6 +2727,14 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc public void onAnimationEnd(Animator animation) { mWarpAnimation = null; mWarpPageExposed = false; + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); + v.setTranslationX(0.0f); + } + + @Override + public void onAnimationCancel(Animator animation) { + super.onAnimationCancel(animation); + mWarpAnimation = null; } }; @@ -2731,7 +2743,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc if (abortAnimation) { // We're done with the animation and moving to a new page. Let the scroller // take over the animation. - KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(mPageWarpIndex); + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); v.animate().cancel(); // Make the scroll amount match the current warp position. scrollBy(Math.round(-v.getTranslationX()), 0); @@ -2747,28 +2759,43 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc private void animateWarpPageOnScreen(String reason) { if (DEBUG_WARP) Log.v(TAG, "animateWarpPageOnScreen(" + reason + ")"); - if (isWarping() && !mWarpPageExposed) { + if (!mWarpPageExposed) { mWarpPageExposed = true; dispatchOnPageBeginWarp(); - KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(mPageWarpIndex); + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); if (DEBUG_WARP) Log.v(TAG, "moving page on screen: Tx=" + v.getTranslationX()); DecelerateInterpolator interp = new DecelerateInterpolator(1.5f); + int totalOffset = getCurrentWarpOffset(); + v.setTranslationX(totalOffset); mWarpAnimation = v.animate(); - mWarpAnimation.translationX(mWarpPeekAmount) + mWarpAnimation.translationX(mWarpPeekAmount+totalOffset) .setInterpolator(interp) .setDuration(WARP_PEEK_ANIMATION_DURATION) .setListener(mOnScreenAnimationListener); } } + private int getCurrentWarpOffset() { + if (mCurrentPage == getPageWarpIndex()) { + return 0; + } + View viewRight = getPageAt(mCurrentPage + 1); + View warpView = getPageAt(getPageWarpIndex()); + if (viewRight != warpView && viewRight != null && warpView != null) { + return viewRight.getLeft() - warpView.getLeft(); + } + return 0; + } + private void animateWarpPageOffScreen(String reason, boolean animate) { if (DEBUG_WARP) Log.v(TAG, "animateWarpPageOffScreen(" + reason + " anim:" + animate + ")"); - if (isWarping()) { + if (mWarpPageExposed) { dispatchOnPageEndWarp(); - KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(mPageWarpIndex); + KeyguardWidgetFrame v = (KeyguardWidgetFrame) getPageAt(getPageWarpIndex()); if (DEBUG_WARP) Log.v(TAG, "moving page off screen: Tx=" + v.getTranslationX()); AccelerateInterpolator interp = new AccelerateInterpolator(1.5f); - v.animate().translationX(0.0f) + int totalOffset = getCurrentWarpOffset(); + v.animate().translationX(totalOffset) .setInterpolator(interp) .setDuration(animate ? WARP_PEEK_ANIMATION_DURATION : 0) .setListener(mOffScreenAnimationListener); @@ -2799,7 +2826,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc } protected int getPageWarpIndex() { - return mPageWarpIndex; + return getPageCount() - 1; } public void stopPageWarp() { diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index a1a0d47cb019..e5615c0441a2 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -186,9 +186,9 @@ public class AppOpsService extends IAppOpsService.Stub { } } - public AppOpsService(File storagePath) { + public AppOpsService(File storagePath, Handler handler) { mFile = new AtomicFile(storagePath); - mHandler = new Handler(); + mHandler = handler; readState(); } diff --git a/services/core/java/com/android/server/ServiceThread.java b/services/core/java/com/android/server/ServiceThread.java new file mode 100644 index 000000000000..75ec4efc5572 --- /dev/null +++ b/services/core/java/com/android/server/ServiceThread.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server; + +import android.os.HandlerThread; +import android.os.Process; +import android.os.StrictMode; +import android.util.Slog; + +/** + * Special handler thread that we create for system services that require their own loopers. + */ +public final class ServiceThread extends HandlerThread { + private static final String TAG = "ServiceThread"; + + public ServiceThread(String name, int priority) { + super(name, priority); + } + + @Override + public void run() { + Process.setCanSelfBackground(false); + + // For debug builds, log event loop stalls to dropbox for analysis. + if (StrictMode.conditionallyEnableDebugLogging()) { + Slog.i(TAG, "Enabled StrictMode logging for " + getName() + " looper."); + } + + super.run(); + } +}
\ No newline at end of file diff --git a/services/core/java/com/android/server/SystemServer.java b/services/core/java/com/android/server/SystemServer.java index 23c7e4215167..24b1a920076b 100644 --- a/services/core/java/com/android/server/SystemServer.java +++ b/services/core/java/com/android/server/SystemServer.java @@ -17,6 +17,7 @@ package com.android.server; import android.app.ActivityManagerNative; +import android.app.ActivityThread; import android.app.IAlarmManager; import android.app.INotificationManager; import android.bluetooth.BluetoothAdapter; @@ -29,9 +30,10 @@ import android.content.pm.PackageManager; import android.content.res.Configuration; import android.media.AudioService; import android.os.Environment; +import android.os.FactoryTest; import android.os.Handler; -import android.os.HandlerThread; import android.os.IBinder; +import android.os.IPowerManager; import android.os.Looper; import android.os.RemoteException; import android.os.ServiceManager; @@ -86,12 +88,17 @@ import java.io.File; import java.util.Timer; import java.util.TimerTask; -class ServerThread { +public final class SystemServer { private static final String TAG = "SystemServer"; + private static final String ENCRYPTING_STATE = "trigger_restart_min_framework"; private static final String ENCRYPTED_STATE = "1"; - ContentResolver mContentResolver; + private static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr + + // The earliest supported time. We pick one day into 1970, to + // give any timezone code room without going into negative time. + private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000; /* * Implementation class names. TODO: Move them to a codegen class or load @@ -106,50 +113,177 @@ class ServerThread { private static final String PRINT_MANAGER_SERVICE_CLASS = "com.android.server.print.PrintManagerService"; - void reportWtf(String msg, Throwable e) { - Slog.w(TAG, "***********************************************"); - Log.wtf(TAG, "BOOT FAILURE " + msg, e); + private final int mFactoryTestMode; + private Timer mProfilerSnapshotTimer; + + private Context mSystemContext; + private SystemServiceManager mSystemServiceManager; + + private Installer mInstaller; // TODO: remove this + private PowerManagerService mPowerManagerService; // TODO: remove this + private ContentResolver mContentResolver; + + /** + * Called to initialize native system services. + */ + private static native void nativeInit(); + + /** + * The main entry point from zygote. + */ + public static void main(String[] args) { + new SystemServer().run(); } - public void initAndLoop() { - EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, - SystemClock.uptimeMillis()); + public SystemServer() { + mFactoryTestMode = FactoryTest.getMode(); + } - Looper.prepareMainLooper(); + private void run() { + // If a device's clock is before 1970 (before 0), a lot of + // APIs crash dealing with negative numbers, notably + // java.io.File#setLastModified, so instead we fake it and + // hope that time from cell towers or NTP fixes it shortly. + if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { + Slog.w(TAG, "System clock is before 1970; setting to 1970."); + SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); + } - android.os.Process.setThreadPriority( - android.os.Process.THREAD_PRIORITY_FOREGROUND); + // Here we go! + Slog.i(TAG, "Entered the Android system server!"); + EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis()); + + // In case the runtime switched since last boot (such as when + // the old runtime was removed in an OTA), set the system + // property so that it is in sync. We can't do this in + // libnativehelper's JniInvocation::Init code where we already + // had to fallback to a different runtime because it is + // running as root and we need to be the system user to set + // the property. http://b/11463182 + SystemProperties.set("persist.sys.dalvik.vm.lib", VMRuntime.getRuntime().vmLibrary()); + + // Enable the sampling profiler. + if (SamplingProfilerIntegration.isEnabled()) { + SamplingProfilerIntegration.start(); + mProfilerSnapshotTimer = new Timer(); + mProfilerSnapshotTimer.schedule(new TimerTask() { + @Override + public void run() { + SamplingProfilerIntegration.writeSnapshot("system_server", null); + } + }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); + } + // Mmmmmm... more memory! + VMRuntime.getRuntime().clearGrowthLimit(); + + // The system server has to run all of the time, so it needs to be + // as efficient as possible with its memory usage. + VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); + + // Within the system server, it is an error to access Environment paths without + // explicitly specifying a user. + Environment.setUserRequired(true); + + // Ensure binder calls into the system always run at foreground priority. BinderInternal.disableBackgroundScheduling(true); + + // Prepare the main looper thread (this thread). + android.os.Process.setThreadPriority( + android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); + Looper.prepareMainLooper(); + + // Initialize native services. + System.loadLibrary("android_servers"); + nativeInit(); // Check whether we failed to shut down last time we tried. - { - final String shutdownAction = SystemProperties.get( - ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); - if (shutdownAction != null && shutdownAction.length() > 0) { - boolean reboot = (shutdownAction.charAt(0) == '1'); - - final String reason; - if (shutdownAction.length() > 1) { - reason = shutdownAction.substring(1, shutdownAction.length()); - } else { - reason = null; - } + // This call may not return. + performPendingShutdown(); + + // Initialize the system context. + createSystemContext(); + + // Create the system service manager. + mSystemServiceManager = new SystemServiceManager(mSystemContext); + + // Start services. + try { + startBootstrapServices(); + startOtherServices(); + } catch (RuntimeException ex) { + Slog.e("System", "******************************************"); + Slog.e("System", "************ Failure starting system services", ex); + throw ex; + } - ShutdownThread.rebootOrShutdown(reboot, reason); + // For debug builds, log event loop stalls to dropbox for analysis. + if (StrictMode.conditionallyEnableDebugLogging()) { + Slog.i(TAG, "Enabled StrictMode for system server main thread."); + } + + // Loop forever. + Looper.loop(); + throw new RuntimeException("Main thread loop unexpectedly exited"); + } + + private void reportWtf(String msg, Throwable e) { + Slog.w(TAG, "***********************************************"); + Log.wtf(TAG, "BOOT FAILURE " + msg, e); + } + + private void performPendingShutdown() { + final String shutdownAction = SystemProperties.get( + ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); + if (shutdownAction != null && shutdownAction.length() > 0) { + boolean reboot = (shutdownAction.charAt(0) == '1'); + + final String reason; + if (shutdownAction.length() > 1) { + reason = shutdownAction.substring(1, shutdownAction.length()); + } else { + reason = null; } + + ShutdownThread.rebootOrShutdown(reboot, reason); } + } + + private void createSystemContext() { + ActivityThread activityThread = ActivityThread.systemMain(); + mSystemContext = activityThread.getSystemContext(); + mSystemContext.setTheme(android.R.style.Theme_Holo); + } + + private void startBootstrapServices() { + // Wait for installd to finish starting up so that it has a chance to + // create critical directories such as /data/user with the appropriate + // permissions. We need this to complete before we initialize other services. + mInstaller = mSystemServiceManager.startService(Installer.class); - String factoryTestStr = SystemProperties.get("ro.factorytest"); - int factoryTest = "".equals(factoryTestStr) ? SystemServer.FACTORY_TEST_OFF - : Integer.parseInt(factoryTestStr); + // Power manager needs to be started early because other services need it. + // TODO: The conversion to the new pattern is incomplete. We need to switch + // the power manager's dependencies over then we can use boot phases to arrange + // initialization order and remove the mPowerManagerService field. + mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); - Installer installer = null; + // Activity manager runs the show. + mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class); + } + + private void startOtherServices() { + // Create a handler thread that window manager will use. + final ServiceThread windowManagerThread = new ServiceThread("WindowManager", + android.os.Process.THREAD_PRIORITY_DISPLAY); + windowManagerThread.start(); + final Handler windowManagerHandler = new Handler(windowManagerThread.getLooper()); + Watchdog.getInstance().addThread(windowManagerHandler); + + final Context context = mSystemContext; AccountManagerService accountManager = null; ContentService contentService = null; LightsManager lights = null; - PowerManagerService power = null; DisplayManagerService display = null; BatteryService battery = null; VibratorService vibrator = null; @@ -161,7 +295,6 @@ class ServerThread { ConnectivityService connectivity = null; NsdService serviceDiscovery= null; IPackageManager pm = null; - Context context = null; WindowManagerService wm = null; BluetoothManagerService bluetooth = null; DockObserver dock = null; @@ -175,50 +308,8 @@ class ServerThread { TelephonyRegistry telephonyRegistry = null; ConsumerIrService consumerIr = null; - // Create a handler thread just for the window manager to enjoy. - HandlerThread wmHandlerThread = new HandlerThread("WindowManager"); - wmHandlerThread.start(); - Handler wmHandler = new Handler(wmHandlerThread.getLooper()); - wmHandler.post(new Runnable() { - @Override - public void run() { - //Looper.myLooper().setMessageLogging(new LogPrinter( - // android.util.Log.DEBUG, TAG, android.util.Log.LOG_ID_SYSTEM)); - android.os.Process.setThreadPriority( - android.os.Process.THREAD_PRIORITY_DISPLAY); - android.os.Process.setCanSelfBackground(false); - - // For debug builds, log event loop stalls to dropbox for analysis. - if (StrictMode.conditionallyEnableDebugLogging()) { - Slog.i(TAG, "Enabled StrictMode logging for WM Looper"); - } - } - }); - - // bootstrap services boolean onlyCore = false; boolean firstBoot = false; - try { - // Wait for installd to finished starting up so that it has a chance to - // create critical directories such as /data/user with the appropriate - // permissions. We need this to complete before we initialize other services. - Slog.i(TAG, "Waiting for installd to be ready."); - installer = new Installer(); - installer.ping(); - - Slog.i(TAG, "Power Manager"); - power = new PowerManagerService(); - ServiceManager.addService(Context.POWER_SERVICE, power); - - Slog.i(TAG, "Activity Manager"); - context = ActivityManagerService.main(factoryTest); - } catch (RuntimeException e) { - Slog.e("System", "******************************************"); - Slog.e("System", "************ Failure starting bootstrap service", e); - } - - final SystemServiceManager systemServiceManager = new SystemServiceManager(context); - boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false); boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false); boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false); @@ -230,7 +321,7 @@ class ServerThread { try { Slog.i(TAG, "Display Manager"); - display = new DisplayManagerService(context, wmHandler); + display = new DisplayManagerService(context, windowManagerHandler); ServiceManager.addService(Context.DISPLAY_SERVICE, display, true); Slog.i(TAG, "Telephony Registry"); @@ -258,8 +349,8 @@ class ServerThread { onlyCore = true; } - pm = PackageManagerService.main(context, installer, - factoryTest != SystemServer.FACTORY_TEST_OFF, + pm = PackageManagerService.main(context, mInstaller, + mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, onlyCore); try { firstBoot = pm.isFirstBoot(); @@ -289,12 +380,12 @@ class ServerThread { Slog.i(TAG, "Content Manager"); contentService = ContentService.main(context, - factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL); + mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL); Slog.i(TAG, "System Content Providers"); ActivityManagerService.installSystemProviders(); - systemServiceManager.startService(LightsService.class); + mSystemServiceManager.startService(LightsService.class); lights = LocalServices.getService(LightsManager.class); Slog.i(TAG, "Battery Service"); @@ -305,30 +396,32 @@ class ServerThread { vibrator = new VibratorService(context); ServiceManager.addService("vibrator", vibrator); - Slog.i(TAG, "Consumer IR Service"); - consumerIr = new ConsumerIrService(context); - ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); - + // TODO: use boot phase // only initialize the power service after we have started the // lights service, content providers and the battery service. - power.init(context, lights, battery, + mPowerManagerService.init(lights, battery, BatteryStatsService.getService(), ActivityManagerService.self().getAppOpsService(), display); - systemServiceManager.startService(AlarmManagerService.class); + Slog.i(TAG, "Consumer IR Service"); + consumerIr = new ConsumerIrService(context); + ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr); + + mSystemServiceManager.startService(AlarmManagerService.class); alarm = IAlarmManager.Stub.asInterface( ServiceManager.getService(Context.ALARM_SERVICE)); Slog.i(TAG, "Init Watchdog"); - Watchdog.getInstance().init(context, ActivityManagerService.self()); - Watchdog.getInstance().addThread(wmHandler, "WindowManager thread"); + final Watchdog watchdog = Watchdog.getInstance(); + watchdog.init(context, ActivityManagerService.self()); Slog.i(TAG, "Input Manager"); - inputManager = new InputManagerService(context, wmHandler); + inputManager = new InputManagerService(context, windowManagerHandler); Slog.i(TAG, "Window Manager"); - wm = WindowManagerService.main(context, power, display, inputManager, - wmHandler, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL, + wm = WindowManagerService.main(context, display, inputManager, + windowManagerHandler, + mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL, !firstBoot, onlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ServiceManager.addService(Context.INPUT_SERVICE, inputManager); @@ -346,7 +439,7 @@ class ServerThread { // support Bluetooth - see bug 988521 if (SystemProperties.get("ro.kernel.qemu").equals("1")) { Slog.i(TAG, "No Bluetooh Service (emulator)"); - } else if (factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) { + } else if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) { Slog.i(TAG, "No Bluetooth Service (factory test)"); } else if (!context.getPackageManager().hasSystemFeature (PackageManager.FEATURE_BLUETOOTH)) { @@ -376,7 +469,7 @@ class ServerThread { MediaRouterService mediaRouter = null; // Bring up services needed for UI. - if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) { //if (!disableNonCoreServices) { // TODO: View depends on these; mock them? if (true) { try { @@ -417,7 +510,7 @@ class ServerThread { } catch (RemoteException e) { } - if (factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) { if (!disableStorage && !"0".equals(SystemProperties.get("system_init.startmountservice"))) { try { @@ -444,7 +537,7 @@ class ServerThread { try { Slog.i(TAG, "Device Policy"); - systemServiceManager.startService(DEVICE_POLICY_MANAGER_SERVICE_CLASS); + mSystemServiceManager.startServiceIfExists(DEVICE_POLICY_MANAGER_SERVICE_CLASS); } catch (Throwable e) { reportWtf("starting DevicePolicyService", e); } @@ -502,7 +595,8 @@ class ServerThread { try { Slog.i(TAG, "NetworkPolicy Service"); networkPolicy = new NetworkPolicyManagerService( - context, ActivityManagerService.self(), power, + context, ActivityManagerService.self(), + (IPowerManager)ServiceManager.getService(Context.POWER_SERVICE), networkStats, networkManagement); ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy); } catch (Throwable e) { @@ -511,14 +605,16 @@ class ServerThread { try { Slog.i(TAG, "Wi-Fi P2pService"); - systemServiceManager.startService("com.android.server.wifi.p2p.WifiP2pService"); + mSystemServiceManager.startServiceIfExists( + "com.android.server.wifi.p2p.WifiP2pService"); } catch (Throwable e) { reportWtf("starting Wi-Fi P2pService", e); } try { Slog.i(TAG, "Wi-Fi Service"); - systemServiceManager.startService("com.android.server.wifi.WifiService"); + mSystemServiceManager.startServiceIfExists( + "com.android.server.wifi.WifiService"); } catch (Throwable e) { reportWtf("starting Wi-Fi Service", e); } @@ -577,12 +673,12 @@ class ServerThread { reportWtf("making Content Service ready", e); } - systemServiceManager.startService(NotificationManagerService.class); + mSystemServiceManager.startService(NotificationManagerService.class); notification = INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); networkPolicy.bindNotificationManager(notification); - systemServiceManager.startService(DeviceStorageMonitorService.class); + mSystemServiceManager.startService(DeviceStorageMonitorService.class); if (!disableLocation) { try { @@ -681,22 +777,22 @@ class ServerThread { } } - systemServiceManager.startService(TwilightService.class); + mSystemServiceManager.startService(TwilightService.class); twilight = LocalServices.getService(TwilightManager.class); - systemServiceManager.startService(UiModeManagerService.class); + mSystemServiceManager.startService(UiModeManagerService.class); if (!disableNonCoreServices) { try { Slog.i(TAG, "Backup Service"); - systemServiceManager.startService(BACKUP_MANAGER_SERVICE_CLASS); + mSystemServiceManager.startServiceIfExists(BACKUP_MANAGER_SERVICE_CLASS); } catch (Throwable e) { Slog.e(TAG, "Failure starting Backup Service", e); } try { Slog.i(TAG, "AppWidget Service"); - systemServiceManager.startService(APPWIDGET_SERVICE_CLASS); + mSystemServiceManager.startServiceIfExists(APPWIDGET_SERVICE_CLASS); } catch (Throwable e) { reportWtf("starting AppWidget Service", e); } @@ -761,7 +857,7 @@ class ServerThread { try { Slog.i(TAG, "Dreams Service"); // Dreams (interactive idle-time views, a/k/a screen savers) - dreamy = new DreamManagerService(context, wmHandler); + dreamy = new DreamManagerService(context, windowManagerHandler); ServiceManager.addService(DreamService.DREAM_SERVICE, dreamy); } catch (Throwable e) { reportWtf("starting DreamManagerService", e); @@ -787,7 +883,7 @@ class ServerThread { try { Slog.i(TAG, "Print Service"); - systemServiceManager.startService(PRINT_MANAGER_SERVICE_CLASS); + mSystemServiceManager.startServiceIfExists(PRINT_MANAGER_SERVICE_CLASS); } catch (Throwable e) { reportWtf("starting Print Service", e); } @@ -834,9 +930,9 @@ class ServerThread { } // Needed by DevicePolicyManager for initialization - systemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY); + mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY); - systemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); + mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); try { wm.systemReady(); @@ -858,7 +954,8 @@ class ServerThread { context.getResources().updateConfiguration(config, metrics); try { - power.systemReady(twilight, dreamy); + // TODO: use boot phase + mPowerManagerService.systemReady(twilight, dreamy); } catch (Throwable e) { reportWtf("making Power Manager Service ready", e); } @@ -968,7 +1065,7 @@ class ServerThread { // It is now okay to let the various system services start their // third party code... - systemServiceManager.startBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); + mSystemServiceManager.startBootPhase(SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); try { if (wallpaperF != null) wallpaperF.systemRunning(); @@ -1035,17 +1132,9 @@ class ServerThread { reportWtf("Notifying MediaRouterService running", e); } - systemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETE); + mSystemServiceManager.startBootPhase(SystemService.PHASE_BOOT_COMPLETE); } }); - - // For debug builds, log event loop stalls to dropbox for analysis. - if (StrictMode.conditionallyEnableDebugLogging()) { - Slog.i(TAG, "Enabled StrictMode for system server main thread."); - } - - Looper.loop(); - Slog.d(TAG, "System ServerThread is exiting!"); } static final void startSystemUi(Context context) { @@ -1056,80 +1145,3 @@ class ServerThread { context.startServiceAsUser(intent, UserHandle.OWNER); } } - -public class SystemServer { - private static final String TAG = "SystemServer"; - - public static final int FACTORY_TEST_OFF = 0; - public static final int FACTORY_TEST_LOW_LEVEL = 1; - public static final int FACTORY_TEST_HIGH_LEVEL = 2; - - static Timer timer; - static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr - - // The earliest supported time. We pick one day into 1970, to - // give any timezone code room without going into negative time. - private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000; - - /** - * Called to initialize native system services. - */ - private static native void nativeInit(); - - public static void main(String[] args) { - - /* - * In case the runtime switched since last boot (such as when - * the old runtime was removed in an OTA), set the system - * property so that it is in sync. We can't do this in - * libnativehelper's JniInvocation::Init code where we already - * had to fallback to a different runtime because it is - * running as root and we need to be the system user to set - * the property. http://b/11463182 - */ - SystemProperties.set("persist.sys.dalvik.vm.lib", - VMRuntime.getRuntime().vmLibrary()); - - if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { - // If a device's clock is before 1970 (before 0), a lot of - // APIs crash dealing with negative numbers, notably - // java.io.File#setLastModified, so instead we fake it and - // hope that time from cell towers or NTP fixes it - // shortly. - Slog.w(TAG, "System clock is before 1970; setting to 1970."); - SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); - } - - if (SamplingProfilerIntegration.isEnabled()) { - SamplingProfilerIntegration.start(); - timer = new Timer(); - timer.schedule(new TimerTask() { - @Override - public void run() { - SamplingProfilerIntegration.writeSnapshot("system_server", null); - } - }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); - } - - // Mmmmmm... more memory! - dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); - - // The system server has to run all of the time, so it needs to be - // as efficient as possible with its memory usage. - VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); - - Environment.setUserRequired(true); - - System.loadLibrary("android_servers"); - - Slog.i(TAG, "Entered the Android system server!"); - - // Initialize native services. - nativeInit(); - - // This used to be its own separate thread, but now it is - // just the loop we run on the main thread. - ServerThread thr = new ServerThread(); - thr.initAndLoop(); - } -} diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index e0d650593d09..11dab0bb6e31 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -20,7 +20,6 @@ import android.app.IActivityController; import android.os.Binder; import android.os.RemoteException; import com.android.server.am.ActivityManagerService; -import com.android.server.power.PowerManagerService; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -29,6 +28,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.Debug; import android.os.Handler; +import android.os.IPowerManager; import android.os.Looper; import android.os.Process; import android.os.ServiceManager; @@ -265,15 +265,16 @@ public class Watchdog extends Thread { } } - public void addThread(Handler thread, String name) { - addThread(thread, name, DEFAULT_TIMEOUT); + public void addThread(Handler thread) { + addThread(thread, DEFAULT_TIMEOUT); } - public void addThread(Handler thread, String name, long timeoutMillis) { + public void addThread(Handler thread, long timeoutMillis) { synchronized (this) { if (isAlive()) { throw new RuntimeException("Threads can't be added once the Watchdog is running"); } + final String name = thread.getLooper().getThread().getName(); mHandlerCheckers.add(new HandlerChecker(thread, name, timeoutMillis)); } } @@ -283,8 +284,11 @@ public class Watchdog extends Thread { */ void rebootSystem(String reason) { Slog.i(TAG, "Rebooting system because: " + reason); - PowerManagerService pms = (PowerManagerService) ServiceManager.getService("power"); - pms.reboot(false, reason, false); + IPowerManager pms = (IPowerManager)ServiceManager.getService(Context.POWER_SERVICE); + try { + pms.reboot(false, reason, false); + } catch (RemoteException ex) { + } } private int evaluateCheckerCompletionLocked() { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index dd536488c169..77ffeca4606c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -49,7 +49,9 @@ import com.android.internal.util.Preconditions; import com.android.server.AppOpsService; import com.android.server.AttributeCache; import com.android.server.IntentResolver; +import com.android.server.ServiceThread; import com.android.server.SystemServer; +import com.android.server.SystemService; import com.android.server.Watchdog; import com.android.server.am.ActivityStack.ActivityState; import com.android.server.firewall.IntentFirewall; @@ -135,6 +137,7 @@ import android.os.Bundle; import android.os.Debug; import android.os.DropBoxManager; import android.os.Environment; +import android.os.FactoryTest; import android.os.FileObserver; import android.os.FileUtils; import android.os.Handler; @@ -746,7 +749,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private static ThreadLocal<Identity> sCallerIdentity = new ThreadLocal<Identity>(); + private static final ThreadLocal<Identity> sCallerIdentity = new ThreadLocal<Identity>(); /** * All information we have collected about the runtime performance of @@ -995,8 +998,8 @@ public final class ActivityManagerService extends ActivityManagerNative WindowManagerService mWindowManager; - static ActivityManagerService mSelf; - static ActivityThread mSystemThread; + static ActivityManagerService sSelf; + static ActivityThread sSystemThread; int mCurrentUserId = 0; private UserManagerService mUserManager; @@ -1073,10 +1076,13 @@ public final class ActivityManagerService extends ActivityManagerNative */ private boolean mUserIsMonkey; - final Handler mHandler = new Handler() { - //public Handler() { - // if (localLOGV) Slog.v(TAG, "Handler started!"); - //} + final ServiceThread mHandlerThread; + final MainHandler mHandler; + + final class MainHandler extends Handler { + public MainHandler(Looper looper) { + super(looper, null, true); + } @Override public void handleMessage(Message msg) { @@ -1731,7 +1737,7 @@ public final class ActivityManagerService extends ActivityManagerNative public static void setSystemProcess() { try { - ActivityManagerService m = mSelf; + ActivityManagerService m = sSelf; ServiceManager.addService(Context.ACTIVITY_SERVICE, m, true); ServiceManager.addService(ProcessStats.SERVICE_NAME, m.mProcessStats); @@ -1744,23 +1750,23 @@ public final class ActivityManagerService extends ActivityManagerNative ServiceManager.addService("permission", new PermissionController(m)); ApplicationInfo info = - mSelf.mContext.getPackageManager().getApplicationInfo( + sSelf.mContext.getPackageManager().getApplicationInfo( "android", STOCK_PM_FLAGS); - mSystemThread.installSystemApplicationInfo(info); + sSystemThread.installSystemApplicationInfo(info); - synchronized (mSelf) { - ProcessRecord app = mSelf.newProcessRecordLocked(info, + synchronized (sSelf) { + ProcessRecord app = sSelf.newProcessRecordLocked(info, info.processName, false); app.persistent = true; app.pid = MY_PID; app.maxAdj = ProcessList.SYSTEM_ADJ; - app.makeActive(mSystemThread.getApplicationThread(), mSelf.mProcessStats); - mSelf.mProcessNames.put(app.processName, app.uid, app); - synchronized (mSelf.mPidsSelfLocked) { - mSelf.mPidsSelfLocked.put(app.pid, app); + app.makeActive(sSystemThread.getApplicationThread(), sSelf.mProcessStats); + sSelf.mProcessNames.put(app.processName, app.uid, app); + synchronized (sSelf.mPidsSelfLocked) { + sSelf.mPidsSelfLocked.put(app.pid, app); } - mSelf.updateLruProcessLocked(app, false, null); - mSelf.updateOomAdjLocked(); + sSelf.updateLruProcessLocked(app, false, null); + sSelf.updateOomAdjLocked(); } } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( @@ -1778,97 +1784,14 @@ public final class ActivityManagerService extends ActivityManagerNative ncl.start(); } - public static final Context main(int factoryTest) { - AThread thr = new AThread(); - thr.start(); - - synchronized (thr) { - while (thr.mService == null) { - try { - thr.wait(); - } catch (InterruptedException e) { - } - } - } - - ActivityManagerService m = thr.mService; - mSelf = m; - ActivityThread at = ActivityThread.systemMain(); - mSystemThread = at; - Context context = at.getSystemContext(); - context.setTheme(android.R.style.Theme_Holo); - m.mContext = context; - m.mFactoryTest = factoryTest; - m.mIntentFirewall = new IntentFirewall(m.new IntentFirewallInterface()); - - m.mStackSupervisor = new ActivityStackSupervisor(m); - - m.mBatteryStatsService.publish(context); - m.mUsageStatsService.publish(context); - m.mAppOpsService.publish(context); - - synchronized (thr) { - thr.mReady = true; - thr.notifyAll(); - } - - m.startRunning(null, null, null, null); - - return context; - } - public static ActivityManagerService self() { - return mSelf; + return sSelf; } public IAppOpsService getAppOpsService() { return mAppOpsService; } - static class AThread extends Thread { - ActivityManagerService mService; - Looper mLooper; - boolean mReady = false; - - public AThread() { - super("ActivityManager"); - } - - @Override - public void run() { - Looper.prepare(); - - android.os.Process.setThreadPriority( - android.os.Process.THREAD_PRIORITY_FOREGROUND); - android.os.Process.setCanSelfBackground(false); - - ActivityManagerService m = new ActivityManagerService(); - - synchronized (this) { - mService = m; - mLooper = Looper.myLooper(); - Watchdog.getInstance().addThread(new Handler(mLooper), getName()); - notifyAll(); - } - - synchronized (this) { - while (!mReady) { - try { - wait(); - } catch (InterruptedException e) { - } - } - } - - // For debug builds, log event loop stalls to dropbox for analysis. - if (StrictMode.conditionallyEnableDebugLogging()) { - Slog.i(TAG, "Enabled StrictMode logging for AThread's Looper"); - } - - Looper.loop(); - } - } - static class MemBinder extends Binder { ActivityManagerService mActivityManagerService; MemBinder(ActivityManagerService activityManagerService) { @@ -1953,22 +1876,51 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private ActivityManagerService() { + public static class Lifecycle extends SystemService { + private ActivityManagerService mService; + + @Override + public void onCreate(Context context) { + mService = new ActivityManagerService(context); + } + + @Override + public void onStart() { + mService.start(); + } + } + + // Note: This method is invoked on the main thread but may need to attach various + // handlers to other threads. So take care to be explicit about the looper. + public ActivityManagerService(Context systemContext) { + sSelf = this; + sSystemThread = ActivityThread.currentActivityThread(); + + mContext = systemContext; + mFactoryTest = FactoryTest.getMode(); + Slog.i(TAG, "Memory class: " + ActivityManager.staticGetMemoryClass()); - mFgBroadcastQueue = new BroadcastQueue(this, "foreground", BROADCAST_FG_TIMEOUT, false); - mBgBroadcastQueue = new BroadcastQueue(this, "background", BROADCAST_BG_TIMEOUT, true); + mHandlerThread = new ServiceThread(TAG, android.os.Process.THREAD_PRIORITY_FOREGROUND); + mHandlerThread.start(); + mHandler = new MainHandler(mHandlerThread.getLooper()); + + mFgBroadcastQueue = new BroadcastQueue(this, mHandler, + "foreground", BROADCAST_FG_TIMEOUT, false); + mBgBroadcastQueue = new BroadcastQueue(this, mHandler, + "background", BROADCAST_BG_TIMEOUT, true); mBroadcastQueues[0] = mFgBroadcastQueue; mBroadcastQueues[1] = mBgBroadcastQueue; mServices = new ActiveServices(this); mProviderMap = new ProviderMap(this); + // TODO: Move creation of battery stats service outside of activity manager service. File dataDir = Environment.getDataDirectory(); File systemDir = new File(dataDir, "system"); systemDir.mkdirs(); mBatteryStatsService = new BatteryStatsService(new File( - systemDir, "batterystats.bin").toString()); + systemDir, "batterystats.bin").toString(), mHandler); mBatteryStatsService.getActiveStatistics().readLocked(); mBatteryStatsService.getActiveStatistics().writeAsyncLocked(); mOnBattery = DEBUG_POWER ? true @@ -1978,7 +1930,7 @@ public final class ActivityManagerService extends ActivityManagerNative mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats")); mUsageStatsService = new UsageStatsService(new File(systemDir, "usagestats").toString()); - mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml")); + mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler); mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml")); @@ -1996,10 +1948,9 @@ public final class ActivityManagerService extends ActivityManagerNative mConfigurationSeq = mConfiguration.seq = 1; mProcessCpuTracker.init(); - mCompatModePackages = new CompatModePackages(this, systemDir); - - // Add ourself to the Watchdog monitors. - Watchdog.getInstance().addMonitor(this); + mCompatModePackages = new CompatModePackages(this, systemDir, mHandler); + mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler); + mStackSupervisor = new ActivityStackSupervisor(this); mProcessCpuThread = new Thread("CpuTracker") { @Override @@ -2030,7 +1981,18 @@ public final class ActivityManagerService extends ActivityManagerNative } } }; + + Watchdog.getInstance().addMonitor(this); + Watchdog.getInstance().addThread(mHandler); + } + + private void start() { mProcessCpuThread.start(); + + mBatteryStatsService.publish(mContext); + mUsageStatsService.publish(mContext); + mAppOpsService.publish(mContext); + startRunning(null, null, null, null); } @Override @@ -2726,13 +2688,13 @@ public final class ActivityManagerService extends ActivityManagerNative } gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid)); } - if (mFactoryTest != SystemServer.FACTORY_TEST_OFF) { - if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL + if (mFactoryTest != FactoryTest.FACTORY_TEST_OFF) { + if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopComponent != null && app.processName.equals(mTopComponent.getPackageName())) { uid = 0; } - if (mFactoryTest == SystemServer.FACTORY_TEST_HIGH_LEVEL + if (mFactoryTest == FactoryTest.FACTORY_TEST_HIGH_LEVEL && (app.info.flags&ApplicationInfo.FLAG_FACTORY_TEST) != 0) { uid = 0; } @@ -2842,14 +2804,14 @@ public final class ActivityManagerService extends ActivityManagerNative Intent getHomeIntent() { Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null); intent.setComponent(mTopComponent); - if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { intent.addCategory(Intent.CATEGORY_HOME); } return intent; } boolean startHomeActivityLocked(int userId) { - if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL + if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) { // We are running in factory test mode, but unable to find // the factory test app, so just sit around displaying the @@ -2913,14 +2875,14 @@ public final class ActivityManagerService extends ActivityManagerNative // version than the last one shown, and we are not running in // low-level factory test mode. final ContentResolver resolver = mContext.getContentResolver(); - if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL && + if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL && Settings.Global.getInt(resolver, Settings.Global.DEVICE_PROVISIONED, 0) != 0) { mCheckedForSetup = true; // See if we should be showing the platform update setup UI. Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP); - List<ResolveInfo> ris = mSelf.mContext.getPackageManager() + List<ResolveInfo> ris = sSelf.mContext.getPackageManager() .queryIntentActivities(intent, PackageManager.GET_META_DATA); // We don't allow third party apps to replace this. @@ -5150,7 +5112,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } - if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { // Start looking for apps that are abusing wake locks. Message nmsg = mHandler.obtainMessage(CHECK_EXCESSIVE_WAKE_LOCKS_MSG); mHandler.sendMessageDelayed(nmsg, POWER_CHECK_DELAY); @@ -8014,9 +7976,9 @@ public final class ActivityManagerService extends ActivityManagerNative public static final void installSystemProviders() { List<ProviderInfo> providers; - synchronized (mSelf) { - ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID); - providers = mSelf.generateApplicationProvidersLocked(app); + synchronized (sSelf) { + ProcessRecord app = sSelf.mProcessNames.get("system", Process.SYSTEM_UID); + providers = sSelf.generateApplicationProvidersLocked(app); if (providers != null) { for (int i=providers.size()-1; i>=0; i--) { ProviderInfo pi = (ProviderInfo)providers.get(i); @@ -8029,12 +7991,12 @@ public final class ActivityManagerService extends ActivityManagerNative } } if (providers != null) { - mSystemThread.installSystemProviders(providers); + sSystemThread.installSystemProviders(providers); } - mSelf.mCoreSettingsObserver = new CoreSettingsObserver(mSelf); + sSelf.mCoreSettingsObserver = new CoreSettingsObserver(sSelf); - mSelf.mUsageStatsService.monitorPackages(); + sSelf.mUsageStatsService.monitorPackages(); } /** @@ -9272,7 +9234,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { // Make sure we have no pre-ready processes sitting around. - if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) { ResolveInfo ri = mContext.getPackageManager() .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS); @@ -9314,7 +9276,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (goingCallback != null) goingCallback.run(); synchronized (this) { - if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) { + if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { try { List apps = AppGlobals.getPackageManager(). getPersistentApplications(STOCK_PM_FLAGS); @@ -14037,7 +13999,7 @@ public final class ActivityManagerService extends ActivityManagerNative // boot, where the first config change needs to guarantee // all resources have that config before following boot // code is executed. - mSystemThread.applyConfigurationToResources(configCopy); + sSystemThread.applyConfigurationToResources(configCopy); if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) { Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 287765d2db2d..4d863dcf0306 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -323,7 +323,7 @@ final class ActivityStack { } } - private int numActivities() { + int numActivities() { int count = 0; for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) { count += mTaskHistory.get(taskNdx).mActivities.size(); @@ -2712,6 +2712,7 @@ final class ActivityStack { } private void removeActivityFromHistoryLocked(ActivityRecord r) { + mStackSupervisor.removeChildActivityContainers(r); finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null); r.makeFinishing(); if (DEBUG_ADD_REMOVE) { @@ -3355,6 +3356,8 @@ final class ActivityStack { r.startFreezingScreenLocked(r.app, 0); + mStackSupervisor.removeChildActivityContainers(r); + try { if (DEBUG_SWITCH || DEBUG_STATES) Slog.i(TAG, (andResume ? "Relaunching to RESUMED " : "Relaunching to PAUSED ") @@ -3387,14 +3390,20 @@ final class ActivityStack { for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); if (r.appToken == token) { - return true; + return true; } if (r.fullscreen && !r.finishing) { return false; } } } - return true; + final ActivityRecord r = ActivityRecord.forToken(token); + if (r == null) { + return false; + } + if (r.finishing) Slog.e(TAG, "willActivityBeVisibleLocked: Returning false," + + " would have returned true for r=" + r); + return !r.finishing; } void closeSystemDialogsLocked() { @@ -3652,8 +3661,10 @@ final class ActivityStack { if (isOnHomeDisplay()) { mStackSupervisor.moveHomeStack(!isHomeStack()); } - mStacks.remove(this); - mStacks.add(0, this); + if (mStacks != null) { + mStacks.remove(this); + mStacks.add(0, this); + } } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 6ab59a7d29a5..6c2128b124d4 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -417,11 +417,13 @@ public final class ActivityStackSupervisor implements DisplayListener { ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = stacks.get(stackNdx); - if (!isFrontStack(stack)) { + if (!isFrontStack(stack) || stack.numActivities() == 0) { continue; } final ActivityRecord resumedActivity = stack.mResumedActivity; if (resumedActivity == null || !resumedActivity.idle) { + if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack=" + + stack.mStackId + " " + resumedActivity + " not idle"); return false; } } @@ -2131,6 +2133,28 @@ public final class ActivityStackSupervisor implements DisplayListener { return createActivityContainer(parentActivity, getNextStackId(), callback); } + void removeChildActivityContainers(ActivityRecord parentActivity) { + for (int ndx = mActivityContainers.size() - 1; ndx >= 0; --ndx) { + final ActivityContainer container = mActivityContainers.valueAt(ndx).get(); + if (container == null) { + mActivityContainers.removeAt(ndx); + continue; + } + if (container.mParentActivity != parentActivity) { + continue; + } + + ActivityStack stack = container.mStack; + ActivityRecord top = stack.topRunningNonDelayedActivityLocked(null); + if (top != null) { + // TODO: Make sure the next activity doesn't start up when top is destroyed. + stack.destroyActivityLocked(top, true, true, "stack removal"); + } + mActivityContainers.removeAt(ndx); + container.detachLocked(); + } + } + private int createStackOnDisplay(ActivityRecord parentActivity, int stackId, int displayId) { ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); if (activityDisplay == null) { @@ -2684,7 +2708,9 @@ public final class ActivityStackSupervisor implements DisplayListener { } final void scheduleResumeTopActivities() { - mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); + if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) { + mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); + } } void removeSleepTimeouts() { @@ -2732,7 +2758,7 @@ public final class ActivityStackSupervisor implements DisplayListener { if (activityDisplay != null) { ArrayList<ActivityStack> stacks = activityDisplay.mStacks; for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { - activityDisplay.detachActivitiesLocked(stacks.get(stackNdx)); + stacks.get(stackNdx).mActivityContainer.detachLocked(); } mActivityDisplays.remove(displayId); } @@ -2873,6 +2899,7 @@ public final class ActivityStackSupervisor implements DisplayListener { final IActivityContainerCallback mCallback; final ActivityStack mStack; final ActivityRecord mParentActivity; + final String mIdString; /** Display this ActivityStack is currently on. Null if not attached to a Display. */ ActivityDisplay mActivityDisplay; @@ -2884,10 +2911,14 @@ public final class ActivityStackSupervisor implements DisplayListener { mStack = new ActivityStack(this); mParentActivity = parentActivity; mCallback = callback; + mIdString = "ActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}"; + if (DEBUG_STACK) Slog.d(TAG, "Creating " + this); } } void attachToDisplayLocked(ActivityDisplay activityDisplay) { + if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this + + " to display=" + activityDisplay); mActivityDisplay = activityDisplay; mStack.mDisplayId = activityDisplay.mDisplayId; mStack.mStacks = activityDisplay.mStacks; @@ -2915,7 +2946,9 @@ public final class ActivityStackSupervisor implements DisplayListener { return -1; } - void detachLocked() { + private void detachLocked() { + if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display=" + + mActivityDisplay + " Callers=" + Debug.getCallers(2)); if (mActivityDisplay != null) { mActivityDisplay.detachActivitiesLocked(mStack); mActivityDisplay = null; @@ -2952,45 +2985,15 @@ public final class ActivityStackSupervisor implements DisplayListener { } @Override - public void createActivityView(Surface surface, int width, int height, int density) { - DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); - VirtualDisplay virtualDisplay; - long ident = Binder.clearCallingIdentity(); - try { - virtualDisplay = dm.createVirtualDisplay(mService.mContext, - VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface, - DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | - DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); - } finally { - Binder.restoreCallingIdentity(ident); - } - - final Display display = virtualDisplay.getDisplay(); - final int displayId = display.getDisplayId(); - - mWindowManager.handleDisplayAdded(displayId); - + public void attachToSurface(Surface surface, int width, int height, int density) { synchronized (mService) { - ActivityDisplay activityDisplay = new ActivityDisplay(display); - mActivityDisplays.put(displayId, activityDisplay); + ActivityDisplay activityDisplay = + new ActivityDisplay(surface, width, height, density); + mActivityDisplays.put(activityDisplay.mDisplayId, activityDisplay); attachToDisplayLocked(activityDisplay); - activityDisplay.mVirtualDisplay = virtualDisplay; - } - } - - @Override - public void deleteActivityView() { - synchronized (mService) { - if (!isAttached()) { - return; - } - VirtualDisplay virtualDisplay = mActivityDisplay.mVirtualDisplay; - if (virtualDisplay != null) { - virtualDisplay.release(); - mActivityDisplay.mVirtualDisplay = null; - } - detachLocked(); } + if (DEBUG_STACK) Slog.d(TAG, "attachToSurface: " + this + " to display=" + + mActivityDisplay); } ActivityStackSupervisor getOuter() { @@ -3008,15 +3011,21 @@ public final class ActivityStackSupervisor implements DisplayListener { outBounds.set(0, 0); } } + + @Override + public String toString() { + return mIdString + (mActivityDisplay == null ? "N" : "A"); + } } /** Exactly one of these classes per Display in the system. Capable of holding zero or more * attached {@link ActivityStack}s */ final class ActivityDisplay { /** Actual Display this object tracks. */ - final int mDisplayId; - final Display mDisplay; - final DisplayInfo mDisplayInfo = new DisplayInfo(); + int mDisplayId; + Display mDisplay; + DisplayInfo mDisplayInfo = new DisplayInfo(); + Surface mSurface; /** All of the stacks on this display. Order matters, topmost stack is in front of all other * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ @@ -3027,10 +3036,32 @@ public final class ActivityStackSupervisor implements DisplayListener { VirtualDisplay mVirtualDisplay; ActivityDisplay(int displayId) { - this(mDisplayManager.getDisplay(displayId)); + init(mDisplayManager.getDisplay(displayId)); } ActivityDisplay(Display display) { + init(display); + } + + ActivityDisplay(Surface surface, int width, int height, int density) { + DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); + long ident = Binder.clearCallingIdentity(); + try { + mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, + VIRTUAL_DISPLAY_BASE_NAME, width, height, density, surface, + DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | + DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); + } finally { + Binder.restoreCallingIdentity(ident); + } + + init(mVirtualDisplay.getDisplay()); + mSurface = surface; + + mWindowManager.handleDisplayAdded(mDisplayId); + } + + private void init(Display display) { mDisplay = display; mDisplayId = display.getDisplayId(); mDisplay.getDisplayInfo(mDisplayInfo); @@ -3043,9 +3074,14 @@ public final class ActivityStackSupervisor implements DisplayListener { } void detachActivitiesLocked(ActivityStack stack) { - if (DEBUG_STACK) Slog.v(TAG, "attachActivities: detaching " + stack + if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack + " from displayId=" + mDisplayId); mStacks.remove(stack); + if (mStacks.isEmpty() && mVirtualDisplay != null) { + mVirtualDisplay.release(); + mVirtualDisplay = null; + } + mSurface.release(); } void getBounds(Point bounds) { @@ -3053,5 +3089,11 @@ public final class ActivityStackSupervisor implements DisplayListener { bounds.x = mDisplayInfo.appWidth; bounds.y = mDisplayInfo.appHeight; } + + @Override + public String toString() { + return "ActivityDisplay={" + mDisplayId + (mVirtualDisplay == null ? "" : "V") + + " numStacks=" + mStacks.size() + "}"; + } } } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 9805efe7d099..d2dfb0db2c2c 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -24,6 +24,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.os.BatteryStats; import android.os.Binder; +import android.os.Handler; import android.os.IBinder; import android.os.Parcel; import android.os.Process; @@ -54,8 +55,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub { private boolean mBluetoothPendingStats; private BluetoothHeadset mBluetoothHeadset; - BatteryStatsService(String filename) { - mStats = new BatteryStatsImpl(filename); + BatteryStatsService(String filename, Handler handler) { + mStats = new BatteryStatsImpl(filename, handler); } public void publish(Context context) { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index d0dd75d2b790..b15fa5d407e4 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -32,6 +32,7 @@ import android.content.pm.ResolveInfo; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.RemoteException; @@ -131,7 +132,14 @@ public final class BroadcastQueue { static final int BROADCAST_INTENT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG; static final int BROADCAST_TIMEOUT_MSG = ActivityManagerService.FIRST_BROADCAST_QUEUE_MSG + 1; - final Handler mHandler = new Handler() { + final BroadcastHandler mHandler; + + private final class BroadcastHandler extends Handler { + public BroadcastHandler(Looper looper) { + super(looper, null, true); + } + + @Override public void handleMessage(Message msg) { switch (msg.what) { case BROADCAST_INTENT_MSG: { @@ -163,9 +171,10 @@ public final class BroadcastQueue { } } - BroadcastQueue(ActivityManagerService service, String name, long timeoutPeriod, - boolean allowDelayBehindServices) { + BroadcastQueue(ActivityManagerService service, Handler handler, + String name, long timeoutPeriod, boolean allowDelayBehindServices) { mService = service; + mHandler = new BroadcastHandler(handler.getLooper()); mQueueName = name; mTimeoutPeriod = timeoutPeriod; mDelayBehindServices = allowDelayBehindServices; diff --git a/services/core/java/com/android/server/am/CompatModePackages.java b/services/core/java/com/android/server/am/CompatModePackages.java index 4d5577bdbd69..207d6306334b 100644 --- a/services/core/java/com/android/server/am/CompatModePackages.java +++ b/services/core/java/com/android/server/am/CompatModePackages.java @@ -19,6 +19,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.res.CompatibilityInfo; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.util.AtomicFile; @@ -41,22 +42,27 @@ public final class CompatModePackages { private static final int MSG_WRITE = ActivityManagerService.FIRST_COMPAT_MODE_MSG; - private final Handler mHandler = new Handler() { - @Override public void handleMessage(Message msg) { + private final CompatHandler mHandler; + + private final class CompatHandler extends Handler { + public CompatHandler(Looper looper) { + super(looper, null, true); + } + + @Override + public void handleMessage(Message msg) { switch (msg.what) { case MSG_WRITE: saveCompatModes(); break; - default: - super.handleMessage(msg); - break; } } }; - public CompatModePackages(ActivityManagerService service, File systemDir) { + public CompatModePackages(ActivityManagerService service, File systemDir, Handler handler) { mService = service; mFile = new AtomicFile(new File(systemDir, "packages-compat.xml")); + mHandler = new CompatHandler(handler.getLooper()); FileInputStream fis = null; try { diff --git a/services/core/java/com/android/server/firewall/IntentFirewall.java b/services/core/java/com/android/server/firewall/IntentFirewall.java index 6df1dbdce670..eb7a3833ad24 100644 --- a/services/core/java/com/android/server/firewall/IntentFirewall.java +++ b/services/core/java/com/android/server/firewall/IntentFirewall.java @@ -26,6 +26,7 @@ import android.content.pm.PackageManager; import android.os.Environment; import android.os.FileObserver; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.util.ArrayMap; @@ -106,8 +107,9 @@ public class IntentFirewall { } } - public IntentFirewall(AMSInterface ams) { + public IntentFirewall(AMSInterface ams, Handler handler) { mAms = ams; + mHandler = new FirewallHandler(handler.getLooper()); File rulesDir = getRulesDir(); rulesDir.mkdirs(); @@ -533,7 +535,13 @@ public class IntentFirewall { new ArrayMap<ComponentName, Rule[]>(0); } - final Handler mHandler = new Handler() { + final FirewallHandler mHandler; + + private final class FirewallHandler extends Handler { + public FirewallHandler(Looper looper) { + super(looper, null, true); + } + @Override public void handleMessage(Message msg) { readRulesDir(getRulesDir()); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index db4cf31d7dad..e4ea0338c82c 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1045,8 +1045,8 @@ public class NotificationManagerService extends SystemService { } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { mScreenOn = false; } else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { - mInCall = (intent.getStringExtra(TelephonyManager.EXTRA_STATE).equals( - TelephonyManager.EXTRA_STATE_OFFHOOK)); + mInCall = TelephonyManager.EXTRA_STATE_OFFHOOK + .equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE)); updateNotificationPulse(); } else if (action.equals(Intent.ACTION_USER_STOPPED)) { int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 0d2b50316366..e2ff146afcfb 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -16,6 +16,8 @@ package com.android.server.pm; +import com.android.server.SystemService; + import android.content.pm.PackageStats; import android.net.LocalSocket; import android.net.LocalSocketAddress; @@ -25,21 +27,24 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -public final class Installer { +public final class Installer extends SystemService { private static final String TAG = "Installer"; private static final boolean LOCAL_DEBUG = false; InputStream mIn; - OutputStream mOut; - LocalSocket mSocket; byte buf[] = new byte[1024]; - int buflen = 0; + @Override + public void onStart() { + Slog.i(TAG, "Waiting for installd to be ready."); + ping(); + } + private boolean connect() { if (mSocket != null) { return true; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 9a26deee2af2..1eb545f998c1 100755 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -40,6 +40,7 @@ import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.IntentResolver; +import com.android.server.ServiceThread; import com.android.server.LocalServices; import com.android.server.Watchdog; @@ -261,8 +262,7 @@ public class PackageManagerService extends IPackageManager.Stub { static final String mTempContainerPrefix = "smdl2tmp"; - final HandlerThread mHandlerThread = new HandlerThread("PackageManager", - Process.THREAD_PRIORITY_BACKGROUND); + final ServiceThread mHandlerThread; final PackageHandler mHandler; final int mSdkVersion = Build.VERSION.SDK_INT; @@ -1126,10 +1126,10 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mInstallLock) { // writer synchronized (mPackages) { + mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_BACKGROUND); mHandlerThread.start(); mHandler = new PackageHandler(mHandlerThread.getLooper()); - Watchdog.getInstance().addThread(mHandler, mHandlerThread.getName(), - WATCHDOG_TIMEOUT); + Watchdog.getInstance().addThread(mHandler, WATCHDOG_TIMEOUT); File dataDir = Environment.getDataDirectory(); mAppDataDir = new File(dataDir, "data"); diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java index 13f55e2e4c54..3692d76099bd 100644 --- a/services/core/java/com/android/server/power/PowerManagerService.java +++ b/services/core/java/com/android/server/power/PowerManagerService.java @@ -20,6 +20,7 @@ import com.android.internal.app.IAppOpsService; import com.android.internal.app.IBatteryStats; import com.android.server.BatteryService; import com.android.server.EventLogTags; +import com.android.server.ServiceThread; import com.android.server.lights.LightsService; import com.android.server.lights.Light; import com.android.server.lights.LightsManager; @@ -49,6 +50,7 @@ import android.os.IPowerManager; import android.os.Looper; import android.os.Message; import android.os.PowerManager; +import android.os.PowerManagerInternal; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; @@ -73,7 +75,7 @@ import libcore.util.Objects; * The power manager service is responsible for coordinating power management * functions on the device. */ -public final class PowerManagerService extends IPowerManager.Stub +public final class PowerManagerService extends com.android.server.SystemService implements Watchdog.Monitor { private static final String TAG = "PowerManagerService"; @@ -174,7 +176,7 @@ public final class PowerManagerService extends IPowerManager.Stub private DisplayManagerService mDisplayManagerService; private IBatteryStats mBatteryStats; private IAppOpsService mAppOps; - private HandlerThread mHandlerThread; + private ServiceThread mHandlerThread; private PowerManagerHandler mHandler; private WindowManagerPolicy mPolicy; private Notifier mNotifier; @@ -232,9 +234,6 @@ public final class PowerManagerService extends IPowerManager.Stub // requested because it is updated asynchronously by the display power controller. private final DisplayPowerRequest mDisplayPowerRequest = new DisplayPowerRequest(); - // The time the screen was last turned off, in elapsedRealtime() timebase. - private long mLastScreenOffEventElapsedRealTime; - // True if the display power state has been fully applied, which means the display // is actually on or actually off or whatever was requested. private boolean mDisplayReady; @@ -393,25 +392,35 @@ public final class PowerManagerService extends IPowerManager.Stub nativeSetPowerState(true, true); } + @Override + public void onCreate(Context context) { + mContext = context; + } + + @Override + public void onStart() { + publishBinderService(Context.POWER_SERVICE, new BinderService()); + publishLocalService(PowerManagerInternal.class, new LocalService()); + } + /** * Initialize the power manager. * Must be called before any other functions within the power manager are called. */ - public void init(Context context, LightsManager ls, + public void init(LightsManager ls, BatteryService bs, IBatteryStats bss, IAppOpsService appOps, DisplayManagerService dm) { - mContext = context; mLightsManager = ls; mBatteryService = bs; mBatteryStats = bss; mAppOps = appOps; mDisplayManagerService = dm; - mHandlerThread = new HandlerThread(TAG); + mHandlerThread = new ServiceThread(TAG, Process.THREAD_PRIORITY_DISPLAY); mHandlerThread.start(); mHandler = new PowerManagerHandler(mHandlerThread.getLooper()); Watchdog.getInstance().addMonitor(this); - Watchdog.getInstance().addThread(mHandler, mHandlerThread.getName()); + Watchdog.getInstance().addThread(mHandler); // Forcibly turn the screen on at boot so that it is in a known power state. // We do this in init() rather than in the constructor because setting the @@ -422,7 +431,7 @@ public final class PowerManagerService extends IPowerManager.Stub mDisplayBlanker.unblankAllDisplays(); } - public void setPolicy(WindowManagerPolicy policy) { + void setPolicy(WindowManagerPolicy policy) { synchronized (mLock) { mPolicy = policy; } @@ -580,41 +589,6 @@ public final class PowerManagerService extends IPowerManager.Stub updatePowerStateLocked(); } - @Override // Binder call - public void acquireWakeLockWithUid(IBinder lock, int flags, String tag, String packageName, - int uid) { - acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid)); - } - - @Override // Binder call - public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName, - WorkSource ws) { - if (lock == null) { - throw new IllegalArgumentException("lock must not be null"); - } - if (packageName == null) { - throw new IllegalArgumentException("packageName must not be null"); - } - PowerManager.validateWakeLockParameters(flags, tag); - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); - if (ws != null && ws.size() != 0) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.UPDATE_DEVICE_STATS, null); - } else { - ws = null; - } - - final int uid = Binder.getCallingUid(); - final int pid = Binder.getCallingPid(); - final long ident = Binder.clearCallingIdentity(); - try { - acquireWakeLockInternal(lock, flags, tag, packageName, ws, uid, pid); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void acquireWakeLockInternal(IBinder lock, int flags, String tag, String packageName, WorkSource ws, int uid, int pid) { synchronized (mLock) { @@ -669,22 +643,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - @Override // Binder call - public void releaseWakeLock(IBinder lock, int flags) { - if (lock == null) { - throw new IllegalArgumentException("lock must not be null"); - } - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); - - final long ident = Binder.clearCallingIdentity(); - try { - releaseWakeLockInternal(lock, flags); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void releaseWakeLockInternal(IBinder lock, int flags) { synchronized (mLock) { int index = findWakeLockIndexLocked(lock); @@ -747,43 +705,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - @Override // Binder call - public void updateWakeLockUids(IBinder lock, int[] uids) { - WorkSource ws = null; - - if (uids != null) { - ws = new WorkSource(); - // XXX should WorkSource have a way to set uids as an int[] instead of adding them - // one at a time? - for (int i = 0; i < uids.length; i++) { - ws.add(uids[i]); - } - } - updateWakeLockWorkSource(lock, ws); - } - - @Override // Binder call - public void updateWakeLockWorkSource(IBinder lock, WorkSource ws) { - if (lock == null) { - throw new IllegalArgumentException("lock must not be null"); - } - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); - if (ws != null && ws.size() != 0) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.UPDATE_DEVICE_STATS, null); - } else { - ws = null; - } - - final long ident = Binder.clearCallingIdentity(); - try { - updateWakeLockWorkSourceInternal(lock, ws); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void updateWakeLockWorkSourceInternal(IBinder lock, WorkSource ws) { synchronized (mLock) { int index = findWakeLockIndexLocked(lock); @@ -835,16 +756,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - @Override // Binder call - public boolean isWakeLockLevelSupported(int level) { - final long ident = Binder.clearCallingIdentity(); - try { - return isWakeLockLevelSupportedInternal(level); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - @SuppressWarnings("deprecation") private boolean isWakeLockLevelSupportedInternal(int level) { synchronized (mLock) { @@ -864,40 +775,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - @Override // Binder call - public void userActivity(long eventTime, int event, int flags) { - final long now = SystemClock.uptimeMillis(); - if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER) - != PackageManager.PERMISSION_GRANTED) { - // Once upon a time applications could call userActivity(). - // Now we require the DEVICE_POWER permission. Log a warning and ignore the - // request instead of throwing a SecurityException so we don't break old apps. - synchronized (mLock) { - if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) { - mLastWarningAboutUserActivityPermission = now; - Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the " - + "caller does not have DEVICE_POWER permission. " - + "Please fix your app! " - + " pid=" + Binder.getCallingPid() - + " uid=" + Binder.getCallingUid()); - } - } - return; - } - - if (eventTime > SystemClock.uptimeMillis()) { - throw new IllegalArgumentException("event time must not be in the future"); - } - - final int uid = Binder.getCallingUid(); - final long ident = Binder.clearCallingIdentity(); - try { - userActivityInternal(eventTime, event, flags, uid); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - // Called from native code. private void userActivityFromNative(long eventTime, int event, int flags) { userActivityInternal(eventTime, event, flags, Process.SYSTEM_UID); @@ -942,22 +819,6 @@ public final class PowerManagerService extends IPowerManager.Stub return false; } - @Override // Binder call - public void wakeUp(long eventTime) { - if (eventTime > SystemClock.uptimeMillis()) { - throw new IllegalArgumentException("event time must not be in the future"); - } - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - wakeUpInternal(eventTime); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - // Called from native code. private void wakeUpFromNative(long eventTime) { wakeUpInternal(eventTime); @@ -1005,22 +866,6 @@ public final class PowerManagerService extends IPowerManager.Stub return true; } - @Override // Binder call - public void goToSleep(long eventTime, int reason) { - if (eventTime > SystemClock.uptimeMillis()) { - throw new IllegalArgumentException("event time must not be in the future"); - } - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - goToSleepInternal(eventTime, reason); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - // Called from native code. private void goToSleepFromNative(long eventTime, int reason) { goToSleepInternal(eventTime, reason); @@ -1083,22 +928,6 @@ public final class PowerManagerService extends IPowerManager.Stub return true; } - @Override // Binder call - public void nap(long eventTime) { - if (eventTime > SystemClock.uptimeMillis()) { - throw new IllegalArgumentException("event time must not be in the future"); - } - - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - napInternal(eventTime); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void napInternal(long eventTime) { synchronized (mLock) { if (napNoUpdateLocked(eventTime)) { @@ -1657,12 +1486,6 @@ public final class PowerManagerService extends IPowerManager.Stub | DIRTY_SETTINGS | DIRTY_SCREEN_ON_BLOCKER_RELEASED)) != 0) { int newScreenState = getDesiredScreenPowerStateLocked(); if (newScreenState != mDisplayPowerRequest.screenState) { - if (newScreenState == DisplayPowerRequest.SCREEN_STATE_OFF - && mDisplayPowerRequest.screenState - != DisplayPowerRequest.SCREEN_STATE_OFF) { - mLastScreenOffEventElapsedRealTime = SystemClock.elapsedRealtime(); - } - mDisplayPowerRequest.screenState = newScreenState; nativeSetPowerState( newScreenState != DisplayPowerRequest.SCREEN_STATE_OFF, @@ -1829,16 +1652,6 @@ public final class PowerManagerService extends IPowerManager.Stub return false; } - @Override // Binder call - public boolean isScreenOn() { - final long ident = Binder.clearCallingIdentity(); - try { - return isScreenOnInternal(); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private boolean isScreenOnInternal() { synchronized (mLock) { return !mSystemReady @@ -1883,43 +1696,6 @@ public final class PowerManagerService extends IPowerManager.Stub updatePowerStateLocked(); } - /** - * Reboots the device. - * - * @param confirm If true, shows a reboot confirmation dialog. - * @param reason The reason for the reboot, or null if none. - * @param wait If true, this call waits for the reboot to complete and does not return. - */ - @Override // Binder call - public void reboot(boolean confirm, String reason, boolean wait) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); - - final long ident = Binder.clearCallingIdentity(); - try { - shutdownOrRebootInternal(false, confirm, reason, wait); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - - /** - * Shuts down the device. - * - * @param confirm If true, shows a shutdown confirmation dialog. - * @param wait If true, this call waits for the shutdown to complete and does not return. - */ - @Override // Binder call - public void shutdown(boolean confirm, boolean wait) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); - - final long ident = Binder.clearCallingIdentity(); - try { - shutdownOrRebootInternal(true, confirm, null, wait); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void shutdownOrRebootInternal(final boolean shutdown, final boolean confirm, final String reason, boolean wait) { if (mHandler == null || !mSystemReady) { @@ -1957,22 +1733,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - /** - * Crash the runtime (causing a complete restart of the Android framework). - * Requires REBOOT permission. Mostly for testing. Should not return. - */ - @Override // Binder call - public void crash(String message) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); - - final long ident = Binder.clearCallingIdentity(); - try { - crashInternal(message); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void crashInternal(final String message) { Thread t = new Thread("PowerManagerService.crash()") { @Override @@ -1988,51 +1748,11 @@ public final class PowerManagerService extends IPowerManager.Stub } } - /** - * Set the setting that determines whether the device stays on when plugged in. - * The argument is a bit string, with each bit specifying a power source that, - * when the device is connected to that source, causes the device to stay on. - * See {@link android.os.BatteryManager} for the list of power sources that - * can be specified. Current values include {@link android.os.BatteryManager#BATTERY_PLUGGED_AC} - * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB} - * - * Used by "adb shell svc power stayon ..." - * - * @param val an {@code int} containing the bits that specify which power sources - * should cause the device to stay on. - */ - @Override // Binder call - public void setStayOnSetting(int val) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WRITE_SETTINGS, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setStayOnSettingInternal(val); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setStayOnSettingInternal(int val) { Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.STAY_ON_WHILE_PLUGGED_IN, val); } - /** - * Used by device administration to set the maximum screen off timeout. - * - * This method must only be called by the device administration policy manager. - */ - @Override // Binder call - public void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs) { - final long ident = Binder.clearCallingIdentity(); - try { - setMaximumScreenOffTimeoutFromDeviceAdminInternal(timeMs); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setMaximumScreenOffTimeoutFromDeviceAdminInternal(int timeMs) { synchronized (mLock) { mMaximumScreenOffTimeoutFromDeviceAdmin = timeMs; @@ -2046,21 +1766,6 @@ public final class PowerManagerService extends IPowerManager.Stub && mMaximumScreenOffTimeoutFromDeviceAdmin < Integer.MAX_VALUE; } - /** - * Used by the phone application to make the attention LED flash when ringing. - */ - @Override // Binder call - public void setAttentionLight(boolean on, int color) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setAttentionLightInternal(on, color); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setAttentionLightInternal(boolean on, int color) { Light light; synchronized (mLock) { @@ -2074,37 +1779,6 @@ public final class PowerManagerService extends IPowerManager.Stub light.setFlashing(color, Light.LIGHT_FLASH_HARDWARE, (on ? 3 : 0), 0); } - /** - * Used by the Watchdog. - */ - public long timeSinceScreenWasLastOn() { - synchronized (mLock) { - if (mDisplayPowerRequest.screenState != DisplayPowerRequest.SCREEN_STATE_OFF) { - return 0; - } - return SystemClock.elapsedRealtime() - mLastScreenOffEventElapsedRealTime; - } - } - - /** - * Used by the window manager to override the screen brightness based on the - * current foreground activity. - * - * This method must only be called by the window manager. - * - * @param brightness The overridden brightness, or -1 to disable the override. - */ - public void setScreenBrightnessOverrideFromWindowManager(int brightness) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setScreenBrightnessOverrideFromWindowManagerInternal(brightness); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setScreenBrightnessOverrideFromWindowManagerInternal(int brightness) { synchronized (mLock) { if (mScreenBrightnessOverrideFromWindowManager != brightness) { @@ -2115,40 +1789,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - /** - * Used by the window manager to override the button brightness based on the - * current foreground activity. - * - * This method must only be called by the window manager. - * - * @param brightness The overridden brightness, or -1 to disable the override. - */ - public void setButtonBrightnessOverrideFromWindowManager(int brightness) { - // Do nothing. - // Button lights are not currently supported in the new implementation. - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - } - - /** - * Used by the window manager to override the user activity timeout based on the - * current foreground activity. It can only be used to make the timeout shorter - * than usual, not longer. - * - * This method must only be called by the window manager. - * - * @param timeoutMillis The overridden timeout, or -1 to disable the override. - */ - public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setUserActivityTimeoutOverrideFromWindowManagerInternal(long timeoutMillis) { synchronized (mLock) { if (mUserActivityTimeoutOverrideFromWindowManager != timeoutMillis) { @@ -2159,30 +1799,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - /** - * Used by the settings application and brightness control widgets to - * temporarily override the current screen brightness setting so that the - * user can observe the effect of an intended settings change without applying - * it immediately. - * - * The override will be canceled when the setting value is next updated. - * - * @param brightness The overridden brightness. - * - * @see android.provider.Settings.System#SCREEN_BRIGHTNESS - */ - @Override // Binder call - public void setTemporaryScreenBrightnessSettingOverride(int brightness) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setTemporaryScreenBrightnessSettingOverrideInternal(brightness); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setTemporaryScreenBrightnessSettingOverrideInternal(int brightness) { synchronized (mLock) { if (mTemporaryScreenBrightnessSettingOverride != brightness) { @@ -2193,30 +1809,6 @@ public final class PowerManagerService extends IPowerManager.Stub } } - /** - * Used by the settings application and brightness control widgets to - * temporarily override the current screen auto-brightness adjustment setting so that the - * user can observe the effect of an intended settings change without applying - * it immediately. - * - * The override will be canceled when the setting value is next updated. - * - * @param adj The overridden brightness, or Float.NaN to disable the override. - * - * @see Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ - */ - @Override // Binder call - public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER, null); - - final long ident = Binder.clearCallingIdentity(); - try { - setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(adj); - } finally { - Binder.restoreCallingIdentity(ident); - } - } - private void setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(float adj) { synchronized (mLock) { // Note: This condition handles NaN because NaN is not equal to any other @@ -2238,9 +1830,10 @@ public final class PowerManagerService extends IPowerManager.Stub } /** - * Low-level function to reboot the device. On success, this function - * doesn't return. If more than 5 seconds passes from the time, - * a reboot is requested, this method returns. + * Low-level function to reboot the device. On success, this + * function doesn't return. If more than 20 seconds passes from + * the time a reboot is requested (120 seconds for reboot to + * recovery), this method returns. * * @param reason code to pass to the kernel (e.g. "recovery"), or null. */ @@ -2248,9 +1841,24 @@ public final class PowerManagerService extends IPowerManager.Stub if (reason == null) { reason = ""; } - SystemProperties.set("sys.powerctl", "reboot," + reason); + long duration; + if (reason.equals(PowerManager.REBOOT_RECOVERY)) { + // If we are rebooting to go into recovery, instead of + // setting sys.powerctl directly we'll start the + // pre-recovery service which will do some preparation for + // recovery and then reboot for us. + // + // This preparation can take more than 20 seconds if + // there's a very large update package, so lengthen the + // timeout. + SystemProperties.set("ctl.start", "pre-recovery"); + duration = 120 * 1000L; + } else { + SystemProperties.set("sys.powerctl", "reboot," + reason); + duration = 20 * 1000L; + } try { - Thread.sleep(20000); + Thread.sleep(duration); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } @@ -2263,16 +1871,7 @@ public final class PowerManagerService extends IPowerManager.Stub } } - @Override // Binder call - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP) - != PackageManager.PERMISSION_GRANTED) { - pw.println("Permission Denial: can't dump PowerManager from from pid=" - + Binder.getCallingPid() - + ", uid=" + Binder.getCallingUid()); - return; - } - + private void dumpInternal(PrintWriter pw) { pw.println("POWER MANAGER (dumpsys power)\n"); final DisplayPowerController dpc; @@ -2736,4 +2335,447 @@ public final class PowerManagerService extends IPowerManager.Stub } } } + + private final class BinderService extends IPowerManager.Stub { + @Override // Binder call + public void acquireWakeLockWithUid(IBinder lock, int flags, String tag, + String packageName, int uid) { + acquireWakeLock(lock, flags, tag, packageName, new WorkSource(uid)); + } + + @Override // Binder call + public void acquireWakeLock(IBinder lock, int flags, String tag, String packageName, + WorkSource ws) { + if (lock == null) { + throw new IllegalArgumentException("lock must not be null"); + } + if (packageName == null) { + throw new IllegalArgumentException("packageName must not be null"); + } + PowerManager.validateWakeLockParameters(flags, tag); + + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + if (ws != null && ws.size() != 0) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.UPDATE_DEVICE_STATS, null); + } else { + ws = null; + } + + final int uid = Binder.getCallingUid(); + final int pid = Binder.getCallingPid(); + final long ident = Binder.clearCallingIdentity(); + try { + acquireWakeLockInternal(lock, flags, tag, packageName, ws, uid, pid); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void releaseWakeLock(IBinder lock, int flags) { + if (lock == null) { + throw new IllegalArgumentException("lock must not be null"); + } + + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + + final long ident = Binder.clearCallingIdentity(); + try { + releaseWakeLockInternal(lock, flags); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void updateWakeLockUids(IBinder lock, int[] uids) { + WorkSource ws = null; + + if (uids != null) { + ws = new WorkSource(); + // XXX should WorkSource have a way to set uids as an int[] instead of adding them + // one at a time? + for (int i = 0; i < uids.length; i++) { + ws.add(uids[i]); + } + } + updateWakeLockWorkSource(lock, ws); + } + + @Override // Binder call + public void updateWakeLockWorkSource(IBinder lock, WorkSource ws) { + if (lock == null) { + throw new IllegalArgumentException("lock must not be null"); + } + + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.WAKE_LOCK, null); + if (ws != null && ws.size() != 0) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.UPDATE_DEVICE_STATS, null); + } else { + ws = null; + } + + final long ident = Binder.clearCallingIdentity(); + try { + updateWakeLockWorkSourceInternal(lock, ws); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public boolean isWakeLockLevelSupported(int level) { + final long ident = Binder.clearCallingIdentity(); + try { + return isWakeLockLevelSupportedInternal(level); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void userActivity(long eventTime, int event, int flags) { + final long now = SystemClock.uptimeMillis(); + if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DEVICE_POWER) + != PackageManager.PERMISSION_GRANTED) { + // Once upon a time applications could call userActivity(). + // Now we require the DEVICE_POWER permission. Log a warning and ignore the + // request instead of throwing a SecurityException so we don't break old apps. + synchronized (mLock) { + if (now >= mLastWarningAboutUserActivityPermission + (5 * 60 * 1000)) { + mLastWarningAboutUserActivityPermission = now; + Slog.w(TAG, "Ignoring call to PowerManager.userActivity() because the " + + "caller does not have DEVICE_POWER permission. " + + "Please fix your app! " + + " pid=" + Binder.getCallingPid() + + " uid=" + Binder.getCallingUid()); + } + } + return; + } + + if (eventTime > SystemClock.uptimeMillis()) { + throw new IllegalArgumentException("event time must not be in the future"); + } + + final int uid = Binder.getCallingUid(); + final long ident = Binder.clearCallingIdentity(); + try { + userActivityInternal(eventTime, event, flags, uid); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void wakeUp(long eventTime) { + if (eventTime > SystemClock.uptimeMillis()) { + throw new IllegalArgumentException("event time must not be in the future"); + } + + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + wakeUpInternal(eventTime); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void goToSleep(long eventTime, int reason) { + if (eventTime > SystemClock.uptimeMillis()) { + throw new IllegalArgumentException("event time must not be in the future"); + } + + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + goToSleepInternal(eventTime, reason); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public void nap(long eventTime) { + if (eventTime > SystemClock.uptimeMillis()) { + throw new IllegalArgumentException("event time must not be in the future"); + } + + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + napInternal(eventTime); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + public boolean isScreenOn() { + final long ident = Binder.clearCallingIdentity(); + try { + return isScreenOnInternal(); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Reboots the device. + * + * @param confirm If true, shows a reboot confirmation dialog. + * @param reason The reason for the reboot, or null if none. + * @param wait If true, this call waits for the reboot to complete and does not return. + */ + @Override // Binder call + public void reboot(boolean confirm, String reason, boolean wait) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); + if (PowerManager.REBOOT_RECOVERY.equals(reason)) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null); + } + + final long ident = Binder.clearCallingIdentity(); + try { + shutdownOrRebootInternal(false, confirm, reason, wait); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Shuts down the device. + * + * @param confirm If true, shows a shutdown confirmation dialog. + * @param wait If true, this call waits for the shutdown to complete and does not return. + */ + @Override // Binder call + public void shutdown(boolean confirm, boolean wait) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); + + final long ident = Binder.clearCallingIdentity(); + try { + shutdownOrRebootInternal(true, confirm, null, wait); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Crash the runtime (causing a complete restart of the Android framework). + * Requires REBOOT permission. Mostly for testing. Should not return. + */ + @Override // Binder call + public void crash(String message) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.REBOOT, null); + + final long ident = Binder.clearCallingIdentity(); + try { + crashInternal(message); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Set the setting that determines whether the device stays on when plugged in. + * The argument is a bit string, with each bit specifying a power source that, + * when the device is connected to that source, causes the device to stay on. + * See {@link android.os.BatteryManager} for the list of power sources that + * can be specified. Current values include + * {@link android.os.BatteryManager#BATTERY_PLUGGED_AC} + * and {@link android.os.BatteryManager#BATTERY_PLUGGED_USB} + * + * Used by "adb shell svc power stayon ..." + * + * @param val an {@code int} containing the bits that specify which power sources + * should cause the device to stay on. + */ + @Override // Binder call + public void setStayOnSetting(int val) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.WRITE_SETTINGS, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setStayOnSettingInternal(val); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Used by device administration to set the maximum screen off timeout. + * + * This method must only be called by the device administration policy manager. + */ + @Override // Binder call + public void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs) { + final long ident = Binder.clearCallingIdentity(); + try { + setMaximumScreenOffTimeoutFromDeviceAdminInternal(timeMs); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Used by the settings application and brightness control widgets to + * temporarily override the current screen brightness setting so that the + * user can observe the effect of an intended settings change without applying + * it immediately. + * + * The override will be canceled when the setting value is next updated. + * + * @param brightness The overridden brightness. + * + * @see android.provider.Settings.System#SCREEN_BRIGHTNESS + */ + @Override // Binder call + public void setTemporaryScreenBrightnessSettingOverride(int brightness) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setTemporaryScreenBrightnessSettingOverrideInternal(brightness); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Used by the settings application and brightness control widgets to + * temporarily override the current screen auto-brightness adjustment setting so that the + * user can observe the effect of an intended settings change without applying + * it immediately. + * + * The override will be canceled when the setting value is next updated. + * + * @param adj The overridden brightness, or Float.NaN to disable the override. + * + * @see Settings.System#SCREEN_AUTO_BRIGHTNESS_ADJ + */ + @Override // Binder call + public void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setTemporaryScreenAutoBrightnessAdjustmentSettingOverrideInternal(adj); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Used by the phone application to make the attention LED flash when ringing. + */ + @Override // Binder call + public void setAttentionLight(boolean on, int color) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setAttentionLightInternal(on, color); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override // Binder call + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (mContext.checkCallingOrSelfPermission(Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump PowerManager from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + final long ident = Binder.clearCallingIdentity(); + try { + dumpInternal(pw); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + } + + private final class LocalService implements PowerManagerInternal { + /** + * Used by the window manager to override the screen brightness based on the + * current foreground activity. + * + * This method must only be called by the window manager. + * + * @param brightness The overridden brightness, or -1 to disable the override. + */ + @Override + public void setScreenBrightnessOverrideFromWindowManager(int brightness) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setScreenBrightnessOverrideFromWindowManagerInternal(brightness); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + /** + * Used by the window manager to override the button brightness based on the + * current foreground activity. + * + * This method must only be called by the window manager. + * + * @param brightness The overridden brightness, or -1 to disable the override. + */ + @Override + public void setButtonBrightnessOverrideFromWindowManager(int brightness) { + // Do nothing. + // Button lights are not currently supported in the new implementation. + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + } + + /** + * Used by the window manager to override the user activity timeout based on the + * current foreground activity. It can only be used to make the timeout shorter + * than usual, not longer. + * + * This method must only be called by the window manager. + * + * @param timeoutMillis The overridden timeout, or -1 to disable the override. + */ + @Override + public void setUserActivityTimeoutOverrideFromWindowManager(long timeoutMillis) { + mContext.enforceCallingOrSelfPermission( + android.Manifest.permission.DEVICE_POWER, null); + + final long ident = Binder.clearCallingIdentity(); + try { + setUserActivityTimeoutOverrideFromWindowManagerInternal(timeoutMillis); + } finally { + Binder.restoreCallingIdentity(ident); + } + } + + @Override + public void setPolicy(WindowManagerPolicy policy) { + PowerManagerService.this.setPolicy(policy); + } + } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 7889247750c7..a45ed49b6692 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -18,8 +18,6 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.*; -import static com.android.server.am.ActivityStackSupervisor.HOME_STACK_ID; - import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import android.app.AppOpsManager; @@ -36,6 +34,8 @@ import com.android.internal.view.IInputMethodManager; import com.android.internal.view.WindowManagerPolicyThread; import com.android.server.AttributeCache; import com.android.server.EventLogTags; +import com.android.server.LocalServices; +import com.android.server.SystemService; import com.android.server.UiThread; import com.android.server.Watchdog; import com.android.server.am.BatteryStatsService; @@ -79,6 +79,7 @@ import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.PowerManager; +import android.os.PowerManagerInternal; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; @@ -535,7 +536,8 @@ public class WindowManagerService extends IWindowManager.Stub AppWindowToken mFocusedApp = null; - PowerManagerService mPowerManager; + PowerManager mPowerManager; + PowerManagerInternal mPowerManagerInternal; float mWindowAnimationScale = 1.0f; float mTransitionAnimationScale = 1.0f; @@ -695,7 +697,7 @@ public class WindowManagerService extends IWindowManager.Stub final boolean mOnlyCore; public static WindowManagerService main(final Context context, - final PowerManagerService pm, final DisplayManagerService dm, + final DisplayManagerService dm, final InputManagerService im, final Handler wmHandler, final boolean haveInputMethods, final boolean showBootMsgs, final boolean onlyCore) { @@ -703,7 +705,7 @@ public class WindowManagerService extends IWindowManager.Stub wmHandler.runWithScissors(new Runnable() { @Override public void run() { - holder[0] = new WindowManagerService(context, pm, dm, im, + holder[0] = new WindowManagerService(context, dm, im, haveInputMethods, showBootMsgs, onlyCore); } }, 0); @@ -724,7 +726,7 @@ public class WindowManagerService extends IWindowManager.Stub }, 0); } - private WindowManagerService(Context context, PowerManagerService pm, + private WindowManagerService(Context context, DisplayManagerService displayManager, InputManagerService inputManager, boolean haveInputMethods, boolean showBootMsgs, boolean onlyCore) { mContext = context; @@ -750,10 +752,11 @@ public class WindowManagerService extends IWindowManager.Stub mKeyguardDisableHandler = new KeyguardDisableHandler(mContext, mPolicy); - mPowerManager = pm; - mPowerManager.setPolicy(mPolicy); - PowerManager pmc = (PowerManager)context.getSystemService(Context.POWER_SERVICE); - mScreenFrozenLock = pmc.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN"); + mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE); + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); + mPowerManagerInternal.setPolicy(mPolicy); // TODO: register as local service instead + mScreenFrozenLock = mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, "SCREEN_FROZEN"); mScreenFrozenLock.setReferenceCounted(false); mAppTransition = new AppTransition(context, mH); @@ -783,8 +786,8 @@ public class WindowManagerService extends IWindowManager.Stub filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); mContext.registerReceiver(mBroadcastReceiver, filter); - mHoldingScreenWakeLock = pmc.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK - | PowerManager.ON_AFTER_RELEASE, TAG); + mHoldingScreenWakeLock = mPowerManager.newWakeLock( + PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG); mHoldingScreenWakeLock.setReferenceCounted(false); mAnimator = new WindowAnimator(this); @@ -3622,7 +3625,7 @@ public class WindowManagerService extends IWindowManager.Stub if (freezeThisOneIfNeeded != null) { AppWindowToken atoken = findAppWindowToken(freezeThisOneIfNeeded); if (atoken != null) { - startAppFreezingScreenLocked(atoken, ActivityInfo.CONFIG_ORIENTATION); + startAppFreezingScreenLocked(atoken); } } config = computeNewConfigurationLocked(); @@ -4403,8 +4406,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - public void startAppFreezingScreenLocked(AppWindowToken wtoken, - int configChanges) { + private void startAppFreezingScreenLocked(AppWindowToken wtoken) { if (DEBUG_ORIENTATION) { RuntimeException e = null; if (!HIDE_STACK_CRAWLS) { @@ -4453,7 +4455,7 @@ public class WindowManagerService extends IWindowManager.Stub return; } final long origId = Binder.clearCallingIdentity(); - startAppFreezingScreenLocked(wtoken, configChanges); + startAppFreezingScreenLocked(wtoken); Binder.restoreCallingIdentity(origId); } } @@ -8311,8 +8313,7 @@ public class WindowManagerService extends IWindowManager.Stub // it frozen/off until this window draws at its new // orientation. if (!okToDisplay()) { - if (DEBUG_ORIENTATION) Slog.v(TAG, - "Changing surface while display frozen: " + w); + if (DEBUG_ORIENTATION) Slog.v(TAG, "Changing surface while display frozen: " + w); w.mOrientationChanging = true; w.mLastFreezeDuration = 0; mInnerFields.mOrientationChangeComplete = false; @@ -9346,18 +9347,18 @@ public class WindowManagerService extends IWindowManager.Stub setHoldScreenLocked(mInnerFields.mHoldScreen); if (!mDisplayFrozen) { if (mInnerFields.mScreenBrightness < 0 || mInnerFields.mScreenBrightness > 1.0f) { - mPowerManager.setScreenBrightnessOverrideFromWindowManager(-1); + mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager(-1); } else { - mPowerManager.setScreenBrightnessOverrideFromWindowManager( + mPowerManagerInternal.setScreenBrightnessOverrideFromWindowManager( toBrightnessOverride(mInnerFields.mScreenBrightness)); } if (mInnerFields.mButtonBrightness < 0 || mInnerFields.mButtonBrightness > 1.0f) { - mPowerManager.setButtonBrightnessOverrideFromWindowManager(-1); + mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager(-1); } else { - mPowerManager.setButtonBrightnessOverrideFromWindowManager( + mPowerManagerInternal.setButtonBrightnessOverrideFromWindowManager( toBrightnessOverride(mInnerFields.mButtonBrightness)); } - mPowerManager.setUserActivityTimeoutOverrideFromWindowManager( + mPowerManagerInternal.setUserActivityTimeoutOverrideFromWindowManager( mInnerFields.mUserActivityTimeout); } |