Merge "AudioAttributes: unhide CREATOR" into lmp-dev
diff --git a/Android.mk b/Android.mk
index 03aa762..35d13d7 100644
--- a/Android.mk
+++ b/Android.mk
@@ -204,6 +204,7 @@
core/java/android/os/IUserManager.aidl \
core/java/android/os/IVibratorService.aidl \
core/java/android/service/notification/INotificationListener.aidl \
+ core/java/android/service/notification/IStatusBarNotificationHolder.aidl \
core/java/android/service/notification/IConditionListener.aidl \
core/java/android/service/notification/IConditionProvider.aidl \
core/java/android/print/ILayoutResultCallback.aidl \
diff --git a/api/current.txt b/api/current.txt
index 8329336..84ee18e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -8686,7 +8686,7 @@
method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getAllSessions();
method public java.util.List<android.content.pm.PackageInstaller.SessionInfo> getMySessions();
method public android.content.pm.PackageInstaller.SessionInfo getSessionInfo(int);
- method public android.content.pm.PackageInstaller.Session openSession(int);
+ method public android.content.pm.PackageInstaller.Session openSession(int) throws java.io.IOException;
method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
method public void registerSessionCallback(android.content.pm.PackageInstaller.SessionCallback, android.os.Handler);
method public void uninstall(java.lang.String, android.content.IntentSender);
@@ -8719,16 +8719,15 @@
method public java.lang.String[] getNames() throws java.io.IOException;
method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException;
method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
- method public void setProgress(float);
+ method public void setStagingProgress(float);
}
public static abstract class PackageInstaller.SessionCallback {
ctor public PackageInstaller.SessionCallback();
+ method public abstract void onActiveChanged(int, boolean);
method public abstract void onBadgingChanged(int);
- method public abstract void onClosed(int);
method public abstract void onCreated(int);
method public abstract void onFinished(int, boolean);
- method public abstract void onOpened(int);
method public abstract void onProgressChanged(int, float);
}
@@ -8741,7 +8740,7 @@
method public java.lang.String getInstallerPackageName();
method public float getProgress();
method public int getSessionId();
- method public boolean isOpen();
+ method public boolean isActive();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
@@ -12673,17 +12672,17 @@
public abstract class CameraCaptureSession implements java.lang.AutoCloseable {
ctor public CameraCaptureSession();
method public abstract void abortCaptures() throws android.hardware.camera2.CameraAccessException;
- method public abstract int capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract int captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int capture(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int captureBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract void close();
method public abstract android.hardware.camera2.CameraDevice getDevice();
- method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public abstract int setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int setRepeatingBurst(java.util.List<android.hardware.camera2.CaptureRequest>, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract int setRepeatingRequest(android.hardware.camera2.CaptureRequest, android.hardware.camera2.CameraCaptureSession.CaptureCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract void stopRepeating() throws android.hardware.camera2.CameraAccessException;
}
- public static abstract class CameraCaptureSession.CaptureListener {
- ctor public CameraCaptureSession.CaptureListener();
+ public static abstract class CameraCaptureSession.CaptureCallback {
+ ctor public CameraCaptureSession.CaptureCallback();
method public void onCaptureCompleted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.TotalCaptureResult);
method public void onCaptureFailed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureFailure);
method public void onCaptureProgressed(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, android.hardware.camera2.CaptureResult);
@@ -12692,8 +12691,8 @@
method public void onCaptureStarted(android.hardware.camera2.CameraCaptureSession, android.hardware.camera2.CaptureRequest, long);
}
- public static abstract class CameraCaptureSession.StateListener {
- ctor public CameraCaptureSession.StateListener();
+ public static abstract class CameraCaptureSession.StateCallback {
+ ctor public CameraCaptureSession.StateCallback();
method public void onActive(android.hardware.camera2.CameraCaptureSession);
method public void onClosed(android.hardware.camera2.CameraCaptureSession);
method public abstract void onConfigureFailed(android.hardware.camera2.CameraCaptureSession);
@@ -12780,7 +12779,7 @@
public abstract class CameraDevice implements java.lang.AutoCloseable {
method public abstract void close();
method public abstract android.hardware.camera2.CaptureRequest.Builder createCaptureRequest(int) throws android.hardware.camera2.CameraAccessException;
- method public abstract void createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public abstract void createCaptureSession(java.util.List<android.view.Surface>, android.hardware.camera2.CameraCaptureSession.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public abstract java.lang.String getId();
field public static final int TEMPLATE_MANUAL = 6; // 0x6
field public static final int TEMPLATE_PREVIEW = 1; // 0x1
@@ -12790,8 +12789,8 @@
field public static final int TEMPLATE_ZERO_SHUTTER_LAG = 5; // 0x5
}
- public static abstract class CameraDevice.StateListener {
- ctor public CameraDevice.StateListener();
+ public static abstract class CameraDevice.StateCallback {
+ ctor public CameraDevice.StateCallback();
method public void onClosed(android.hardware.camera2.CameraDevice);
method public abstract void onDisconnected(android.hardware.camera2.CameraDevice);
method public abstract void onError(android.hardware.camera2.CameraDevice, int);
@@ -12804,15 +12803,15 @@
}
public final class CameraManager {
- method public void addAvailabilityListener(android.hardware.camera2.CameraManager.AvailabilityListener, android.os.Handler);
method public android.hardware.camera2.CameraCharacteristics getCameraCharacteristics(java.lang.String) throws android.hardware.camera2.CameraAccessException;
method public java.lang.String[] getCameraIdList() throws android.hardware.camera2.CameraAccessException;
- method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateListener, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
- method public void removeAvailabilityListener(android.hardware.camera2.CameraManager.AvailabilityListener);
+ method public void openCamera(java.lang.String, android.hardware.camera2.CameraDevice.StateCallback, android.os.Handler) throws android.hardware.camera2.CameraAccessException;
+ method public void registerAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback, android.os.Handler);
+ method public void unregisterAvailabilityCallback(android.hardware.camera2.CameraManager.AvailabilityCallback);
}
- public static abstract class CameraManager.AvailabilityListener {
- ctor public CameraManager.AvailabilityListener();
+ public static abstract class CameraManager.AvailabilityCallback {
+ ctor public CameraManager.AvailabilityCallback();
method public void onCameraAvailable(java.lang.String);
method public void onCameraUnavailable(java.lang.String);
}
@@ -14711,7 +14710,7 @@
public static final class MediaCodecInfo.CodecCapabilities {
ctor public MediaCodecInfo.CodecCapabilities();
- method public static android.media.MediaCodecInfo.CodecCapabilities CreateFromProfileLevel(java.lang.String, int, int);
+ method public static android.media.MediaCodecInfo.CodecCapabilities createFromProfileLevel(java.lang.String, int, int);
method public android.media.MediaCodecInfo.AudioCapabilities getAudioCapabilities();
method public android.media.MediaFormat getDefaultFormat();
method public android.media.MediaCodecInfo.EncoderCapabilities getEncoderCapabilities();
@@ -16727,10 +16726,10 @@
}
public final class TvInputInfo implements android.os.Parcelable {
+ method public android.content.Intent createSettingsIntent();
+ method public android.content.Intent createSetupIntent();
method public int describeContents();
method public java.lang.String getId();
- method public android.content.Intent getIntentForSettingsActivity();
- method public android.content.Intent getIntentForSetupActivity();
method public java.lang.String getParentId();
method public android.content.pm.ServiceInfo getServiceInfo();
method public int getType();
@@ -16738,7 +16737,8 @@
method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
method public java.lang.CharSequence loadLabel(android.content.Context);
method public void writeToParcel(android.os.Parcel, int);
- field public static final java.lang.String EXTRA_INPUT_ID = "inputId";
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final java.lang.String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
field public static final int TYPE_COMPONENT = 1004; // 0x3ec
field public static final int TYPE_COMPOSITE = 1001; // 0x3e9
field public static final int TYPE_DISPLAY_PORT = 1008; // 0x3f0
@@ -16757,23 +16757,23 @@
method public java.util.List<android.media.tv.TvInputInfo> getTvInputList();
method public boolean isParentalControlsEnabled();
method public boolean isRatingBlocked(android.media.tv.TvContentRating);
- method public void registerListener(android.media.tv.TvInputManager.TvInputListener, android.os.Handler);
- method public void unregisterListener(android.media.tv.TvInputManager.TvInputListener);
- field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED";
- field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED";
- field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.TvInputManager.ACTION_QUERY_CONTENT_RATING_SYSTEMS";
+ method public void registerCallback(android.media.tv.TvInputManager.TvInputCallback, android.os.Handler);
+ method public void unregisterCallback(android.media.tv.TvInputManager.TvInputCallback);
+ field public static final java.lang.String ACTION_BLOCKED_RATINGS_CHANGED = "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
+ field public static final java.lang.String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED = "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
+ field public static final java.lang.String ACTION_QUERY_CONTENT_RATING_SYSTEMS = "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
field public static final int INPUT_STATE_CONNECTED = 0; // 0x0
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
- field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.TvInputManager.META_DATA_CONTENT_RATING_SYSTEMS";
+ field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
field public static final int VIDEO_UNAVAILABLE_REASON_BUFFERING = 3; // 0x3
field public static final int VIDEO_UNAVAILABLE_REASON_TUNING = 1; // 0x1
field public static final int VIDEO_UNAVAILABLE_REASON_UNKNOWN = 0; // 0x0
field public static final int VIDEO_UNAVAILABLE_REASON_WEAK_SIGNAL = 2; // 0x2
}
- public static abstract class TvInputManager.TvInputListener {
- ctor public TvInputManager.TvInputListener();
+ public static abstract class TvInputManager.TvInputCallback {
+ ctor public TvInputManager.TvInputCallback();
method public void onInputAdded(java.lang.String);
method public void onInputRemoved(java.lang.String);
method public void onInputStateChanged(java.lang.String, int);
@@ -16864,10 +16864,10 @@
method public boolean onUnhandledInputEvent(android.view.InputEvent);
method public void reset();
method public void selectTrack(int, java.lang.String);
+ method public void setCallback(android.media.tv.TvView.TvInputCallback);
method public void setCaptionEnabled(boolean);
method public void setOnUnhandledInputEventListener(android.media.tv.TvView.OnUnhandledInputEventListener);
method public void setStreamVolume(float);
- method public void setTvInputListener(android.media.tv.TvView.TvInputListener);
method public void tune(java.lang.String, android.net.Uri);
}
@@ -16875,8 +16875,8 @@
method public abstract boolean onUnhandledInputEvent(android.view.InputEvent);
}
- public static abstract class TvView.TvInputListener {
- ctor public TvView.TvInputListener();
+ public static abstract class TvView.TvInputCallback {
+ ctor public TvView.TvInputCallback();
method public void onChannelRetuned(java.lang.String, android.net.Uri);
method public void onConnectionFailed(java.lang.String);
method public void onContentAllowed(java.lang.String);
@@ -28410,7 +28410,7 @@
}
public final class RemoteConference {
- method public final void addListener(android.telecomm.RemoteConference.Listener);
+ method public final void addCallback(android.telecomm.RemoteConference.Callback);
method public void disconnect();
method public final int getCallCapabilities();
method public final java.util.List<android.telecomm.RemoteConnection> getConnections();
@@ -28418,13 +28418,13 @@
method public java.lang.String getDisconnectMessage();
method public final int getState();
method public void hold();
- method public final void removeListener(android.telecomm.RemoteConference.Listener);
+ method public final void removeCallback(android.telecomm.RemoteConference.Callback);
method public void separate(android.telecomm.RemoteConnection);
method public void unhold();
}
- public static abstract class RemoteConference.Listener {
- ctor public RemoteConference.Listener();
+ public static abstract class RemoteConference.Callback {
+ ctor public RemoteConference.Callback();
method public void onCapabilitiesChanged(android.telecomm.RemoteConference, int);
method public void onConnectionAdded(android.telecomm.RemoteConference, android.telecomm.RemoteConnection);
method public void onConnectionRemoved(android.telecomm.RemoteConference, android.telecomm.RemoteConnection);
@@ -28515,17 +28515,17 @@
method public void registerPhoneAccount(android.telecomm.PhoneAccount);
method public void showInCallScreen(boolean);
method public void unregisterPhoneAccount(android.telecomm.PhoneAccountHandle);
- field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecomm.intent.action.CHANGE_PHONE_ACCOUNTS";
- field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.intent.action.CONNECTION_SERVICE_CONFIGURE";
- field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecomm.intent.action.SHOW_CALL_SETTINGS";
+ field public static final java.lang.String ACTION_CHANGE_PHONE_ACCOUNTS = "android.telecomm.action.CHANGE_PHONE_ACCOUNTS";
+ field public static final java.lang.String ACTION_CONNECTION_SERVICE_CONFIGURE = "android.telecomm.action.CONNECTION_SERVICE_CONFIGURE";
+ field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecomm.action.SHOW_CALL_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecomm.extra.CALL_BACK_NUMBER";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecomm.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecomm.extra.CALL_DISCONNECT_MESSAGE";
field public static final java.lang.String EXTRA_CONNECTION_SERVICE = "android.telecomm.extra.CONNECTION_SERVICE";
- field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.intent.extra.PHONE_ACCOUNT_HANDLE";
- field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.intent.extra.START_CALL_WITH_SPEAKERPHONE";
+ field public static final java.lang.String EXTRA_PHONE_ACCOUNT_HANDLE = "android.telecomm.extra.PHONE_ACCOUNT_HANDLE";
+ field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecomm.extra.START_CALL_WITH_SPEAKERPHONE";
}
}
diff --git a/api/removed.txt b/api/removed.txt
index 0aa6d54..a272cf4 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -6,14 +6,6 @@
}
-package android.app {
-
- public class KeyguardManager {
- method public android.content.Intent getConfirmDeviceCredentialIntent(java.lang.CharSequence, java.lang.CharSequence);
- }
-
-}
-
package android.media {
public class AudioFormat {
diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java
index e055237..cc9aed8 100644
--- a/core/java/android/app/KeyguardManager.java
+++ b/core/java/android/app/KeyguardManager.java
@@ -56,13 +56,6 @@
public static final String EXTRA_DESCRIPTION = "android.app.extra.DESCRIPTION";
/**
- * @removed
- */
- public Intent getConfirmDeviceCredentialIntent(CharSequence title, CharSequence description) {
- return createConfirmDeviceCredentialIntent(title, description);
- }
-
- /**
* Get an intent to prompt the user to confirm credentials (pin, pattern or password)
* for the current user of the device. The caller is expected to launch this activity using
* {@link android.app.Activity#startActivityForResult(Intent, int)} and check for
diff --git a/core/java/android/content/pm/IPackageInstallerCallback.aidl b/core/java/android/content/pm/IPackageInstallerCallback.aidl
index fe98ee7..974eb1e 100644
--- a/core/java/android/content/pm/IPackageInstallerCallback.aidl
+++ b/core/java/android/content/pm/IPackageInstallerCallback.aidl
@@ -20,8 +20,7 @@
oneway interface IPackageInstallerCallback {
void onSessionCreated(int sessionId);
void onSessionBadgingChanged(int sessionId);
- void onSessionOpened(int sessionId);
+ void onSessionActiveChanged(int sessionId, boolean active);
void onSessionProgressChanged(int sessionId, float progress);
- void onSessionClosed(int sessionId);
void onSessionFinished(int sessionId, boolean success);
}
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 7c34a65..0a211cf 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -304,9 +304,12 @@
* Open an existing session to actively perform work. To succeed, the caller
* must be the owner of the install session.
*/
- public @NonNull Session openSession(int sessionId) {
+ public @NonNull Session openSession(int sessionId) throws IOException {
try {
return new Session(mInstaller.openSession(sessionId));
+ } catch (RuntimeException e) {
+ ExceptionUtils.maybeUnwrapIOException(e);
+ throw e;
} catch (RemoteException e) {
throw e.rethrowAsRuntimeException();
}
@@ -363,7 +366,7 @@
public @NonNull List<SessionInfo> getAllSessions() {
final ApplicationInfo info = mContext.getApplicationInfo();
if ("com.google.android.googlequicksearchbox".equals(info.packageName)
- && info.versionCode <= 300400070) {
+ && info.versionCode <= 300400110) {
Log.d(TAG, "Ignoring callback request from old prebuilt");
return Collections.EMPTY_LIST;
}
@@ -436,27 +439,32 @@
public abstract void onBadgingChanged(int sessionId);
/**
- * Session has been opened. A session is usually opened when the
- * installer is actively writing data.
+ * Active state for session has been changed.
+ * <p>
+ * A session is considered active whenever there is ongoing forward
+ * progress being made, such as the installer holding an open
+ * {@link Session} instance while streaming data into place, or the
+ * system optimizing code as the result of
+ * {@link Session#commit(IntentSender)}.
+ * <p>
+ * If the installer closes the {@link Session} without committing, the
+ * session is considered inactive until the installer opens the session
+ * again.
*/
- public abstract void onOpened(int sessionId);
+ public abstract void onActiveChanged(int sessionId, boolean active);
/**
* Progress for given session has been updated.
* <p>
* Note that this progress may not directly correspond to the value
- * reported by {@link PackageInstaller.Session#setProgress(float)}, as
- * the system may carve out a portion of the overall progress to
- * represent its own internal installation work.
+ * reported by
+ * {@link PackageInstaller.Session#setStagingProgress(float)}, as the
+ * system may carve out a portion of the overall progress to represent
+ * its own internal installation work.
*/
public abstract void onProgressChanged(int sessionId, float progress);
/**
- * Session has been closed.
- */
- public abstract void onClosed(int sessionId);
-
- /**
* Session has completely finished, either with success or failure.
*/
public abstract void onFinished(int sessionId, boolean success);
@@ -467,10 +475,9 @@
Handler.Callback {
private static final int MSG_SESSION_CREATED = 1;
private static final int MSG_SESSION_BADGING_CHANGED = 2;
- private static final int MSG_SESSION_OPENED = 3;
+ private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
private static final int MSG_SESSION_PROGRESS_CHANGED = 4;
- private static final int MSG_SESSION_CLOSED = 5;
- private static final int MSG_SESSION_FINISHED = 6;
+ private static final int MSG_SESSION_FINISHED = 5;
final SessionCallback mCallback;
final Handler mHandler;
@@ -482,24 +489,23 @@
@Override
public boolean handleMessage(Message msg) {
+ final int sessionId = msg.arg1;
switch (msg.what) {
case MSG_SESSION_CREATED:
- mCallback.onCreated(msg.arg1);
+ mCallback.onCreated(sessionId);
return true;
case MSG_SESSION_BADGING_CHANGED:
- mCallback.onBadgingChanged(msg.arg1);
+ mCallback.onBadgingChanged(sessionId);
return true;
- case MSG_SESSION_OPENED:
- mCallback.onOpened(msg.arg1);
+ case MSG_SESSION_ACTIVE_CHANGED:
+ final boolean active = msg.arg2 != 0;
+ mCallback.onActiveChanged(sessionId, active);
return true;
case MSG_SESSION_PROGRESS_CHANGED:
- mCallback.onProgressChanged(msg.arg1, (float) msg.obj);
- return true;
- case MSG_SESSION_CLOSED:
- mCallback.onClosed(msg.arg1);
+ mCallback.onProgressChanged(sessionId, (float) msg.obj);
return true;
case MSG_SESSION_FINISHED:
- mCallback.onFinished(msg.arg1, msg.arg2 != 0);
+ mCallback.onFinished(sessionId, msg.arg2 != 0);
return true;
}
return false;
@@ -516,8 +522,9 @@
}
@Override
- public void onSessionOpened(int sessionId) {
- mHandler.obtainMessage(MSG_SESSION_OPENED, sessionId, 0).sendToTarget();
+ public void onSessionActiveChanged(int sessionId, boolean active) {
+ mHandler.obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, active ? 1 : 0)
+ .sendToTarget();
}
@Override
@@ -527,11 +534,6 @@
}
@Override
- public void onSessionClosed(int sessionId) {
- mHandler.obtainMessage(MSG_SESSION_CLOSED, sessionId, 0).sendToTarget();
- }
-
- @Override
public void onSessionFinished(int sessionId, boolean success) {
mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
.sendToTarget();
@@ -567,7 +569,7 @@
// TODO: remove this temporary guard once we have new prebuilts
final ApplicationInfo info = mContext.getApplicationInfo();
if ("com.google.android.googlequicksearchbox".equals(info.packageName)
- && info.versionCode <= 300400070) {
+ && info.versionCode <= 300400110) {
Log.d(TAG, "Ignoring callback request from old prebuilt");
return;
}
@@ -629,10 +631,22 @@
mSession = session;
}
- /**
- * Set current progress. Valid values are anywhere between 0 and 1.
- */
+ /** {@hide} */
+ @Deprecated
public void setProgress(float progress) {
+ setStagingProgress(progress);
+ }
+
+ /**
+ * Set current progress of staging this session. Valid values are
+ * anywhere between 0 and 1.
+ * <p>
+ * Note that this progress may not directly correspond to the value
+ * reported by {@link SessionCallback#onProgressChanged(int, float)}, as
+ * the system may carve out a portion of the overall progress to
+ * represent its own internal installation work.
+ */
+ public void setStagingProgress(float progress) {
try {
mSession.setClientProgress(progress);
} catch (RemoteException e) {
@@ -986,7 +1000,7 @@
/** {@hide} */
public boolean sealed;
/** {@hide} */
- public boolean open;
+ public boolean active;
/** {@hide} */
public int mode;
@@ -1010,7 +1024,7 @@
resolvedBaseCodePath = source.readString();
progress = source.readFloat();
sealed = source.readInt() != 0;
- open = source.readInt() != 0;
+ active = source.readInt() != 0;
mode = source.readInt();
sizeBytes = source.readLong();
@@ -1036,20 +1050,37 @@
/**
* Return current overall progress of this session, between 0 and 1.
* <p>
- * Note that this progress may not directly correspond to the value reported
- * by {@link PackageInstaller.Session#setProgress(float)}, as the system may
- * carve out a portion of the overall progress to represent its own internal
- * installation work.
+ * Note that this progress may not directly correspond to the value
+ * reported by
+ * {@link PackageInstaller.Session#setStagingProgress(float)}, as the
+ * system may carve out a portion of the overall progress to represent
+ * its own internal installation work.
*/
public float getProgress() {
return progress;
}
/**
- * Return if this session is currently open.
+ * Return if this session is currently active.
+ * <p>
+ * A session is considered active whenever there is ongoing forward
+ * progress being made, such as the installer holding an open
+ * {@link Session} instance while streaming data into place, or the
+ * system optimizing code as the result of
+ * {@link Session#commit(IntentSender)}.
+ * <p>
+ * If the installer closes the {@link Session} without committing, the
+ * session is considered inactive until the installer opens the session
+ * again.
*/
+ public boolean isActive() {
+ return active;
+ }
+
+ /** {@hide} */
+ @Deprecated
public boolean isOpen() {
- return open;
+ return isActive();
}
/**
@@ -1105,7 +1136,7 @@
dest.writeString(resolvedBaseCodePath);
dest.writeFloat(progress);
dest.writeInt(sealed ? 1 : 0);
- dest.writeInt(open ? 1 : 0);
+ dest.writeInt(active ? 1 : 0);
dest.writeInt(mode);
dest.writeLong(sizeBytes);
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index b52a0c5..f514e42 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -737,12 +737,11 @@
}
/**
- * This value is defined only for continuous mode sensors. It is the delay between two
- * sensor events corresponding to the lowest frequency that this sensor supports. When
- * lower frequencies are requested through registerListener() the events will be generated
- * at this frequency instead. It can be used to estimate when the batch FIFO may be full.
- * Older devices may set this value to zero. Ignore this value in case it is negative
- * or zero.
+ * This value is defined only for continuous and on-change sensors. It is the delay between two
+ * sensor events corresponding to the lowest frequency that this sensor supports. When lower
+ * frequencies are requested through registerListener() the events will be generated at this
+ * frequency instead. It can be used to estimate when the batch FIFO may be full. Older devices
+ * may set this value to zero. Ignore this value in case it is negative or zero.
*
* @return The max delay for this sensor in microseconds.
*/
diff --git a/core/java/android/hardware/camera2/CameraAccessException.java b/core/java/android/hardware/camera2/CameraAccessException.java
index ca71e81..91ef6ca 100644
--- a/core/java/android/hardware/camera2/CameraAccessException.java
+++ b/core/java/android/hardware/camera2/CameraAccessException.java
@@ -61,7 +61,7 @@
*
* <p>The camera has failed to open or has failed at a later time
* as a result of some non-user interaction. Refer to
- * {@link CameraDevice.StateListener#onError} for the exact
+ * {@link CameraDevice.StateCallback#onError} for the exact
* nature of the error.</p>
*
* <p>No further calls to the camera will succeed. Clean up
diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java
index fc2141f..29e42ea 100644
--- a/core/java/android/hardware/camera2/CameraCaptureSession.java
+++ b/core/java/android/hardware/camera2/CameraCaptureSession.java
@@ -32,18 +32,18 @@
* sending images to the desired targets. Therefore the setup is done asynchronously, and
* {@link CameraDevice#createCaptureSession createCaptureSession} will send the ready-to-use
* CameraCaptureSession to the provided listener's
- * {@link CameraCaptureSession.StateListener#onConfigured onConfigured} callback. If configuration
+ * {@link CameraCaptureSession.StateCallback#onConfigured onConfigured} callback. If configuration
* cannot be completed, then the
- * {@link CameraCaptureSession.StateListener#onConfigureFailed onConfigureFailed} is called, and the
+ * {@link CameraCaptureSession.StateCallback#onConfigureFailed onConfigureFailed} is called, and the
* session will not become active.</p>
*<!--
* <p>Any capture requests (repeating or non-repeating) submitted before the session is ready will
* be queued up and will begin capture once the session becomes ready. In case the session cannot be
- * configured and {@link StateListener#onConfigureFailed onConfigureFailed} is called, all queued
+ * configured and {@link StateCallback#onConfigureFailed onConfigureFailed} is called, all queued
* capture requests are discarded.</p>
*-->
* <p>If a new session is created by the camera device, then the previous session is closed, and its
- * associated {@link StateListener#onClosed onClosed} callback will be invoked. All
+ * associated {@link StateCallback#onClosed onClosed} callback will be invoked. All
* of the session methods will throw an IllegalStateException if called once the session is
* closed.</p>
*
@@ -86,7 +86,7 @@
* looper}.
*
* @return int A unique capture sequence ID used by
- * {@link CaptureListener#onCaptureSequenceCompleted}.
+ * {@link CaptureCallback#onCaptureSequenceCompleted}.
*
* @throws CameraAccessException if the camera device is no longer connected or has
* encountered a fatal error
@@ -103,7 +103,7 @@
* @see #setRepeatingBurst
* @see #abortCaptures
*/
- public abstract int capture(CaptureRequest request, CaptureListener listener, Handler handler)
+ public abstract int capture(CaptureRequest request, CaptureCallback listener, Handler handler)
throws CameraAccessException;
/**
@@ -131,7 +131,7 @@
* looper}.
*
* @return int A unique capture sequence ID used by
- * {@link CaptureListener#onCaptureSequenceCompleted}.
+ * {@link CaptureCallback#onCaptureSequenceCompleted}.
*
* @throws CameraAccessException if the camera device is no longer connected or has
* encountered a fatal error
@@ -147,7 +147,7 @@
* @see #setRepeatingBurst
* @see #abortCaptures
*/
- public abstract int captureBurst(List<CaptureRequest> requests, CaptureListener listener,
+ public abstract int captureBurst(List<CaptureRequest> requests, CaptureCallback listener,
Handler handler) throws CameraAccessException;
/**
@@ -185,7 +185,7 @@
* looper}.
*
* @return int A unique capture sequence ID used by
- * {@link CaptureListener#onCaptureSequenceCompleted}.
+ * {@link CaptureCallback#onCaptureSequenceCompleted}.
*
* @throws CameraAccessException if the camera device is no longer connected or has
* encountered a fatal error
@@ -203,7 +203,7 @@
* @see #stopRepeating
* @see #abortCaptures
*/
- public abstract int setRepeatingRequest(CaptureRequest request, CaptureListener listener,
+ public abstract int setRepeatingRequest(CaptureRequest request, CaptureCallback listener,
Handler handler) throws CameraAccessException;
/**
@@ -245,7 +245,7 @@
* looper}.
*
* @return int A unique capture sequence ID used by
- * {@link CaptureListener#onCaptureSequenceCompleted}.
+ * {@link CaptureCallback#onCaptureSequenceCompleted}.
*
* @throws CameraAccessException if the camera device is no longer connected or has
* encountered a fatal error
@@ -263,7 +263,7 @@
* @see #stopRepeating
* @see #abortCaptures
*/
- public abstract int setRepeatingBurst(List<CaptureRequest> requests, CaptureListener listener,
+ public abstract int setRepeatingBurst(List<CaptureRequest> requests, CaptureCallback listener,
Handler handler) throws CameraAccessException;
/**
@@ -274,7 +274,7 @@
*
* <p>Any currently in-flight captures will still complete, as will any burst that is
* mid-capture. To ensure that the device has finished processing all of its capture requests
- * and is in ready state, wait for the {@link StateListener#onReady} callback after
+ * and is in ready state, wait for the {@link StateCallback#onReady} callback after
* calling this method.</p>
*
* @throws CameraAccessException if the camera device is no longer connected or has
@@ -285,7 +285,7 @@
*
* @see #setRepeatingRequest
* @see #setRepeatingBurst
- * @see StateListener#onIdle
+ * @see StateCallback#onIdle
*/
public abstract void stopRepeating() throws CameraAccessException;
@@ -293,15 +293,15 @@
* Discard all captures currently pending and in-progress as fast as possible.
*
* <p>The camera device will discard all of its current work as fast as possible. Some in-flight
- * captures may complete successfully and call {@link CaptureListener#onCaptureCompleted}, while
- * others will trigger their {@link CaptureListener#onCaptureFailed} callbacks. If a repeating
+ * captures may complete successfully and call {@link CaptureCallback#onCaptureCompleted}, while
+ * others will trigger their {@link CaptureCallback#onCaptureFailed} callbacks. If a repeating
* request or a repeating burst is set, it will be cleared.</p>
*
* <p>This method is the fastest way to switch the camera device to a new session with
* {@link CameraDevice#createCaptureSession}, at the cost of discarding in-progress work. It
* must be called before the new session is created. Once all pending requests are either
- * completed or thrown away, the {@link StateListener#onReady} callback will be called,
- * if the session has not been closed. Otherwise, the {@link StateListener#onClosed}
+ * completed or thrown away, the {@link StateCallback#onReady} callback will be called,
+ * if the session has not been closed. Otherwise, the {@link StateCallback#onClosed}
* callback will be fired when a new session is created by the camera device.</p>
*
* <p>Cancelling will introduce at least a brief pause in the stream of data from the camera
@@ -332,7 +332,7 @@
*
* <p>Note that creating a new capture session with {@link CameraDevice#createCaptureSession}
* will close any existing capture session automatically, and call the older session listener's
- * {@link StateListener#onClosed} callback. Using {@link CameraDevice#createCaptureSession}
+ * {@link StateCallback#onClosed} callback. Using {@link CameraDevice#createCaptureSession}
* directly without closing is the recommended approach for quickly switching to a new session,
* since unchanged target outputs can be reused more efficiently.</p>
*
@@ -340,7 +340,7 @@
* repeating requests or bursts are stopped (as if {@link #stopRepeating()} was called).
* However, any in-progress capture requests submitted to the session will be completed as
* normal; once all captures have completed and the session has been torn down,
- * {@link StateListener#onClosed} will be called.</p>
+ * {@link StateCallback#onClosed} will be called.</p>
*
* <p>Closing a session is idempotent; closing more than once has no effect.</p>
*/
@@ -348,10 +348,10 @@
public abstract void close();
/**
- * A listener for tracking the state of a camera capture session.
+ * A callback object for receiving updates about the state of a camera capture session.
*
*/
- public static abstract class StateListener {
+ public static abstract class StateCallback {
/**
* This method is called when the camera device has finished configuring itself, and the
@@ -439,10 +439,17 @@
}
/**
- * <p>A listener for tracking the progress of a {@link CaptureRequest}
- * submitted to the camera device.</p>
+ * Temporary for migrating to Callback naming
+ * @hide
+ */
+ public static abstract class StateListener extends StateCallback {
+ }
+
+ /**
+ * <p>A callback object for tracking the progress of a {@link CaptureRequest} submitted to the
+ * camera device.</p>
*
- * <p>This listener is called when a request triggers a capture to start,
+ * <p>This callback is invoked when a request triggers a capture to start,
* and when the capture is complete. In case on an error capturing an image,
* the error method is triggered instead of the completion method.</p>
*
@@ -451,7 +458,7 @@
* @see #setRepeatingRequest
* @see #setRepeatingBurst
*/
- public static abstract class CaptureListener {
+ public static abstract class CaptureCallback {
/**
* This constant is used to indicate that no images were captured for
@@ -625,7 +632,7 @@
}
/**
- * This method is called independently of the others in CaptureListener,
+ * This method is called independently of the others in CaptureCallback,
* when a capture sequence finishes and all {@link CaptureResult}
* or {@link CaptureFailure} for it have been returned via this listener.
*
@@ -655,7 +662,7 @@
}
/**
- * This method is called independently of the others in CaptureListener,
+ * This method is called independently of the others in CaptureCallback,
* when a capture sequence aborts before any {@link CaptureResult}
* or {@link CaptureFailure} for it have been returned via this listener.
*
@@ -684,4 +691,11 @@
}
}
+ /**
+ * Temporary for migrating to Callback naming
+ * @hide
+ */
+ public static abstract class CaptureListener extends CaptureCallback {
+ }
+
}
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 097b430..0bb742c 100644
--- a/core/java/android/hardware/camera2/CameraDevice.java
+++ b/core/java/android/hardware/camera2/CameraDevice.java
@@ -199,8 +199,8 @@
* <p>It can take several hundred milliseconds for the session's configuration to complete,
* since camera hardware may need to be powered on or reconfigured. Once the configuration is
* complete and the session is ready to actually capture data, the provided
- * {@link CameraCaptureSession.StateListener}'s
- * {@link CameraCaptureSession.StateListener#onConfigured} callback will be called.</p>
+ * {@link CameraCaptureSession.StateCallback}'s
+ * {@link CameraCaptureSession.StateCallback#onConfigured} callback will be called.</p>
*
* <p>If a prior CameraCaptureSession already exists when a new one is created, the previous
* session is closed. Any in-progress capture requests made on the prior session will be
@@ -340,12 +340,12 @@
*
* @param outputs The new set of Surfaces that should be made available as
* targets for captured image data.
- * @param listener The listener to notify about the status of the new capture session.
- * @param handler The handler on which the listener should be invoked, or {@code null} to use
+ * @param callback The callback to notify about the status of the new capture session.
+ * @param handler The handler on which the callback should be invoked, or {@code null} to use
* the current thread's {@link android.os.Looper looper}.
*
* @throws IllegalArgumentException if the set of output Surfaces do not meet the requirements,
- * the listener is null, or the handler is null but the current
+ * the callback is null, or the handler is null but the current
* thread has no looper.
* @throws CameraAccessException if the camera device is no longer connected or has
* encountered a fatal error
@@ -357,7 +357,7 @@
* @see StreamConfigurationMap#getOutputSizes(Class)
*/
public abstract void createCaptureSession(List<Surface> outputs,
- CameraCaptureSession.StateListener listener, Handler handler)
+ CameraCaptureSession.StateCallback callback, Handler handler)
throws CameraAccessException;
/**
@@ -393,10 +393,10 @@
*
* <p>Immediately after this call, all calls to the camera device or active session interface
* will throw a {@link IllegalStateException}, except for calls to close(). Once the device has
- * fully shut down, the {@link StateListener#onClosed} callback will be called, and the camera
+ * fully shut down, the {@link StateCallback#onClosed} callback will be called, and the camera
* is free to be re-opened.</p>
*
- * <p>Immediately after this call, besides the final {@link StateListener#onClosed} calls, no
+ * <p>Immediately after this call, besides the final {@link StateCallback#onClosed} calls, no
* further callbacks from the device or the active session will occur, and any remaining
* submitted capture requests will be discarded, as if
* {@link CameraCaptureSession#abortCaptures} had been called, except that no success or failure
@@ -407,24 +407,24 @@
public abstract void close();
/**
- * A listener for notifications about the state of a camera
- * device.
+ * A callback objects for receiving updates about the state of a camera device.
*
- * <p>A listener must be provided to the {@link CameraManager#openCamera}
- * method to open a camera device.</p>
+ * <p>A callback instance must be provided to the {@link CameraManager#openCamera} method to
+ * open a camera device.</p>
*
- * <p>These events include notifications about the device completing startup (
+ * <p>These state updates include notifications about the device completing startup (
* allowing for {@link #createCaptureSession} to be called), about device
* disconnection or closure, and about unexpected device errors.</p>
*
* <p>Events about the progress of specific {@link CaptureRequest CaptureRequests} are provided
- * through a {@link CameraCaptureSession.CaptureListener} given to the
+ * through a {@link CameraCaptureSession.CaptureCallback} given to the
* {@link CameraCaptureSession#capture}, {@link CameraCaptureSession#captureBurst},
- * {@link CameraCaptureSession#setRepeatingRequest}, or {@link CameraCaptureSession#setRepeatingBurst} methods.
+ * {@link CameraCaptureSession#setRepeatingRequest}, or
+ * {@link CameraCaptureSession#setRepeatingBurst} methods.
*
* @see CameraManager#openCamera
*/
- public static abstract class StateListener {
+ public static abstract class StateCallback {
/**
* An error code that can be reported by {@link #onError}
* indicating that the camera device is in use already.
@@ -530,7 +530,7 @@
* of a removable camera device; or the camera being needed for a
* higher-priority use case.</p>
*
- * <p>There may still be capture listener callbacks that are called
+ * <p>There may still be capture callbacks that are invoked
* after this method is called, or new image buffers that are delivered
* to active outputs.</p>
*
@@ -539,7 +539,7 @@
*
* <p>You should clean up the camera with {@link CameraDevice#close} after
* this happens, as it is not recoverable until opening the camera again
- * after it becomes {@link CameraManager.AvailabilityListener#onCameraAvailable available}.
+ * after it becomes {@link CameraManager.AvailabilityCallback#onCameraAvailable available}.
* </p>
*
* @param camera the device that has been disconnected
@@ -558,7 +558,7 @@
* {@link CameraAccessException#CAMERA_ERROR CAMERA_ERROR} reason.
* </p>
*
- * <p>There may still be capture completion or camera stream listeners
+ * <p>There may still be capture completion or camera stream callbacks
* that will be called after this error is received.</p>
*
* <p>You should clean up the camera with {@link CameraDevice#close} after
@@ -566,7 +566,7 @@
*
* @param camera The device reporting the error
* @param error The error code, one of the
- * {@code StateListener.ERROR_*} values.
+ * {@code StateCallback.ERROR_*} values.
*
* @see #ERROR_CAMERA_DEVICE
* @see #ERROR_CAMERA_SERVICE
@@ -577,6 +577,13 @@
}
/**
+ * Temporary for migrating to Callback naming
+ * @hide
+ */
+ public static abstract class StateListener extends StateCallback {
+ }
+
+ /**
* To be inherited by android.hardware.camera2.* code only.
* @hide
*/
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index a4a1559..9a9e4c2 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -69,8 +69,8 @@
private ArrayList<String> mDeviceIdList;
- private final ArrayMap<AvailabilityListener, Handler> mListenerMap =
- new ArrayMap<AvailabilityListener, Handler>();
+ private final ArrayMap<AvailabilityCallback, Handler> mCallbackMap =
+ new ArrayMap<AvailabilityCallback, Handler>();
private final Context mContext;
private final Object mLock = new Object();
@@ -108,19 +108,19 @@
}
/**
- * Register a listener to be notified about camera device availability.
+ * Register a callback to be notified about camera device availability.
*
- * <p>Registering the same listener again will replace the handler with the
+ * <p>Registering the same callback again will replace the handler with the
* new one provided.</p>
*
- * <p>The first time a listener is registered, it is immediately called
+ * <p>The first time a callback is registered, it is immediately called
* with the availability status of all currently known camera devices.</p>
*
- * @param listener The new listener to send camera availability notices to
- * @param handler The handler on which the listener should be invoked, or
+ * @param callback the new callback to send camera availability notices to
+ * @param handler The handler on which the callback should be invoked, or
* {@code null} to use the current thread's {@link android.os.Looper looper}.
*/
- public void addAvailabilityListener(AvailabilityListener listener, Handler handler) {
+ public void registerAvailabilityCallback(AvailabilityCallback callback, Handler handler) {
if (handler == null) {
Looper looper = Looper.myLooper();
if (looper == null) {
@@ -131,25 +131,25 @@
}
synchronized (mLock) {
- Handler oldHandler = mListenerMap.put(listener, handler);
- // For new listeners, provide initial availability information
+ Handler oldHandler = mCallbackMap.put(callback, handler);
+ // For new callbacks, provide initial availability information
if (oldHandler == null) {
- mServiceListener.updateListenerLocked(listener, handler);
+ mServiceListener.updateCallbackLocked(callback, handler);
}
}
}
/**
- * Remove a previously-added listener; the listener will no longer receive
- * connection and disconnection callbacks.
+ * Remove a previously-added callback; the callback will no longer receive connection and
+ * disconnection callbacks.
*
- * <p>Removing a listener that isn't registered has no effect.</p>
+ * <p>Removing a callback that isn't registered has no effect.</p>
*
- * @param listener The listener to remove from the notification list
+ * @param callback The callback to remove from the notification list
*/
- public void removeAvailabilityListener(AvailabilityListener listener) {
+ public void unregisterAvailabilityCallback(AvailabilityCallback callback) {
synchronized (mLock) {
- mListenerMap.remove(listener);
+ mCallbackMap.remove(callback);
}
}
@@ -228,8 +228,8 @@
* Helper for openning a connection to a camera with the given ID.
*
* @param cameraId The unique identifier of the camera device to open
- * @param listener The listener for the camera. Must not be null.
- * @param handler The handler to call the listener on. Must not be null.
+ * @param callback The callback for the camera. Must not be null.
+ * @param handler The handler to invoke the callback on. Must not be null.
*
* @throws CameraAccessException if the camera is disabled by device policy,
* or too many camera devices are already open, or the cameraId does not match
@@ -237,14 +237,14 @@
*
* @throws SecurityException if the application does not have permission to
* access the camera
- * @throws IllegalArgumentException if listener or handler is null.
+ * @throws IllegalArgumentException if callback or handler is null.
* @return A handle to the newly-created camera device.
*
* @see #getCameraIdList
* @see android.app.admin.DevicePolicyManager#setCameraDisabled
*/
private CameraDevice openCameraDeviceUserAsync(String cameraId,
- CameraDevice.StateListener listener, Handler handler)
+ CameraDevice.StateCallback callback, Handler handler)
throws CameraAccessException {
CameraCharacteristics characteristics = getCameraCharacteristics(cameraId);
CameraDevice device = null;
@@ -257,7 +257,7 @@
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl =
new android.hardware.camera2.impl.CameraDeviceImpl(
cameraId,
- listener,
+ callback,
handler,
characteristics);
@@ -313,7 +313,7 @@
throw ce.asChecked();
}
- // TODO: factor out listener to be non-nested, then move setter to constructor
+ // TODO: factor out callback to be non-nested, then move setter to constructor
// For now, calling setRemoteDevice will fire initial
// onOpened/onUnconfigured callbacks.
deviceImpl.setRemoteDevice(cameraUser);
@@ -337,7 +337,7 @@
* is disconnected between the calls to {@link #getCameraIdList} and
* {@link #openCamera}.</p>
*
- * <p>Once the camera is successfully opened, {@link CameraDevice.StateListener#onOpened} will
+ * <p>Once the camera is successfully opened, {@link CameraDevice.StateCallback#onOpened} will
* be invoked with the newly opened {@link CameraDevice}. The camera device can then be set up
* for operation by calling {@link CameraDevice#createCaptureSession} and
* {@link CameraDevice#createCaptureRequest}</p>
@@ -345,31 +345,31 @@
* <!--
* <p>Since the camera device will be opened asynchronously, any asynchronous operations done
* on the returned CameraDevice instance will be queued up until the device startup has
- * completed and the listener's {@link CameraDevice.StateListener#onOpened onOpened} method is
+ * completed and the callback's {@link CameraDevice.StateCallback#onOpened onOpened} method is
* called. The pending operations are then processed in order.</p>
* -->
* <p>If the camera becomes disconnected during initialization
* after this function call returns,
- * {@link CameraDevice.StateListener#onDisconnected} with a
+ * {@link CameraDevice.StateCallback#onDisconnected} with a
* {@link CameraDevice} in the disconnected state (and
- * {@link CameraDevice.StateListener#onOpened} will be skipped).</p>
+ * {@link CameraDevice.StateCallback#onOpened} will be skipped).</p>
*
- * <p>If opening the camera device fails, then the device listener's
- * {@link CameraDevice.StateListener#onError onError} method will be called, and subsequent
+ * <p>If opening the camera device fails, then the device callback's
+ * {@link CameraDevice.StateCallback#onError onError} method will be called, and subsequent
* calls on the camera device will throw a {@link CameraAccessException}.</p>
*
* @param cameraId
* The unique identifier of the camera device to open
- * @param listener
- * The listener which is invoked once the camera is opened
+ * @param callback
+ * The callback which is invoked once the camera is opened
* @param handler
- * The handler on which the listener should be invoked, or
+ * The handler on which the callback should be invoked, or
* {@code null} to use the current thread's {@link android.os.Looper looper}.
*
* @throws CameraAccessException if the camera is disabled by device policy,
* or the camera has become or was disconnected.
*
- * @throws IllegalArgumentException if cameraId or the listener was null,
+ * @throws IllegalArgumentException if cameraId or the callback was null,
* or the cameraId does not match any currently or previously available
* camera device.
*
@@ -379,14 +379,14 @@
* @see #getCameraIdList
* @see android.app.admin.DevicePolicyManager#setCameraDisabled
*/
- public void openCamera(String cameraId, final CameraDevice.StateListener listener,
+ public void openCamera(String cameraId, final CameraDevice.StateCallback callback,
Handler handler)
throws CameraAccessException {
if (cameraId == null) {
throw new IllegalArgumentException("cameraId was null");
- } else if (listener == null) {
- throw new IllegalArgumentException("listener was null");
+ } else if (callback == null) {
+ throw new IllegalArgumentException("callback was null");
} else if (handler == null) {
if (Looper.myLooper() != null) {
handler = new Handler();
@@ -396,11 +396,11 @@
}
}
- openCameraDeviceUserAsync(cameraId, listener, handler);
+ openCameraDeviceUserAsync(cameraId, callback, handler);
}
/**
- * A listener for camera devices becoming available or
+ * A callback for camera devices becoming available or
* unavailable to open.
*
* <p>Cameras become available when they are no longer in use, or when a new
@@ -408,13 +408,13 @@
* application or service starts using a camera, or when a removable camera
* is disconnected.</p>
*
- * <p>Extend this listener and pass an instance of the subclass to
- * {@link CameraManager#addAvailabilityListener} to be notified of such availability
+ * <p>Extend this callback and pass an instance of the subclass to
+ * {@link CameraManager#registerAvailabilityCallback} to be notified of such availability
* changes.</p>
*
- * @see addAvailabilityListener
+ * @see registerAvailabilityCallback
*/
- public static abstract class AvailabilityListener {
+ public static abstract class AvailabilityCallback {
/**
* A new camera has become available to use.
@@ -432,7 +432,7 @@
*
* <p>If an application had an active CameraDevice instance for the
* now-disconnected camera, that application will receive a
- * {@link CameraDevice.StateListener#onDisconnected disconnection error}.</p>
+ * {@link CameraDevice.StateCallback#onDisconnected disconnection error}.</p>
*
* <p>The default implementation of this method does nothing.</p>
*
@@ -444,6 +444,13 @@
}
/**
+ * Temporary for migrating to Callback naming
+ * @hide
+ */
+ public static abstract class AvailabilityListener extends AvailabilityCallback {
+ }
+
+ /**
* Return or create the list of currently connected camera devices.
*
* <p>In case of errors connecting to the camera service, will return an empty list.</p>
@@ -707,14 +714,14 @@
}
}
- private void postSingleUpdate(final AvailabilityListener listener, final Handler handler,
+ private void postSingleUpdate(final AvailabilityCallback callback, final Handler handler,
final String id, final int status) {
if (isAvailable(status)) {
handler.post(
new Runnable() {
@Override
public void run() {
- listener.onCameraAvailable(id);
+ callback.onCameraAvailable(id);
}
});
} else {
@@ -722,7 +729,7 @@
new Runnable() {
@Override
public void run() {
- listener.onCameraUnavailable(id);
+ callback.onCameraUnavailable(id);
}
});
}
@@ -732,11 +739,11 @@
* Send the state of all known cameras to the provided listener, to initialize
* the listener's knowledge of camera state.
*/
- public void updateListenerLocked(AvailabilityListener listener, Handler handler) {
+ public void updateCallbackLocked(AvailabilityCallback callback, Handler handler) {
for (int i = 0; i < mDeviceStatus.size(); i++) {
String id = mDeviceStatus.keyAt(i);
Integer status = mDeviceStatus.valueAt(i);
- postSingleUpdate(listener, handler, id, status);
+ postSingleUpdate(callback, handler, id, status);
}
}
@@ -795,12 +802,12 @@
return;
}
- final int listenerCount = mListenerMap.size();
- for (int i = 0; i < listenerCount; i++) {
- Handler handler = mListenerMap.valueAt(i);
- final AvailabilityListener listener = mListenerMap.keyAt(i);
+ final int callbackCount = mCallbackMap.size();
+ for (int i = 0; i < callbackCount; i++) {
+ Handler handler = mCallbackMap.valueAt(i);
+ final AvailabilityCallback callback = mCallbackMap.keyAt(i);
- postSingleUpdate(listener, handler, id, status);
+ postSingleUpdate(callback, handler, id, status);
}
} // onStatusChangedLocked
diff --git a/core/java/android/hardware/camera2/CaptureFailure.java b/core/java/android/hardware/camera2/CaptureFailure.java
index b6d3b08..c168ff1 100644
--- a/core/java/android/hardware/camera2/CaptureFailure.java
+++ b/core/java/android/hardware/camera2/CaptureFailure.java
@@ -65,12 +65,12 @@
* Get the request associated with this failed capture.
*
* <p>Whenever a request is unsuccessfully captured, with
- * {@link CameraCaptureSession.CaptureListener#onCaptureFailed},
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureFailed},
* the {@code failed capture}'s {@code getRequest()} will return that {@code request}.
* </p>
*
* <p>In particular,
- * <code><pre>cameraDevice.capture(someRequest, new CaptureListener() {
+ * <code><pre>cameraDevice.capture(someRequest, new CaptureCallback() {
* {@literal @}Override
* void onCaptureFailed(CaptureRequest myRequest, CaptureFailure myFailure) {
* assert(myFailure.getRequest.equals(myRequest) == true);
@@ -135,7 +135,7 @@
*
* @return int The ID for the sequence of requests that this capture failure is the result of
*
- * @see CameraDevice.CaptureListener#onCaptureSequenceCompleted
+ * @see CameraDevice.CaptureCallback#onCaptureSequenceCompleted
*/
public int getSequenceId() {
return mSequenceId;
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index bcdcd62..6d0d505 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -245,7 +245,7 @@
* <p>This tag is not used for anything by the camera device, but can be
* used by an application to easily identify a CaptureRequest when it is
* returned by
- * {@link CameraCaptureSession.CaptureListener#onCaptureCompleted CaptureListener.onCaptureCompleted}
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureCompleted CaptureCallback.onCaptureCompleted}
* </p>
*
* @return the last tag Object set on this request, or {@code null} if
@@ -435,7 +435,7 @@
* <p>This tag is not used for anything by the camera device, but can be
* used by an application to easily identify a CaptureRequest when it is
* returned by
- * {@link CameraCaptureSession.CaptureListener#onCaptureCompleted CaptureListener.onCaptureCompleted}
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureCompleted CaptureCallback.onCaptureCompleted}
*
* @param tag an arbitrary Object to store with this request
* @see CaptureRequest#getTag
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index f9c4df4..754d83e 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -268,13 +268,13 @@
* Get the request associated with this result.
*
* <p>Whenever a request has been fully or partially captured, with
- * {@link CameraCaptureSession.CaptureListener#onCaptureCompleted} or
- * {@link CameraCaptureSession.CaptureListener#onCaptureProgressed}, the {@code result}'s
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureCompleted} or
+ * {@link CameraCaptureSession.CaptureCallback#onCaptureProgressed}, the {@code result}'s
* {@code getRequest()} will return that {@code request}.
* </p>
*
* <p>For example,
- * <code><pre>cameraDevice.capture(someRequest, new CaptureListener() {
+ * <code><pre>cameraDevice.capture(someRequest, new CaptureCallback() {
* {@literal @}Override
* void onCaptureCompleted(CaptureRequest myRequest, CaptureResult myResult) {
* assert(myResult.getRequest.equals(myRequest) == true);
@@ -314,8 +314,8 @@
*
* @return int The ID for the sequence of requests that this capture result is a part of
*
- * @see CameraDevice.CaptureListener#onCaptureSequenceCompleted
- * @see CameraDevice.CaptureListener#onCaptureSequenceAborted
+ * @see CameraDevice.CaptureCallback#onCaptureSequenceCompleted
+ * @see CameraDevice.CaptureCallback#onCaptureSequenceAborted
*/
public int getSequenceId() {
return mSequenceId;
diff --git a/core/java/android/hardware/camera2/TotalCaptureResult.java b/core/java/android/hardware/camera2/TotalCaptureResult.java
index 0895fe3..6f7dd78 100644
--- a/core/java/android/hardware/camera2/TotalCaptureResult.java
+++ b/core/java/android/hardware/camera2/TotalCaptureResult.java
@@ -45,7 +45,7 @@
*
* <p>{@link TotalCaptureResult} objects are immutable.</p>
*
- * @see CameraDevice.CaptureListener#onCaptureCompleted
+ * @see CameraDevice.CaptureCallback#onCaptureCompleted
*/
public final class TotalCaptureResult extends CaptureResult {
@@ -88,7 +88,7 @@
*
* <p>The list size will be inclusive between {@code 0} and
* {@link CameraCharacteristics#REQUEST_PARTIAL_RESULT_COUNT}, with elements in ascending order
- * of when {@link CameraCaptureSession.CaptureListener#onCaptureProgressed} was invoked.</p>
+ * of when {@link CameraCaptureSession.CaptureCallback#onCaptureProgressed} was invoked.</p>
*
* @return unmodifiable list of partial results
*/
diff --git a/core/java/android/hardware/camera2/impl/ListenerProxies.java b/core/java/android/hardware/camera2/impl/CallbackProxies.java
similarity index 84%
rename from core/java/android/hardware/camera2/impl/ListenerProxies.java
rename to core/java/android/hardware/camera2/impl/CallbackProxies.java
index f44f9ad..e5ddb7a 100644
--- a/core/java/android/hardware/camera2/impl/ListenerProxies.java
+++ b/core/java/android/hardware/camera2/impl/CallbackProxies.java
@@ -27,22 +27,22 @@
import static com.android.internal.util.Preconditions.*;
/**
- * Proxy out invocations to the camera2 API listeners into a {@link Dispatchable}.
+ * Proxy out invocations to the camera2 API callbacks into a {@link Dispatchable}.
*
* <p>Since abstract classes do not support Java's dynamic {@code Proxy}, we have to
* to use our own proxy mechanism.</p>
*/
-public class ListenerProxies {
+public class CallbackProxies {
// TODO: replace with codegen
- public static class DeviceStateListenerProxy extends CameraDeviceImpl.StateListenerKK {
- private final MethodNameInvoker<CameraDeviceImpl.StateListenerKK> mProxy;
+ public static class DeviceStateCallbackProxy extends CameraDeviceImpl.StateCallbackKK {
+ private final MethodNameInvoker<CameraDeviceImpl.StateCallbackKK> mProxy;
- public DeviceStateListenerProxy(
- Dispatchable<CameraDeviceImpl.StateListenerKK> dispatchTarget) {
+ public DeviceStateCallbackProxy(
+ Dispatchable<CameraDeviceImpl.StateCallbackKK> dispatchTarget) {
dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.StateListenerKK.class);
+ mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.StateCallbackKK.class);
}
@Override
@@ -87,13 +87,13 @@
}
@SuppressWarnings("deprecation")
- public static class DeviceCaptureListenerProxy extends CameraDeviceImpl.CaptureListener {
- private final MethodNameInvoker<CameraDeviceImpl.CaptureListener> mProxy;
+ public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
+ private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
- public DeviceCaptureListenerProxy(
- Dispatchable<CameraDeviceImpl.CaptureListener> dispatchTarget) {
+ public DeviceCaptureCallbackProxy(
+ Dispatchable<CameraDeviceImpl.CaptureCallback> dispatchTarget) {
dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
- mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.CaptureListener.class);
+ mProxy = new MethodNameInvoker<>(dispatchTarget, CameraDeviceImpl.CaptureCallback.class);
}
@Override
@@ -139,15 +139,15 @@
}
}
- public static class SessionStateListenerProxy
- extends CameraCaptureSession.StateListener {
- private final MethodNameInvoker<CameraCaptureSession.StateListener> mProxy;
+ public static class SessionStateCallbackProxy
+ extends CameraCaptureSession.StateCallback {
+ private final MethodNameInvoker<CameraCaptureSession.StateCallback> mProxy;
- public SessionStateListenerProxy(
- Dispatchable<CameraCaptureSession.StateListener> dispatchTarget) {
+ public SessionStateCallbackProxy(
+ Dispatchable<CameraCaptureSession.StateCallback> dispatchTarget) {
dispatchTarget = checkNotNull(dispatchTarget, "dispatchTarget must not be null");
mProxy = new MethodNameInvoker<>(dispatchTarget,
- CameraCaptureSession.StateListener.class);
+ CameraCaptureSession.StateCallback.class);
}
@Override
@@ -177,7 +177,7 @@
}
}
- private ListenerProxies() {
+ private CallbackProxies() {
throw new AssertionError();
}
}
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 9ca1fba..843f117 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -45,11 +45,11 @@
/** User-specified set of surfaces used as the configuration outputs */
private final List<Surface> mOutputs;
/**
- * User-specified state listener, used for outgoing events; calls to this object will be
+ * User-specified state callback, used for outgoing events; calls to this object will be
* automatically {@link Handler#post(Runnable) posted} to {@code mStateHandler}.
*/
- private final CameraCaptureSession.StateListener mStateListener;
- /** User-specified state handler used for outgoing state listener events */
+ private final CameraCaptureSession.StateCallback mStateCallback;
+ /** User-specified state handler used for outgoing state callback events */
private final Handler mStateHandler;
/** Internal camera device; used to translate calls into existing deprecated API */
@@ -84,28 +84,28 @@
* (e.g. no pending captures, no repeating requests, no flush).</p>
*/
CameraCaptureSessionImpl(List<Surface> outputs,
- CameraCaptureSession.StateListener listener, Handler stateHandler,
+ CameraCaptureSession.StateCallback callback, Handler stateHandler,
android.hardware.camera2.impl.CameraDeviceImpl deviceImpl,
Handler deviceStateHandler, boolean configureSuccess) {
if (outputs == null || outputs.isEmpty()) {
throw new IllegalArgumentException("outputs must be a non-null, non-empty list");
- } else if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
+ } else if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
}
// TODO: extra verification of outputs
mOutputs = outputs;
mStateHandler = checkHandler(stateHandler);
- mStateListener = createUserStateListenerProxy(mStateHandler, listener);
+ mStateCallback = createUserStateCallbackProxy(mStateHandler, callback);
mDeviceHandler = checkNotNull(deviceStateHandler, "deviceStateHandler must not be null");
mDeviceImpl = checkNotNull(deviceImpl, "deviceImpl must not be null");
/*
- * Use the same handler as the device's StateListener for all the internal coming events
+ * Use the same handler as the device's StateCallback for all the internal coming events
*
- * This ensures total ordering between CameraDevice.StateListener and
- * CameraDeviceImpl.CaptureListener events.
+ * This ensures total ordering between CameraDevice.StateCallback and
+ * CameraDeviceImpl.CaptureCallback events.
*/
mSequenceDrainer = new TaskDrainer<>(mDeviceHandler, new SequenceDrainListener(),
/*name*/"seq");
@@ -119,11 +119,11 @@
// CameraDevice should call configureOutputs and have it finish before constructing us
if (configureSuccess) {
- mStateListener.onConfigured(this);
+ mStateCallback.onConfigured(this);
if (VERBOSE) Log.v(TAG, "ctor - Created session successfully");
mConfigureSuccess = true;
} else {
- mStateListener.onConfigureFailed(this);
+ mStateCallback.onConfigureFailed(this);
mClosed = true; // do not fire any other callbacks, do not allow any other work
Log.e(TAG, "Failed to create capture session; configuration failed");
mConfigureSuccess = false;
@@ -136,7 +136,7 @@
}
@Override
- public synchronized int capture(CaptureRequest request, CaptureListener listener,
+ public synchronized int capture(CaptureRequest request, CaptureCallback callback,
Handler handler) throws CameraAccessException {
if (request == null) {
throw new IllegalArgumentException("request must not be null");
@@ -145,19 +145,19 @@
checkNotClosed();
checkLegalToCapture();
- handler = checkHandler(handler, listener);
+ handler = checkHandler(handler, callback);
if (VERBOSE) {
- Log.v(TAG, "capture - request " + request + ", listener " + listener + " handler" +
+ Log.v(TAG, "capture - request " + request + ", callback " + callback + " handler" +
" " + handler);
}
return addPendingSequence(mDeviceImpl.capture(request,
- createCaptureListenerProxy(handler, listener), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceHandler));
}
@Override
- public synchronized int captureBurst(List<CaptureRequest> requests, CaptureListener listener,
+ public synchronized int captureBurst(List<CaptureRequest> requests, CaptureCallback callback,
Handler handler) throws CameraAccessException {
if (requests == null) {
throw new IllegalArgumentException("requests must not be null");
@@ -168,20 +168,20 @@
checkNotClosed();
checkLegalToCapture();
- handler = checkHandler(handler, listener);
+ handler = checkHandler(handler, callback);
if (VERBOSE) {
CaptureRequest[] requestArray = requests.toArray(new CaptureRequest[0]);
- Log.v(TAG, "captureBurst - requests " + Arrays.toString(requestArray) + ", listener " +
- listener + " handler" + "" + handler);
+ Log.v(TAG, "captureBurst - requests " + Arrays.toString(requestArray) + ", callback " +
+ callback + " handler" + "" + handler);
}
return addPendingSequence(mDeviceImpl.captureBurst(requests,
- createCaptureListenerProxy(handler, listener), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceHandler));
}
@Override
- public synchronized int setRepeatingRequest(CaptureRequest request, CaptureListener listener,
+ public synchronized int setRepeatingRequest(CaptureRequest request, CaptureCallback callback,
Handler handler) throws CameraAccessException {
if (request == null) {
throw new IllegalArgumentException("request must not be null");
@@ -190,20 +190,20 @@
checkNotClosed();
checkLegalToCapture();
- handler = checkHandler(handler, listener);
+ handler = checkHandler(handler, callback);
if (VERBOSE) {
- Log.v(TAG, "setRepeatingRequest - request " + request + ", listener " + listener +
+ Log.v(TAG, "setRepeatingRequest - request " + request + ", callback " + callback +
" handler" + " " + handler);
}
return addPendingSequence(mDeviceImpl.setRepeatingRequest(request,
- createCaptureListenerProxy(handler, listener), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceHandler));
}
@Override
public synchronized int setRepeatingBurst(List<CaptureRequest> requests,
- CaptureListener listener, Handler handler) throws CameraAccessException {
+ CaptureCallback callback, Handler handler) throws CameraAccessException {
if (requests == null) {
throw new IllegalArgumentException("requests must not be null");
} else if (requests.isEmpty()) {
@@ -213,16 +213,16 @@
checkNotClosed();
checkLegalToCapture();
- handler = checkHandler(handler, listener);
+ handler = checkHandler(handler, callback);
if (VERBOSE) {
CaptureRequest[] requestArray = requests.toArray(new CaptureRequest[0]);
Log.v(TAG, "setRepeatingBurst - requests " + Arrays.toString(requestArray) +
- ", listener " + listener + " handler" + "" + handler);
+ ", callback " + callback + " handler" + "" + handler);
}
return addPendingSequence(mDeviceImpl.setRepeatingBurst(requests,
- createCaptureListenerProxy(handler, listener), mDeviceHandler));
+ createCaptureCallbackProxy(handler, callback), mDeviceHandler));
}
@Override
@@ -331,8 +331,8 @@
// or just suppress the ISE only and rely onClosed.
// Also skip any of the draining work if this is already closed.
- // Short-circuit; queue listener immediately and return
- mStateListener.onClosed(this);
+ // Short-circuit; queue callback immediately and return
+ mStateCallback.onClosed(this);
return;
} catch (CameraAccessException e) {
// OK: close does not throw checked exceptions.
@@ -360,30 +360,30 @@
}
/**
- * Post calls into a CameraCaptureSession.StateListener to the user-specified {@code handler}.
+ * Post calls into a CameraCaptureSession.StateCallback to the user-specified {@code handler}.
*/
- private StateListener createUserStateListenerProxy(Handler handler, StateListener listener) {
- InvokeDispatcher<StateListener> userListenerSink = new InvokeDispatcher<>(listener);
- HandlerDispatcher<StateListener> handlerPassthrough =
- new HandlerDispatcher<>(userListenerSink, handler);
+ private StateCallback createUserStateCallbackProxy(Handler handler, StateCallback callback) {
+ InvokeDispatcher<StateCallback> userCallbackSink = new InvokeDispatcher<>(callback);
+ HandlerDispatcher<StateCallback> handlerPassthrough =
+ new HandlerDispatcher<>(userCallbackSink, handler);
- return new ListenerProxies.SessionStateListenerProxy(handlerPassthrough);
+ return new CallbackProxies.SessionStateCallbackProxy(handlerPassthrough);
}
/**
* Forward callbacks from
- * CameraDeviceImpl.CaptureListener to the CameraCaptureSession.CaptureListener.
+ * CameraDeviceImpl.CaptureCallback to the CameraCaptureSession.CaptureCallback.
*
* <p>In particular, all calls are automatically split to go both to our own
- * internal listener, and to the user-specified listener (by transparently posting
+ * internal callback, and to the user-specified callback (by transparently posting
* to the user-specified handler).</p>
*
* <p>When a capture sequence finishes, update the pending checked sequences set.</p>
*/
@SuppressWarnings("deprecation")
- private CameraDeviceImpl.CaptureListener createCaptureListenerProxy(
- Handler handler, CaptureListener listener) {
- CameraDeviceImpl.CaptureListener localListener = new CameraDeviceImpl.CaptureListener() {
+ private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
+ Handler handler, CaptureCallback callback) {
+ CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {
@Override
public void onCaptureSequenceCompleted(CameraDevice camera,
int sequenceId, long frameNumber) {
@@ -398,43 +398,43 @@
};
/*
- * Split the calls from the device listener into local listener and the following chain:
+ * Split the calls from the device callback into local callback and the following chain:
* - replace the first CameraDevice arg with a CameraCaptureSession
- * - duck type from device listener to session listener
+ * - duck type from device callback to session callback
* - then forward the call to a handler
- * - then finally invoke the destination method on the session listener object
+ * - then finally invoke the destination method on the session callback object
*/
- if (listener == null) {
- // OK: API allows the user to not specify a listener, and the handler may
+ if (callback == null) {
+ // OK: API allows the user to not specify a callback, and the handler may
// also be null in that case. Collapse whole dispatch chain to only call the local
- // listener
- return localListener;
+ // callback
+ return localCallback;
}
- InvokeDispatcher<CameraDeviceImpl.CaptureListener> localSink =
- new InvokeDispatcher<>(localListener);
+ InvokeDispatcher<CameraDeviceImpl.CaptureCallback> localSink =
+ new InvokeDispatcher<>(localCallback);
- InvokeDispatcher<CaptureListener> userListenerSink =
- new InvokeDispatcher<>(listener);
- HandlerDispatcher<CaptureListener> handlerPassthrough =
- new HandlerDispatcher<>(userListenerSink, handler);
- DuckTypingDispatcher<CameraDeviceImpl.CaptureListener, CaptureListener> duckToSession
- = new DuckTypingDispatcher<>(handlerPassthrough, CaptureListener.class);
- ArgumentReplacingDispatcher<CameraDeviceImpl.CaptureListener, CameraCaptureSessionImpl>
+ InvokeDispatcher<CaptureCallback> userCallbackSink =
+ new InvokeDispatcher<>(callback);
+ HandlerDispatcher<CaptureCallback> handlerPassthrough =
+ new HandlerDispatcher<>(userCallbackSink, handler);
+ DuckTypingDispatcher<CameraDeviceImpl.CaptureCallback, CaptureCallback> duckToSession
+ = new DuckTypingDispatcher<>(handlerPassthrough, CaptureCallback.class);
+ ArgumentReplacingDispatcher<CameraDeviceImpl.CaptureCallback, CameraCaptureSessionImpl>
replaceDeviceWithSession = new ArgumentReplacingDispatcher<>(duckToSession,
/*argumentIndex*/0, this);
- BroadcastDispatcher<CameraDeviceImpl.CaptureListener> broadcaster =
- new BroadcastDispatcher<CameraDeviceImpl.CaptureListener>(
+ BroadcastDispatcher<CameraDeviceImpl.CaptureCallback> broadcaster =
+ new BroadcastDispatcher<CameraDeviceImpl.CaptureCallback>(
replaceDeviceWithSession,
localSink);
- return new ListenerProxies.DeviceCaptureListenerProxy(broadcaster);
+ return new CallbackProxies.DeviceCaptureCallbackProxy(broadcaster);
}
/**
*
- * Create an internal state listener, to be invoked on the mDeviceHandler
+ * Create an internal state callback, to be invoked on the mDeviceHandler
*
* <p>It has a few behaviors:
* <ul>
@@ -443,10 +443,10 @@
* </ul>
* </p>
* */
- CameraDeviceImpl.StateListenerKK getDeviceStateListener() {
+ CameraDeviceImpl.StateCallbackKK getDeviceStateCallback() {
final CameraCaptureSession session = this;
- return new CameraDeviceImpl.StateListenerKK() {
+ return new CameraDeviceImpl.StateCallbackKK() {
private boolean mBusy = false;
private boolean mActive = false;
@@ -471,7 +471,7 @@
mIdleDrainer.taskStarted();
mActive = true;
- mStateListener.onActive(session);
+ mStateCallback.onActive(session);
}
@Override
@@ -507,7 +507,7 @@
mBusy = false;
mActive = false;
- mStateListener.onReady(session);
+ mStateCallback.onReady(session);
}
@Override
@@ -629,7 +629,7 @@
// Fast path: A new capture session has replaced this one; don't unconfigure.
if (mSkipUnconfigure) {
- mStateListener.onClosed(CameraCaptureSessionImpl.this);
+ mStateCallback.onClosed(CameraCaptureSessionImpl.this);
return;
}
@@ -655,7 +655,7 @@
public void onDrained() {
synchronized (CameraCaptureSessionImpl.this) {
// The device has finished unconfiguring. It's now fully closed.
- mStateListener.onClosed(CameraCaptureSessionImpl.this);
+ mStateCallback.onClosed(CameraCaptureSessionImpl.this);
}
}
}
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index f5666bf..d454092 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -64,17 +64,17 @@
private final Object mInterfaceLock = new Object();
private final CameraDeviceCallbacks mCallbacks = new CameraDeviceCallbacks();
- private final StateListener mDeviceListener;
- private volatile StateListenerKK mSessionStateListener;
+ private final StateCallback mDeviceCallback;
+ private volatile StateCallbackKK mSessionStateCallback;
private final Handler mDeviceHandler;
private volatile boolean mClosing = false;
private boolean mInError = false;
private boolean mIdle = true;
- /** map request IDs to listener/request data */
- private final SparseArray<CaptureListenerHolder> mCaptureListenerMap =
- new SparseArray<CaptureListenerHolder>();
+ /** map request IDs to callback/request data */
+ private final SparseArray<CaptureCallbackHolder> mCaptureCallbackMap =
+ new SparseArray<CaptureCallbackHolder>();
private int mRepeatingRequestId = REQUEST_ID_NONE;
private final ArrayList<Integer> mRepeatingRequestIdDeletedList = new ArrayList<Integer>();
@@ -106,30 +106,30 @@
private final Runnable mCallOnOpened = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onOpened(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onOpened(CameraDeviceImpl.this);
}
- mDeviceListener.onOpened(CameraDeviceImpl.this);
+ mDeviceCallback.onOpened(CameraDeviceImpl.this);
}
};
private final Runnable mCallOnUnconfigured = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onUnconfigured(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onUnconfigured(CameraDeviceImpl.this);
}
}
};
@@ -137,14 +137,14 @@
private final Runnable mCallOnActive = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onActive(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onActive(CameraDeviceImpl.this);
}
}
};
@@ -152,14 +152,14 @@
private final Runnable mCallOnBusy = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onBusy(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onBusy(CameraDeviceImpl.this);
}
}
};
@@ -172,14 +172,14 @@
if (mClosedOnce) {
throw new AssertionError("Don't post #onClosed more than once");
}
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onClosed(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onClosed(CameraDeviceImpl.this);
}
- mDeviceListener.onClosed(CameraDeviceImpl.this);
+ mDeviceCallback.onClosed(CameraDeviceImpl.this);
mClosedOnce = true;
}
};
@@ -187,14 +187,14 @@
private final Runnable mCallOnIdle = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onIdle(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onIdle(CameraDeviceImpl.this);
}
}
};
@@ -202,26 +202,26 @@
private final Runnable mCallOnDisconnected = new Runnable() {
@Override
public void run() {
- StateListenerKK sessionListener = null;
+ StateCallbackKK sessionCallback = null;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- sessionListener = mSessionStateListener;
+ sessionCallback = mSessionStateCallback;
}
- if (sessionListener != null) {
- sessionListener.onDisconnected(CameraDeviceImpl.this);
+ if (sessionCallback != null) {
+ sessionCallback.onDisconnected(CameraDeviceImpl.this);
}
- mDeviceListener.onDisconnected(CameraDeviceImpl.this);
+ mDeviceCallback.onDisconnected(CameraDeviceImpl.this);
}
};
- public CameraDeviceImpl(String cameraId, StateListener listener, Handler handler,
+ public CameraDeviceImpl(String cameraId, StateCallback callback, Handler handler,
CameraCharacteristics characteristics) {
- if (cameraId == null || listener == null || handler == null || characteristics == null) {
+ if (cameraId == null || callback == null || handler == null || characteristics == null) {
throw new IllegalArgumentException("Null argument given");
}
mCameraId = cameraId;
- mDeviceListener = listener;
+ mDeviceCallback = callback;
mDeviceHandler = handler;
mCharacteristics = characteristics;
@@ -263,28 +263,28 @@
/**
* Call to indicate failed connection to a remote camera device.
*
- * <p>This places the camera device in the error state and informs the listener.
+ * <p>This places the camera device in the error state and informs the callback.
* Use in place of setRemoteDevice() when startup fails.</p>
*/
public void setRemoteFailure(final CameraRuntimeException failure) {
- int failureCode = StateListener.ERROR_CAMERA_DEVICE;
+ int failureCode = StateCallback.ERROR_CAMERA_DEVICE;
boolean failureIsError = true;
switch (failure.getReason()) {
case CameraAccessException.CAMERA_IN_USE:
- failureCode = StateListener.ERROR_CAMERA_IN_USE;
+ failureCode = StateCallback.ERROR_CAMERA_IN_USE;
break;
case CameraAccessException.MAX_CAMERAS_IN_USE:
- failureCode = StateListener.ERROR_MAX_CAMERAS_IN_USE;
+ failureCode = StateCallback.ERROR_MAX_CAMERAS_IN_USE;
break;
case CameraAccessException.CAMERA_DISABLED:
- failureCode = StateListener.ERROR_CAMERA_DISABLED;
+ failureCode = StateCallback.ERROR_CAMERA_DISABLED;
break;
case CameraAccessException.CAMERA_DISCONNECTED:
failureIsError = false;
break;
case CameraAccessException.CAMERA_ERROR:
- failureCode = StateListener.ERROR_CAMERA_DEVICE;
+ failureCode = StateCallback.ERROR_CAMERA_DEVICE;
break;
default:
Log.wtf(TAG, "Unknown failure in opening camera device: " + failure.getReason());
@@ -298,9 +298,9 @@
@Override
public void run() {
if (isError) {
- mDeviceListener.onError(CameraDeviceImpl.this, code);
+ mDeviceCallback.onError(CameraDeviceImpl.this, code);
} else {
- mDeviceListener.onDisconnected(CameraDeviceImpl.this);
+ mDeviceCallback.onDisconnected(CameraDeviceImpl.this);
}
}
});
@@ -415,7 +415,7 @@
@Override
public void createCaptureSession(List<Surface> outputs,
- CameraCaptureSession.StateListener listener, Handler handler)
+ CameraCaptureSession.StateCallback callback, Handler handler)
throws CameraAccessException {
synchronized(mInterfaceLock) {
if (DEBUG) {
@@ -445,7 +445,7 @@
// Fire onConfigured if configureOutputs succeeded, fire onConfigureFailed otherwise.
CameraCaptureSessionImpl newSession =
- new CameraCaptureSessionImpl(outputs, listener, handler, this, mDeviceHandler,
+ new CameraCaptureSessionImpl(outputs, callback, handler, this, mDeviceHandler,
configureSuccess);
// TODO: wait until current session closes, then create the new session
@@ -455,16 +455,16 @@
throw pendingException;
}
- mSessionStateListener = mCurrentSession.getDeviceStateListener();
+ mSessionStateCallback = mCurrentSession.getDeviceStateCallback();
}
}
/**
* For use by backwards-compatibility code only.
*/
- public void setSessionListener(StateListenerKK sessionListener) {
+ public void setSessionListener(StateCallbackKK sessionCallback) {
synchronized(mInterfaceLock) {
- mSessionStateListener = sessionListener;
+ mSessionStateCallback = sessionCallback;
}
}
@@ -492,22 +492,22 @@
}
}
- public int capture(CaptureRequest request, CaptureListener listener, Handler handler)
+ public int capture(CaptureRequest request, CaptureCallback callback, Handler handler)
throws CameraAccessException {
if (DEBUG) {
Log.d(TAG, "calling capture");
}
List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
requestList.add(request);
- return submitCaptureRequest(requestList, listener, handler, /*streaming*/false);
+ return submitCaptureRequest(requestList, callback, handler, /*streaming*/false);
}
- public int captureBurst(List<CaptureRequest> requests, CaptureListener listener,
+ public int captureBurst(List<CaptureRequest> requests, CaptureCallback callback,
Handler handler) throws CameraAccessException {
if (requests == null || requests.isEmpty()) {
throw new IllegalArgumentException("At least one request must be given");
}
- return submitCaptureRequest(requests, listener, handler, /*streaming*/false);
+ return submitCaptureRequest(requests, callback, handler, /*streaming*/false);
}
/**
@@ -527,12 +527,12 @@
final int requestId, final long lastFrameNumber) {
// lastFrameNumber being equal to NO_FRAMES_CAPTURED means that the request
// was never sent to HAL. Should trigger onCaptureSequenceAborted immediately.
- if (lastFrameNumber == CaptureListener.NO_FRAMES_CAPTURED) {
- final CaptureListenerHolder holder;
- int index = mCaptureListenerMap.indexOfKey(requestId);
- holder = (index >= 0) ? mCaptureListenerMap.valueAt(index) : null;
+ if (lastFrameNumber == CaptureCallback.NO_FRAMES_CAPTURED) {
+ final CaptureCallbackHolder holder;
+ int index = mCaptureCallbackMap.indexOfKey(requestId);
+ holder = (index >= 0) ? mCaptureCallbackMap.valueAt(index) : null;
if (holder != null) {
- mCaptureListenerMap.removeAt(index);
+ mCaptureCallbackMap.removeAt(index);
if (DEBUG) {
Log.v(TAG, String.format(
"remove holder for requestId %d, "
@@ -560,7 +560,7 @@
|| lastFrameNumber > Integer.MAX_VALUE) {
throw new AssertionError(lastFrameNumber + " cannot be cast to int");
}
- holder.getListener().onCaptureSequenceAborted(
+ holder.getCallback().onCaptureSequenceAborted(
CameraDeviceImpl.this,
requestId);
}
@@ -569,7 +569,7 @@
holder.getHandler().post(resultDispatch);
} else {
Log.w(TAG, String.format(
- "did not register listener to request %d",
+ "did not register callback to request %d",
requestId));
}
} else {
@@ -579,12 +579,12 @@
}
}
- private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureListener listener,
+ private int submitCaptureRequest(List<CaptureRequest> requestList, CaptureCallback callback,
Handler handler, boolean repeating) throws CameraAccessException {
// Need a valid handler, or current thread needs to have a looper, if
- // listener is valid
- handler = checkHandler(handler, listener);
+ // callback is valid
+ handler = checkHandler(handler, callback);
// Make sure that there all requests have at least 1 surface; all surfaces are non-null
for (CaptureRequest request : requestList) {
@@ -622,8 +622,8 @@
return -1;
}
- if (listener != null) {
- mCaptureListenerMap.put(requestId, new CaptureListenerHolder(listener,
+ if (callback != null) {
+ mCaptureCallbackMap.put(requestId, new CaptureCallbackHolder(callback,
requestList, handler, repeating));
} else {
if (DEBUG) {
@@ -652,19 +652,19 @@
}
}
- public int setRepeatingRequest(CaptureRequest request, CaptureListener listener,
+ public int setRepeatingRequest(CaptureRequest request, CaptureCallback callback,
Handler handler) throws CameraAccessException {
List<CaptureRequest> requestList = new ArrayList<CaptureRequest>();
requestList.add(request);
- return submitCaptureRequest(requestList, listener, handler, /*streaming*/true);
+ return submitCaptureRequest(requestList, callback, handler, /*streaming*/true);
}
- public int setRepeatingBurst(List<CaptureRequest> requests, CaptureListener listener,
+ public int setRepeatingBurst(List<CaptureRequest> requests, CaptureCallback callback,
Handler handler) throws CameraAccessException {
if (requests == null || requests.isEmpty()) {
throw new IllegalArgumentException("At least one request must be given");
}
- return submitCaptureRequest(requests, listener, handler, /*streaming*/true);
+ return submitCaptureRequest(requests, callback, handler, /*streaming*/true);
}
public void stopRepeating() throws CameraAccessException {
@@ -677,7 +677,7 @@
mRepeatingRequestId = REQUEST_ID_NONE;
// Queue for deletion after in-flight requests finish
- if (mCaptureListenerMap.get(requestId) != null) {
+ if (mCaptureCallbackMap.get(requestId) != null) {
mRepeatingRequestIdDeletedList.add(requestId);
}
@@ -782,11 +782,11 @@
}
/**
- * <p>A listener for tracking the progress of a {@link CaptureRequest}
+ * <p>A callback for tracking the progress of a {@link CaptureRequest}
* submitted to the camera device.</p>
*
*/
- public static abstract class CaptureListener {
+ public static abstract class CaptureCallback {
/**
* This constant is used to indicate that no images were captured for
@@ -848,9 +848,9 @@
}
/**
- * This method is called independently of the others in CaptureListener,
+ * This method is called independently of the others in CaptureCallback,
* when a capture sequence finishes and all {@link CaptureResult}
- * or {@link CaptureFailure} for it have been returned via this listener.
+ * or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceCompleted(CameraDevice camera,
int sequenceId, long frameNumber) {
@@ -858,9 +858,9 @@
}
/**
- * This method is called independently of the others in CaptureListener,
+ * This method is called independently of the others in CaptureCallback,
* when a capture sequence aborts before any {@link CaptureResult}
- * or {@link CaptureFailure} for it have been returned via this listener.
+ * or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceAborted(CameraDevice camera,
int sequenceId) {
@@ -869,10 +869,10 @@
}
/**
- * A listener for notifications about the state of a camera device, adding in the callbacks that
+ * A callback for notifications about the state of a camera device, adding in the callbacks that
* were part of the earlier KK API design, but now only used internally.
*/
- public static abstract class StateListenerKK extends StateListener {
+ public static abstract class StateCallbackKK extends StateCallback {
/**
* The method called when a camera device has no outputs configured.
*
@@ -908,31 +908,31 @@
}
}
- static class CaptureListenerHolder {
+ static class CaptureCallbackHolder {
private final boolean mRepeating;
- private final CaptureListener mListener;
+ private final CaptureCallback mCallback;
private final List<CaptureRequest> mRequestList;
private final Handler mHandler;
- CaptureListenerHolder(CaptureListener listener, List<CaptureRequest> requestList,
+ CaptureCallbackHolder(CaptureCallback callback, List<CaptureRequest> requestList,
Handler handler, boolean repeating) {
- if (listener == null || handler == null) {
+ if (callback == null || handler == null) {
throw new UnsupportedOperationException(
- "Must have a valid handler and a valid listener");
+ "Must have a valid handler and a valid callback");
}
mRepeating = repeating;
mHandler = handler;
mRequestList = new ArrayList<CaptureRequest>(requestList);
- mListener = listener;
+ mCallback = callback;
}
public boolean isRepeating() {
return mRepeating;
}
- public CaptureListener getListener() {
- return mListener;
+ public CaptureCallback getCallback() {
+ return mCallback;
}
public CaptureRequest getRequest(int subsequenceId) {
@@ -1071,20 +1071,20 @@
final SimpleEntry<Long, Integer> frameNumberRequestPair = iter.next();
if (frameNumberRequestPair.getKey() <= completedFrameNumber) {
- // remove request from mCaptureListenerMap
+ // remove request from mCaptureCallbackMap
final int requestId = frameNumberRequestPair.getValue();
- final CaptureListenerHolder holder;
+ final CaptureCallbackHolder holder;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) {
Log.w(TAG, "Camera closed while checking sequences");
return;
}
- int index = mCaptureListenerMap.indexOfKey(requestId);
- holder = (index >= 0) ? mCaptureListenerMap.valueAt(index)
+ int index = mCaptureCallbackMap.indexOfKey(requestId);
+ holder = (index >= 0) ? mCaptureCallbackMap.valueAt(index)
: null;
if (holder != null) {
- mCaptureListenerMap.removeAt(index);
+ mCaptureCallbackMap.removeAt(index);
if (DEBUG) {
Log.v(TAG, String.format(
"remove holder for requestId %d, "
@@ -1114,7 +1114,7 @@
throw new AssertionError(lastFrameNumber
+ " cannot be cast to int");
}
- holder.getListener().onCaptureSequenceCompleted(
+ holder.getCallback().onCaptureSequenceCompleted(
CameraDeviceImpl.this,
requestId,
lastFrameNumber);
@@ -1146,13 +1146,13 @@
/**
* Camera has encountered a device-level error
- * Matches CameraDevice.StateListener#ERROR_CAMERA_DEVICE
+ * Matches CameraDevice.StateCallback#ERROR_CAMERA_DEVICE
*/
static final int ERROR_CAMERA_DEVICE = 1;
/**
* Camera has encountered a service-level error
- * Matches CameraDevice.StateListener#ERROR_CAMERA_SERVICE
+ * Matches CameraDevice.StateCallback#ERROR_CAMERA_SERVICE
*/
static final int ERROR_CAMERA_SERVICE = 2;
@@ -1204,7 +1204,7 @@
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()) {
- mDeviceListener.onError(CameraDeviceImpl.this, errorCode);
+ mDeviceCallback.onError(CameraDeviceImpl.this, errorCode);
}
}
};
@@ -1240,13 +1240,13 @@
if (DEBUG) {
Log.d(TAG, "Capture started for id " + requestId);
}
- final CaptureListenerHolder holder;
+ final CaptureCallbackHolder holder;
synchronized(mInterfaceLock) {
if (mRemoteDevice == null) return; // Camera already closed
- // Get the listener for this frame ID, if there is one
- holder = CameraDeviceImpl.this.mCaptureListenerMap.get(requestId);
+ // Get the callback for this frame ID, if there is one
+ holder = CameraDeviceImpl.this.mCaptureCallbackMap.get(requestId);
if (holder == null) {
return;
@@ -1260,7 +1260,7 @@
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()) {
- holder.getListener().onCaptureStarted(
+ holder.getCallback().onCaptureStarted(
CameraDeviceImpl.this,
holder.getRequest(resultExtras.getSubsequenceId()),
timestamp);
@@ -1290,13 +1290,13 @@
result.set(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE,
getCharacteristics().get(CameraCharacteristics.LENS_INFO_SHADING_MAP_SIZE));
- final CaptureListenerHolder holder =
- CameraDeviceImpl.this.mCaptureListenerMap.get(requestId);
+ final CaptureCallbackHolder holder =
+ CameraDeviceImpl.this.mCaptureCallbackMap.get(requestId);
boolean isPartialResult =
(resultExtras.getPartialResultCount() < mTotalPartialCount);
- // Check if we have a listener for this
+ // Check if we have a callback for this
if (holder == null) {
if (DEBUG) {
Log.d(TAG,
@@ -1336,7 +1336,7 @@
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
- holder.getListener().onCaptureProgressed(
+ holder.getCallback().onCaptureProgressed(
CameraDeviceImpl.this,
request,
resultAsCapture);
@@ -1357,7 +1357,7 @@
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
- holder.getListener().onCaptureCompleted(
+ holder.getCallback().onCaptureCompleted(
CameraDeviceImpl.this,
request,
resultAsCapture);
@@ -1388,8 +1388,8 @@
final int requestId = resultExtras.getRequestId();
final int subsequenceId = resultExtras.getSubsequenceId();
final long frameNumber = resultExtras.getFrameNumber();
- final CaptureListenerHolder holder =
- CameraDeviceImpl.this.mCaptureListenerMap.get(requestId);
+ final CaptureCallbackHolder holder =
+ CameraDeviceImpl.this.mCaptureCallbackMap.get(requestId);
final CaptureRequest request = holder.getRequest(subsequenceId);
@@ -1420,7 +1420,7 @@
@Override
public void run() {
if (!CameraDeviceImpl.this.isClosed()){
- holder.getListener().onCaptureFailed(
+ holder.getCallback().onCaptureFailed(
CameraDeviceImpl.this,
request,
failure);
@@ -1460,12 +1460,12 @@
}
/**
- * Default handler management, conditional on there being a listener.
+ * Default handler management, conditional on there being a callback.
*
- * <p>If the listener isn't null, check the handler, otherwise pass it through.</p>
+ * <p>If the callback isn't null, check the handler, otherwise pass it through.</p>
*/
- static <T> Handler checkHandler(Handler handler, T listener) {
- if (listener != null) {
+ static <T> Handler checkHandler(Handler handler, T callback) {
+ if (callback != null) {
return checkHandler(handler);
}
return handler;
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 9361286..bf8ac65 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -535,7 +535,7 @@
destroyed = isDestroyedLocked();
}
- if (destroyed) {
+ if (destroyed && observer != null) {
try {
observer.onDestroy();
} catch (RemoteException re) {
diff --git a/core/java/android/service/notification/INotificationListener.aidl b/core/java/android/service/notification/INotificationListener.aidl
index 8ca9b6c..e6bf6ba 100644
--- a/core/java/android/service/notification/INotificationListener.aidl
+++ b/core/java/android/service/notification/INotificationListener.aidl
@@ -16,6 +16,7 @@
package android.service.notification;
+import android.service.notification.IStatusBarNotificationHolder;
import android.service.notification.StatusBarNotification;
import android.service.notification.NotificationRankingUpdate;
@@ -23,9 +24,9 @@
oneway interface INotificationListener
{
void onListenerConnected(in NotificationRankingUpdate update);
- void onNotificationPosted(in StatusBarNotification notification,
+ void onNotificationPosted(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update);
- void onNotificationRemoved(in StatusBarNotification notification,
+ void onNotificationRemoved(in IStatusBarNotificationHolder notificationHolder,
in NotificationRankingUpdate update);
void onNotificationRankingUpdate(in NotificationRankingUpdate update);
void onListenerHintsChanged(int hints);
diff --git a/core/java/android/service/notification/IStatusBarNotificationHolder.aidl b/core/java/android/service/notification/IStatusBarNotificationHolder.aidl
new file mode 100644
index 0000000..fd6b59e
--- /dev/null
+++ b/core/java/android/service/notification/IStatusBarNotificationHolder.aidl
@@ -0,0 +1,24 @@
+/**
+ * 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.service.notification;
+
+import android.service.notification.StatusBarNotification;
+
+/** @hide */
+interface IStatusBarNotificationHolder {
+ StatusBarNotification get();
+}
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 2ca8098..d744070 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -603,8 +603,15 @@
private class INotificationListenerWrapper extends INotificationListener.Stub {
@Override
- public void onNotificationPosted(StatusBarNotification sbn,
+ public void onNotificationPosted(IStatusBarNotificationHolder sbnHolder,
NotificationRankingUpdate update) {
+ StatusBarNotification sbn;
+ try {
+ sbn = sbnHolder.get();
+ } catch (RemoteException e) {
+ Log.w(TAG, "onNotificationPosted: Error receiving StatusBarNotification", e);
+ return;
+ }
Notification.Builder.rebuild(getContext(), sbn.getNotification());
// protect subclass from concurrent modifications of (@link mNotificationKeys}.
@@ -618,8 +625,15 @@
}
}
@Override
- public void onNotificationRemoved(StatusBarNotification sbn,
+ public void onNotificationRemoved(IStatusBarNotificationHolder sbnHolder,
NotificationRankingUpdate update) {
+ StatusBarNotification sbn;
+ try {
+ sbn = sbnHolder.get();
+ } catch (RemoteException e) {
+ Log.w(TAG, "onNotificationRemoved: Error receiving StatusBarNotification", e);
+ return;
+ }
// protect subclass from concurrent modifications of (@link mNotificationKeys}.
synchronized (mWrapper) {
applyUpdate(update);
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index 9dc9766..47f72a8 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -367,6 +367,10 @@
throw new IllegalArgumentException("Unrecognized outline?");
}
+ public boolean hasShadow() {
+ return nHasShadow(mNativeRenderNode);
+ }
+
/**
* Enables or disables clipping to the outline.
*
@@ -861,6 +865,7 @@
float alpha);
private static native boolean nSetOutlineEmpty(long renderNode);
private static native boolean nSetOutlineNone(long renderNode);
+ private static native boolean nHasShadow(long renderNode);
private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline);
private static native boolean nSetRevealClip(long renderNode,
boolean shouldClip, float x, float y, float radius);
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 92ad4e8..770e78c 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -10224,6 +10224,7 @@
*
* @return true if the content in this view might overlap, false otherwise.
*/
+ @ViewDebug.ExportedProperty(category = "drawing")
public boolean hasOverlappingRendering() {
return true;
}
@@ -10926,6 +10927,17 @@
invalidateViewProperty(false, false);
}
+ /**
+ * HierarchyViewer only
+ *
+ * @hide
+ */
+ @ViewDebug.ExportedProperty(category = "drawing")
+ public boolean hasShadow() {
+ return mRenderNode.hasShadow();
+ }
+
+
/** @hide */
public void setRevealClip(boolean shouldClip, float x, float y, float radius) {
mRenderNode.setRevealClip(shouldClip, x, y, radius);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 974fe4e..ac1b6a9 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3301,6 +3301,7 @@
* @return True if the group's children will be clipped to their bounds,
* false otherwise.
*/
+ @ViewDebug.ExportedProperty(category = "drawing")
public boolean getClipChildren() {
return ((mGroupFlags & FLAG_CLIP_CHILDREN) != 0);
}
@@ -3349,6 +3350,7 @@
*
* @attr ref android.R.styleable#ViewGroup_clipToPadding
*/
+ @ViewDebug.ExportedProperty(category = "drawing")
public boolean getClipToPadding() {
return hasBooleanFlag(FLAG_CLIP_TO_PADDING);
}
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index 949f4ff..050037e 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -173,6 +173,12 @@
return true;
}
+static jboolean android_view_RenderNode_hasShadow(JNIEnv* env,
+ jobject clazz, jlong renderNodePtr) {
+ RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+ return renderNode->stagingProperties().hasShadow();
+}
+
static jboolean android_view_RenderNode_setClipToOutline(JNIEnv* env,
jobject clazz, jlong renderNodePtr, jboolean clipToOutline) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
@@ -491,6 +497,7 @@
{ "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
{ "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
{ "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
+ { "nHasShadow", "(J)Z", (void*) android_view_RenderNode_hasShadow },
{ "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
{ "nSetRevealClip", "(JZFFF)Z", (void*) android_view_RenderNode_setRevealClip },
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 7e6d335..a8edb77 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -158,9 +158,11 @@
// Marks the start of a frame, which will update the frame time and move all
// next frame animations into the current frame
- virtual void startFrame() {
- mRootNode->doAttachAnimatingNodes(this);
- AnimationContext::startFrame();
+ virtual void startFrame(TreeInfo::TraversalMode mode) {
+ if (mode == TreeInfo::MODE_FULL) {
+ mRootNode->doAttachAnimatingNodes(this);
+ }
+ AnimationContext::startFrame(mode);
}
// Runs any animations still left in mCurrentFrameAnimations
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 7c5233c..72dd930 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -182,11 +182,11 @@
<protected-broadcast android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
<protected-broadcast android:name="android.intent.action.HEADSET_PLUG" />
- <protected-broadcast android:name="android.intent.action.ANALOG_AUDIO_DOCK_PLUG" />
- <protected-broadcast android:name="android.intent.action.DIGITAL_AUDIO_DOCK_PLUG" />
- <protected-broadcast android:name="android.intent.action.HDMI_AUDIO_PLUG" />
- <protected-broadcast android:name="android.intent.action.USB_AUDIO_ACCESSORY_PLUG" />
- <protected-broadcast android:name="android.intent.action.USB_AUDIO_DEVICE_PLUG" />
+ <protected-broadcast android:name="android.media.action.ANALOG_AUDIO_DOCK_PLUG" />
+ <protected-broadcast android:name="android.media.action.DIGITAL_AUDIO_DOCK_PLUG" />
+ <protected-broadcast android:name="android.media.action.HDMI_AUDIO_PLUG" />
+ <protected-broadcast android:name="android.media.action.USB_AUDIO_ACCESSORY_PLUG" />
+ <protected-broadcast android:name="android.media.action.USB_AUDIO_DEVICE_PLUG" />
<protected-broadcast android:name="android.media.AUDIO_BECOMING_NOISY" />
<protected-broadcast android:name="android.media.RINGER_MODE_CHANGED" />
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index 5a3e3a3..3cb5210 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -470,19 +470,6 @@
}
/**
- * Specifies a tint and blending mode for this drawable.
- * <p>
- * Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
- * tint.
- *
- * @param tint Color state list to use for tinting this drawable, or null to
- * clear the tint
- * @param tintMode A Porter-Duff blending mode
- * @hide TODO: Was in L-preview, remove this API for release
- */
- public void setTint(ColorStateList tint, PorterDuff.Mode tintMode) {}
-
- /**
* Specifies a tint for this drawable.
* <p>
* Setting a color filter via {@link #setColorFilter(ColorFilter)} overrides
diff --git a/libs/hwui/AnimationContext.cpp b/libs/hwui/AnimationContext.cpp
index 716dcf5..a20bdae 100644
--- a/libs/hwui/AnimationContext.cpp
+++ b/libs/hwui/AnimationContext.cpp
@@ -17,7 +17,6 @@
#include "Animator.h"
#include "RenderNode.h"
-#include "TreeInfo.h"
#include "renderthread/TimeLord.h"
namespace android {
@@ -34,7 +33,7 @@
}
void AnimationContext::destroy() {
- startFrame();
+ startFrame(TreeInfo::MODE_RT_ONLY);
while (mCurrentFrameAnimations.mNextHandle) {
AnimationHandle* current = mCurrentFrameAnimations.mNextHandle;
AnimatorManager& animators = current->mRenderNode->animators();
@@ -55,7 +54,7 @@
handle->insertAfter(&mNextFrameAnimations);
}
-void AnimationContext::startFrame() {
+void AnimationContext::startFrame(TreeInfo::TraversalMode mode) {
LOG_ALWAYS_FATAL_IF(mCurrentFrameAnimations.mNextHandle,
"Missed running animations last frame!");
AnimationHandle* head = mNextFrameAnimations.mNextHandle;
diff --git a/libs/hwui/AnimationContext.h b/libs/hwui/AnimationContext.h
index 9b3d5f4..909ed36 100644
--- a/libs/hwui/AnimationContext.h
+++ b/libs/hwui/AnimationContext.h
@@ -20,6 +20,7 @@
#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
+#include "TreeInfo.h"
#include "renderthread/TimeLord.h"
#include "utils/Macros.h"
@@ -30,7 +31,6 @@
class AnimationListener;
class BaseRenderNodeAnimator;
class RenderNode;
-class TreeInfo;
/*
* AnimationHandle is several classes merged into one.
@@ -90,7 +90,7 @@
// Marks the start of a frame, which will update the frame time and move all
// next frame animations into the current frame
- ANDROID_API virtual void startFrame();
+ ANDROID_API virtual void startFrame(TreeInfo::TraversalMode mode);
// Runs any animations still left in mCurrentFrameAnimations that were not run
// as part of the standard RenderNode:prepareTree pass.
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 0c8d07f..46eeb6a 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -569,6 +569,10 @@
return getClipToBounds() && (getZ() <= 0 || getOutline().isEmpty());
}
+ bool hasShadow() const {
+ return getZ() >= 0.0f && getOutline().getPath() != NULL;
+ }
+
private:
// Rendering properties
struct PrimitiveFields {
diff --git a/libs/hwui/RenderState.cpp b/libs/hwui/RenderState.cpp
index a7c5e85..ec8307f 100644
--- a/libs/hwui/RenderState.cpp
+++ b/libs/hwui/RenderState.cpp
@@ -38,6 +38,7 @@
}
void RenderState::onGLContextDestroyed() {
+ AutoMutex _lock(mLayerLock);
if (CC_UNLIKELY(!mActiveLayers.empty())) {
mCaches->dumpMemoryUsage();
for (std::set<renderthread::CanvasContext*>::iterator cit = mRegisteredContexts.begin();
@@ -51,6 +52,13 @@
}
context->mRootRenderNode->debugDumpLayers(" ");
}
+
+ for (std::set<const Layer*>::iterator lit = mActiveLayers.begin();
+ lit != mActiveLayers.end(); lit++) {
+ const Layer* layer = *(lit);
+ ALOGD("Layer %p, fbo %d, buildlayered %d",
+ layer, layer->getFbo(), layer->wasBuildLayered);
+ }
LOG_ALWAYS_FATAL("layers have survived gl context destruction");
}
}
diff --git a/libs/hwui/RenderState.h b/libs/hwui/RenderState.h
index c7ab197..74bafca 100644
--- a/libs/hwui/RenderState.h
+++ b/libs/hwui/RenderState.h
@@ -19,6 +19,7 @@
#include <set>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
+#include <utils/Mutex.h>
#include <private/hwui/DrawGlInfo.h>
@@ -52,9 +53,11 @@
void debugOverdraw(bool enable, bool clear);
void registerLayer(const Layer* layer) {
+ AutoMutex _lock(mLayerLock);
mActiveLayers.insert(layer);
}
void unregisterLayer(const Layer* layer) {
+ AutoMutex _lock(mLayerLock);
mActiveLayers.erase(layer);
}
@@ -83,6 +86,7 @@
GLsizei mViewportWidth;
GLsizei mViewportHeight;
GLuint mFramebuffer;
+ Mutex mLayerLock;
};
} /* namespace uirenderer */
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 4129a89..5e6796c 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -150,7 +150,7 @@
if (mPrefetechedLayers.size() && info.mode == TreeInfo::MODE_FULL) {
info.canvasContext = this;
}
- mAnimationContext->startFrame();
+ mAnimationContext->startFrame(info.mode);
mRootRenderNode->prepareTree(info);
mAnimationContext->runRemainingAnimations(info);
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 3e8ee93..675916b 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -1622,8 +1622,7 @@
* @throws IllegalStateException if in the Uninitialized state.
*/
public MediaCodecInfo getCodecInfo() {
- return MediaCodecList.getCodecInfoAt(
- MediaCodecList.findCodecByName(getName()));
+ return MediaCodecList.getInfoFor(getName());
}
private native final ByteBuffer[] getBuffers(boolean input);
diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index 323a3e3..01f8193 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -321,6 +321,9 @@
// check feature support
for (Feature feat: getValidFeatures()) {
Integer yesNo = (Integer)map.get(MediaFormat.KEY_FEATURE_ + feat.mName);
+ if (yesNo == null) {
+ continue;
+ }
if ((yesNo == 1 && !isFeatureSupported(feat.mName)) ||
(yesNo == 0 && isFeatureRequired(feat.mName))) {
return false;
@@ -414,7 +417,7 @@
* profile} and {@code level}. If the type, or profile-level combination
* is not understood by the framework, it returns null.
*/
- public static CodecCapabilities CreateFromProfileLevel(
+ public static CodecCapabilities createFromProfileLevel(
String mime, int profile, int level) {
CodecProfileLevel pl = new CodecProfileLevel();
pl.profile = profile;
@@ -470,13 +473,12 @@
Integer yesNo = (Integer)map.get(key);
if (yesNo == null) {
continue;
- } else if (yesNo > 0) {
- mFlagsRequired |= feat.mValue;
- mDefaultFormat.setInteger(key, 1);
- } else {
- mFlagsSupported |= feat.mValue;
- mDefaultFormat.setInteger(key, 1);
}
+ if (yesNo > 0) {
+ mFlagsRequired |= feat.mValue;
+ }
+ mFlagsSupported |= feat.mValue;
+ mDefaultFormat.setInteger(key, 1);
// TODO restrict features by mFlagsVerified once all codecs reliably verify them
}
}
diff --git a/media/java/android/media/MediaCodecList.java b/media/java/android/media/MediaCodecList.java
index 5084c5c..85e9b16 100644
--- a/media/java/android/media/MediaCodecList.java
+++ b/media/java/android/media/MediaCodecList.java
@@ -116,6 +116,11 @@
/* package private */ static native final int findCodecByName(String codec);
+ /** @hide */
+ public static MediaCodecInfo getInfoFor(String codec) {
+ return sAllCodecInfos[findCodecByName(codec)];
+ }
+
private static native final void native_init();
/**
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index 46b8871..704e4a1 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -102,7 +102,7 @@
/**
* The ID of the TV input to provide to the setup activity and settings activity.
*/
- public static final String EXTRA_INPUT_ID = "inputId";
+ public static final String EXTRA_INPUT_ID = "android.media.tv.extra.INPUT_ID";
private static SparseIntArray sHardwareTypeToTvInputType = new SparseIntArray();
@@ -319,9 +319,9 @@
}
/**
- * Returns an intent to start the setup activity for this TV input service.
+ * Returns an intent to start the setup activity for this TV input.
*/
- public Intent getIntentForSetupActivity() {
+ public Intent createSetupIntent() {
if (!TextUtils.isEmpty(mSetupActivity)) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(mService.serviceInfo.packageName, mSetupActivity);
@@ -332,9 +332,9 @@
}
/**
- * Returns an intent to start the settings activity for this TV input service.
+ * Returns an intent to start the settings activity for this TV input.
*/
- public Intent getIntentForSettingsActivity() {
+ public Intent createSettingsIntent() {
if (!TextUtils.isEmpty(mSettingsActivity)) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName(mService.serviceInfo.packageName, mSettingsActivity);
@@ -532,10 +532,6 @@
DELIMITER_INFO_IN_ID, PREFIX_HARDWARE_DEVICE, hardwareInfo.getDeviceId());
}
- /**
- * Used to make this class parcelable.
- * @hide
- */
public static final Parcelable.Creator<TvInputInfo> CREATOR =
new Parcelable.Creator<TvInputInfo>() {
@Override
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index ddc383a..d2deb66 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -75,7 +75,7 @@
* The TV input is connected.
* <p>
* State for {@link #getInputState} and {@link
- * TvInputManager.TvInputListener#onInputStateChanged}.
+ * TvInputManager.TvInputCallback#onInputStateChanged}.
* </p>
*/
public static final int INPUT_STATE_CONNECTED = 0;
@@ -84,7 +84,7 @@
* fully ready.
* <p>
* State for {@link #getInputState} and {@link
- * TvInputManager.TvInputListener#onInputStateChanged}.
+ * TvInputManager.TvInputCallback#onInputStateChanged}.
* </p>
*/
public static final int INPUT_STATE_CONNECTED_STANDBY = 1;
@@ -92,7 +92,7 @@
* The TV input is disconnected.
* <p>
* State for {@link #getInputState} and {@link
- * TvInputManager.TvInputListener#onInputStateChanged}.
+ * TvInputManager.TvInputCallback#onInputStateChanged}.
* </p>
*/
public static final int INPUT_STATE_DISCONNECTED = 2;
@@ -102,14 +102,14 @@
* {@link #isRatingBlocked}.
*/
public static final String ACTION_BLOCKED_RATINGS_CHANGED =
- "android.media.tv.TvInputManager.ACTION_BLOCKED_RATINGS_CHANGED";
+ "android.media.tv.action.BLOCKED_RATINGS_CHANGED";
/**
* Broadcast intent action when the parental controls enabled state changes. For use with the
* {@link #isParentalControlsEnabled}.
*/
public static final String ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED =
- "android.media.tv.TvInputManager.ACTION_PARENTAL_CONTROLS_ENABLED_CHANGED";
+ "android.media.tv.action.PARENTAL_CONTROLS_ENABLED_CHANGED";
/**
* Broadcast intent action used to query available content rating systems.
@@ -143,7 +143,7 @@
* @see TvContentRating
*/
public static final String ACTION_QUERY_CONTENT_RATING_SYSTEMS =
- "android.media.tv.TvInputManager.ACTION_QUERY_CONTENT_RATING_SYSTEMS";
+ "android.media.tv.action.QUERY_CONTENT_RATING_SYSTEMS";
/**
* Content rating systems metadata associated with {@link #ACTION_QUERY_CONTENT_RATING_SYSTEMS}.
@@ -153,15 +153,15 @@
* </p>
*/
public static final String META_DATA_CONTENT_RATING_SYSTEMS =
- "android.media.tv.TvInputManager.META_DATA_CONTENT_RATING_SYSTEMS";
+ "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
private final ITvInputManager mService;
private final Object mLock = new Object();
// @GuardedBy(mLock)
- private final List<TvInputListenerRecord> mTvInputListenerRecordsList =
- new LinkedList<TvInputListenerRecord>();
+ private final List<TvInputCallbackRecord> mCallbackRecords =
+ new LinkedList<TvInputCallbackRecord>();
// A mapping from TV input ID to the state of corresponding input.
// @GuardedBy(mLock)
@@ -177,7 +177,7 @@
private final ITvInputClient mClient;
- private final ITvInputManagerCallback mCallback;
+ private final ITvInputManagerCallback mManagerCallback;
private final int mUserId;
@@ -445,9 +445,9 @@
}
/**
- * Interface used to monitor status of the TV input.
+ * Callback used to monitor status of the TV input.
*/
- public abstract static class TvInputListener {
+ public abstract static class TvInputCallback {
/**
* This is called when the state of a given TV input is changed.
*
@@ -479,24 +479,24 @@
}
}
- private static final class TvInputListenerRecord {
- private final TvInputListener mListener;
+ private static final class TvInputCallbackRecord {
+ private final TvInputCallback mCallback;
private final Handler mHandler;
- public TvInputListenerRecord(TvInputListener listener, Handler handler) {
- mListener = listener;
+ public TvInputCallbackRecord(TvInputCallback callback, Handler handler) {
+ mCallback = callback;
mHandler = handler;
}
- public TvInputListener getListener() {
- return mListener;
+ public TvInputCallback getCallback() {
+ return mCallback;
}
public void postInputStateChanged(final String inputId, final int state) {
mHandler.post(new Runnable() {
@Override
public void run() {
- mListener.onInputStateChanged(inputId, state);
+ mCallback.onInputStateChanged(inputId, state);
}
});
}
@@ -505,7 +505,7 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- mListener.onInputAdded(inputId);
+ mCallback.onInputAdded(inputId);
}
});
}
@@ -514,7 +514,7 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- mListener.onInputRemoved(inputId);
+ mCallback.onInputRemoved(inputId);
}
});
}
@@ -677,12 +677,12 @@
}
}
};
- mCallback = new ITvInputManagerCallback.Stub() {
+ mManagerCallback = new ITvInputManagerCallback.Stub() {
@Override
public void onInputStateChanged(String inputId, int state) {
synchronized (mLock) {
mStateMap.put(inputId, state);
- for (TvInputListenerRecord record : mTvInputListenerRecordsList) {
+ for (TvInputCallbackRecord record : mCallbackRecords) {
record.postInputStateChanged(inputId, state);
}
}
@@ -692,7 +692,7 @@
public void onInputAdded(String inputId) {
synchronized (mLock) {
mStateMap.put(inputId, INPUT_STATE_CONNECTED);
- for (TvInputListenerRecord record : mTvInputListenerRecordsList) {
+ for (TvInputCallbackRecord record : mCallbackRecords) {
record.postInputAdded(inputId);
}
}
@@ -702,14 +702,14 @@
public void onInputRemoved(String inputId) {
synchronized (mLock) {
mStateMap.remove(inputId);
- for (TvInputListenerRecord record : mTvInputListenerRecordsList) {
+ for (TvInputCallbackRecord record : mCallbackRecords) {
record.postInputRemoved(inputId);
}
}
}
};
try {
- mService.registerCallback(mCallback, mUserId);
+ mService.registerCallback(mManagerCallback, mUserId);
} catch (RemoteException e) {
Log.e(TAG, "mService.registerCallback failed: " + e);
}
@@ -771,39 +771,39 @@
}
/**
- * Registers a {@link TvInputListener}.
+ * Registers a {@link TvInputCallback}.
*
- * @param listener A listener used to monitor status of the TV inputs.
+ * @param callback A callback used to monitor status of the TV inputs.
* @param handler A {@link Handler} that the status change will be delivered to.
* @throws IllegalArgumentException if any of the arguments is {@code null}.
*/
- public void registerListener(TvInputListener listener, Handler handler) {
- if (listener == null) {
+ public void registerCallback(TvInputCallback callback, Handler handler) {
+ if (callback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
if (handler == null) {
throw new IllegalArgumentException("handler cannot be null");
}
synchronized (mLock) {
- mTvInputListenerRecordsList.add(new TvInputListenerRecord(listener, handler));
+ mCallbackRecords.add(new TvInputCallbackRecord(callback, handler));
}
}
/**
- * Unregisters the existing {@link TvInputListener}.
+ * Unregisters the existing {@link TvInputCallback}.
*
- * @param listener The existing listener to remove.
+ * @param callback The existing callback to remove.
* @throws IllegalArgumentException if any of the arguments is {@code null}.
*/
- public void unregisterListener(final TvInputListener listener) {
- if (listener == null) {
+ public void unregisterCallback(final TvInputCallback callback) {
+ if (callback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
synchronized (mLock) {
- for (Iterator<TvInputListenerRecord> it = mTvInputListenerRecordsList.iterator();
+ for (Iterator<TvInputCallbackRecord> it = mCallbackRecords.iterator();
it.hasNext(); ) {
- TvInputListenerRecord record = it.next();
- if (record.getListener() == listener) {
+ TvInputCallbackRecord record = it.next();
+ if (record.getCallback() == callback) {
it.remove();
break;
}
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index f4c761e..4171e6d 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -83,7 +83,7 @@
private Rect mOverlayViewFrame;
private final TvInputManager mTvInputManager;
private MySessionCallback mSessionCallback;
- private TvInputListener mListener;
+ private TvInputCallback mCallback;
private OnUnhandledInputEventListener mOnUnhandledInputEventListener;
private boolean mHasStreamVolume;
private float mStreamVolume;
@@ -170,13 +170,13 @@
}
/**
- * Sets a listener for events in this TvView.
+ * Sets the callback to be invoked when an event is dispatched to this TvView.
*
- * @param listener The listener to be called with events. A value of {@code null} removes any
- * existing listener.
+ * @param callback The callback to receive events. A value of {@code null} removes any existing
+ * callbacks.
*/
- public void setTvInputListener(TvInputListener listener) {
- mListener = listener;
+ public void setCallback(TvInputCallback callback) {
+ mCallback = callback;
}
/**
@@ -680,9 +680,9 @@
}
/**
- * Interface used to receive various status updates on the {@link TvView}.
+ * Callback used to receive various status updates on the {@link TvView}.
*/
- public abstract static class TvInputListener {
+ public abstract static class TvInputCallback {
/**
* This is invoked when an error occurred while establishing a connection to the underlying
@@ -863,8 +863,8 @@
}
} else {
mSessionCallback = null;
- if (mListener != null) {
- mListener.onConnectionFailed(mInputId);
+ if (mCallback != null) {
+ mCallback.onConnectionFailed(mInputId);
}
}
}
@@ -878,8 +878,8 @@
mOverlayViewFrame = null;
mSessionCallback = null;
mSession = null;
- if (mListener != null) {
- mListener.onDisconnected(mInputId);
+ if (mCallback != null) {
+ mCallback.onDisconnected(mInputId);
}
}
@@ -891,8 +891,8 @@
if (DEBUG) {
Log.d(TAG, "onChannelChangedByTvInput(" + channelUri + ")");
}
- if (mListener != null) {
- mListener.onChannelRetuned(mInputId, channelUri);
+ if (mCallback != null) {
+ mCallback.onChannelRetuned(mInputId, channelUri);
}
}
@@ -904,8 +904,8 @@
if (DEBUG) {
Log.d(TAG, "onTracksChanged()");
}
- if (mListener != null) {
- mListener.onTracksChanged(mInputId, tracks);
+ if (mCallback != null) {
+ mCallback.onTracksChanged(mInputId, tracks);
}
}
@@ -918,8 +918,8 @@
Log.d(TAG, "onTrackSelected()");
}
// TODO: Update the video size when the type is TYPE_VIDEO.
- if (mListener != null) {
- mListener.onTrackSelected(mInputId, type, trackId);
+ if (mCallback != null) {
+ mCallback.onTrackSelected(mInputId, type, trackId);
}
}
@@ -931,8 +931,8 @@
if (DEBUG) {
Log.d(TAG, "onVideoAvailable()");
}
- if (mListener != null) {
- mListener.onVideoAvailable(mInputId);
+ if (mCallback != null) {
+ mCallback.onVideoAvailable(mInputId);
}
}
@@ -944,8 +944,8 @@
if (DEBUG) {
Log.d(TAG, "onVideoUnavailable(" + reason + ")");
}
- if (mListener != null) {
- mListener.onVideoUnavailable(mInputId, reason);
+ if (mCallback != null) {
+ mCallback.onVideoUnavailable(mInputId, reason);
}
}
@@ -957,8 +957,8 @@
if (DEBUG) {
Log.d(TAG, "onContentAllowed()");
}
- if (mListener != null) {
- mListener.onContentAllowed(mInputId);
+ if (mCallback != null) {
+ mCallback.onContentAllowed(mInputId);
}
}
@@ -970,8 +970,8 @@
if (DEBUG) {
Log.d(TAG, "onContentBlocked()");
}
- if (mListener != null) {
- mListener.onContentBlocked(mInputId, rating);
+ if (mCallback != null) {
+ mCallback.onContentBlocked(mInputId, rating);
}
}
@@ -1000,8 +1000,8 @@
if (DEBUG) {
Log.d(TAG, "onSessionEvent(" + eventType + ")");
}
- if (mListener != null) {
- mListener.onEvent(mInputId, eventType, eventArgs);
+ if (mCallback != null) {
+ mCallback.onEvent(mInputId, eventType, eventArgs);
}
}
}
diff --git a/packages/PrintSpooler/res/layout/preview_page_loading.xml b/packages/PrintSpooler/res/layout/preview_page_loading.xml
new file mode 100644
index 0000000..1af3a17
--- /dev/null
+++ b/packages/PrintSpooler/res/layout/preview_page_loading.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="fill_parent"
+ android:layout_height="fill_parent">
+
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="36dip"
+ android:layout_gravity="center"
+ android:src="@drawable/ic_grayedout_printer"
+ android:contentDescription="@null"
+ android:scaleType="centerInside"
+ android:adjustViewBounds="true">
+ </ImageView>
+
+</FrameLayout>
diff --git a/packages/PrintSpooler/res/values-land/constants.xml b/packages/PrintSpooler/res/values-land/constants.xml
index 6cf9754b5..84fc050 100644
--- a/packages/PrintSpooler/res/values-land/constants.xml
+++ b/packages/PrintSpooler/res/values-land/constants.xml
@@ -16,7 +16,7 @@
<resources>
- <integer name="preview_page_per_row_count">2</integer>
+ <integer name="preview_page_per_row_count">4</integer>
<integer name="print_option_column_count">3</integer>
diff --git a/packages/PrintSpooler/res/values/strings.xml b/packages/PrintSpooler/res/values/strings.xml
index 5b7fda3..27e1d51 100644
--- a/packages/PrintSpooler/res/values/strings.xml
+++ b/packages/PrintSpooler/res/values/strings.xml
@@ -76,7 +76,6 @@
<!-- Title for the print dialog announced to the user for accessibility. Not shown in the UI. [CHAR LIMIT=none] -->
<string name="print_dialog">Print dialog</string>
-
<!-- Template for the message that shows the current page out of the total number of pages -->
<string name="current_page_template"><xliff:g id="current_page">%1$d</xliff:g>
/<xliff:g id="page_count">%2$d</xliff:g></string>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
index 09e8b39..1e7a011 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
@@ -317,6 +317,11 @@
return mState == STATE_FAILED;
}
+ public boolean hasLaidOutPages() {
+ return mDocumentInfo.info != null
+ && mDocumentInfo.info.getPageCount() > 0;
+ }
+
public void clearUpdateError() {
if (!hasUpdateError()) {
throw new IllegalStateException("No update error to clear");
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
index d949673..ce0b9b6 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PageAdapter.java
@@ -17,6 +17,9 @@
package com.android.printspooler.ui;
import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.drawable.BitmapDrawable;
import android.os.ParcelFileDescriptor;
import android.print.PageRange;
import android.print.PrintAttributes.MediaSize;
@@ -26,12 +29,12 @@
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.util.Log;
import android.util.SparseArray;
-import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
+import android.view.View.MeasureSpec;
import android.widget.TextView;
import com.android.printspooler.R;
import com.android.printspooler.model.PageContentRepository;
@@ -48,7 +51,7 @@
* This class represents the adapter for the pages in the print preview list.
*/
public final class PageAdapter extends Adapter implements
- PageContentRepository.OnMalformedPdfFileListener{
+ PageContentRepository.OnMalformedPdfFileListener {
private static final String LOG_TAG = "PageAdapter";
private static final int MAX_PREVIEW_PAGES_BATCH = 50;
@@ -86,6 +89,8 @@
// Pages the user selected in the UI.
private PageRange[] mSelectedPages;
+ private BitmapDrawable mEmptyState;
+
private int mDocumentPageCount = PrintDocumentInfo.PAGE_COUNT_UNKNOWN;
private int mSelectedPageCount;
@@ -257,7 +262,7 @@
}
if (updatePreviewAreaAndPageSize) {
- updatePreviewAreaAndPageSize();
+ updatePreviewAreaPageSizeAndEmptyState();
}
if (documentChanged) {
@@ -318,12 +323,12 @@
}
// OK, there are bugs in recycler view which tries to bind views
- // without recycling them which would give us a chane to clean up.
+ // without recycling them which would give us a chance to clean up.
PageContentProvider boundProvider = mPageContentRepository
- .peekPageContentProvider(pageIndexInFile);
+ .peekPageContentProvider(pageIndexInFile);
if (boundProvider != null) {
PageContentView owner = (PageContentView) boundProvider.getOwner();
- owner.init(null, mMediaSize, mMinMargins);
+ owner.init(null, mEmptyState, mMediaSize, mMinMargins);
mPageContentRepository.releasePageContentProvider(boundProvider);
}
@@ -333,7 +338,7 @@
} else {
onSelectedPageNotInFile(pageInDocument);
}
- content.init(provider, mMediaSize, mMinMargins);
+ content.init(provider, mEmptyState, mMediaSize, mMinMargins);
View pageSelector = page.findViewById(R.id.page_selector);
pageSelector.setTag(myHolder);
@@ -384,7 +389,7 @@
mSelectedPages = selectedPages;
mSelectedPageCount = PageRangeUtils.getNormalizedPageCount(
mSelectedPages, mDocumentPageCount);
- updatePreviewAreaAndPageSize();
+ updatePreviewAreaPageSizeAndEmptyState();
notifyDataSetChanged();
}
return mSelectedPages;
@@ -392,12 +397,12 @@
public void onPreviewAreaSizeChanged() {
if (mMediaSize != null) {
- updatePreviewAreaAndPageSize();
+ updatePreviewAreaPageSizeAndEmptyState();
notifyDataSetChanged();
}
}
- private void updatePreviewAreaAndPageSize() {
+ private void updatePreviewAreaPageSizeAndEmptyState() {
final int availableWidth = mPreviewArea.getWidth();
final int availableHeight = mPreviewArea.getHeight();
@@ -419,7 +424,7 @@
final int pageContentDesiredHeight = (int) (((float) pageContentDesiredWidth
/ pageAspectRatio) + 0.5f);
- // If the page does not fit entirely in a vertial direction,
+ // If the page does not fit entirely in a vertical direction,
// we shirk it but not less than the minimal page width.
final int pageContentMinHeight = (int) (mPreviewPageMinWidth / pageAspectRatio + 0.5f);
final int pageContentMaxHeight = Math.max(pageContentMinHeight,
@@ -448,6 +453,23 @@
mPreviewArea.setPadding(horizontalPadding, verticalPadding,
horizontalPadding, verticalPadding);
+
+ // Now update the empty state drawable, as it depends on the page
+ // size and is reused for all views for better performance.
+ LayoutInflater inflater = LayoutInflater.from(mContext);
+ View content = inflater.inflate(R.layout.preview_page_loading, null, false);
+ content.measure(MeasureSpec.makeMeasureSpec(mPageContentWidth, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(mPageContentHeight, MeasureSpec.EXACTLY));
+ content.layout(0, 0, content.getMeasuredWidth(), content.getMeasuredHeight());
+
+ Bitmap bitmap = Bitmap.createBitmap(mPageContentWidth, mPageContentHeight,
+ Bitmap.Config.ARGB_8888);
+ Canvas canvas = new Canvas(bitmap);
+ content.draw(canvas);
+
+ // Do not recycle the old bitmap if such as it may be set as an empty
+ // state to any of the page views. Just let the GC take care of it.
+ mEmptyState = new BitmapDrawable(mContext.getResources(), bitmap);
}
private PageRange[] computeSelectedPages() {
@@ -718,7 +740,7 @@
private void recyclePageView(PageContentView page, int pageIndexInAdapter) {
PageContentProvider provider = page.getPageContentProvider();
if (provider != null) {
- page.init(null, null, null);
+ page.init(null, null, null, null);
mPageContentRepository.releasePageContentProvider(provider);
mBoundPagesInAdapter.remove(pageIndexInAdapter);
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index 022e0d0..535081f 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -114,14 +114,15 @@
private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE;
private static final int DEST_ADAPTER_ITEM_ID_ALL_PRINTERS = Integer.MAX_VALUE - 1;
- private static final int STATE_CONFIGURING = 0;
- private static final int STATE_PRINT_CONFIRMED = 1;
- private static final int STATE_PRINT_CANCELED = 2;
- private static final int STATE_UPDATE_FAILED = 3;
- private static final int STATE_CREATE_FILE_FAILED = 4;
- private static final int STATE_PRINTER_UNAVAILABLE = 5;
- private static final int STATE_UPDATE_SLOW = 6;
- private static final int STATE_PRINT_COMPLETED = 7;
+ private static final int STATE_INITIALIZING = 0;
+ private static final int STATE_CONFIGURING = 1;
+ private static final int STATE_PRINT_CONFIRMED = 2;
+ private static final int STATE_PRINT_CANCELED = 3;
+ private static final int STATE_UPDATE_FAILED = 4;
+ private static final int STATE_CREATE_FILE_FAILED = 5;
+ private static final int STATE_PRINTER_UNAVAILABLE = 6;
+ private static final int STATE_UPDATE_SLOW = 7;
+ private static final int STATE_PRINT_COMPLETED = 8;
private static final int UI_STATE_PREVIEW = 0;
private static final int UI_STATE_ERROR = 1;
@@ -196,7 +197,7 @@
private int mCurrentPageCount;
- private int mState;
+ private int mState = STATE_INITIALIZING;
private int mUiState = UI_STATE_PREVIEW;
@@ -290,10 +291,17 @@
mPrintedDocument.start();
ensurePreviewUiShown();
+
+ setState(STATE_CONFIGURING);
}
@Override
public void onPause() {
+ if (mState == STATE_INITIALIZING) {
+ super.onPause();
+ return;
+ }
+
if (isFinishing()) {
PrintSpoolerService spooler = mSpoolerProvider.getSpooler();
spooler.updatePrintJobUserConfigurableOptionsNoPersistence(mPrintJob);
@@ -341,9 +349,13 @@
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (mState == STATE_INITIALIZING) {
+ return super.onKeyUp(keyCode, event);
+ }
+
if (keyCode == KeyEvent.KEYCODE_BACK
&& event.isTracking() && !event.isCanceled()) {
- if (mPrintPreviewController != null&&mPrintPreviewController.isOptionsOpened()
+ if (mPrintPreviewController != null && mPrintPreviewController.isOptionsOpened()
&& !hasErrors()) {
mPrintPreviewController.closeOptions();
} else {
@@ -900,7 +912,7 @@
final boolean willUpdate = mPrintedDocument.update(mPrintJob.getAttributes(),
pages, preview);
- if (willUpdate) {
+ if (willUpdate && !mPrintedDocument.hasLaidOutPages()) {
// When the update is done we update the print preview.
mProgressMessageController.post();
return true;
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
index 2b5b41b..a25e05e 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintPreviewController.java
@@ -195,6 +195,7 @@
if (mPageAdapter.isOpened()) {
mPageAdapter.close(null);
}
+ mRecyclerView.setAdapter(null);
mPageAdapter.destroy();
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
index 23a01bd..e2ae758 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/widget/PageContentView.java
@@ -17,17 +17,15 @@
package com.android.printspooler.widget;
import android.content.Context;
-import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Margins;
import android.util.AttributeSet;
-import android.util.TypedValue;
import android.view.View;
import com.android.printspooler.model.PageContentRepository;
-import com.android.printspooler.model.PageContentRepository.PageContentProvider;
import com.android.printspooler.model.PageContentRepository.RenderSpec;
+import com.android.printspooler.model.PageContentRepository.PageContentProvider;
/**
* This class represents a page in the print preview list. The width of the page
@@ -37,35 +35,20 @@
*/
public class PageContentView extends View
implements PageContentRepository.OnPageContentAvailableCallback {
-
- private final ColorDrawable mEmptyState;
-
private PageContentProvider mProvider;
private MediaSize mMediaSize;
private Margins mMinMargins;
+ private Drawable mEmptyState;
+
private boolean mContentRequested;
private boolean mNeedsLayout;
public PageContentView(Context context, AttributeSet attrs) {
super(context, attrs);
-
- TypedValue typedValue = new TypedValue();
- context.getTheme().resolveAttribute(com.android.internal.R.attr.textColorPrimary,
- typedValue, true);
-
- mEmptyState = new ColorDrawable(typedValue.data);
-
- setBackground(mEmptyState);
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- requestPageContentIfNeeded();
}
@Override
@@ -85,15 +68,19 @@
return mProvider;
}
- public void init(PageContentProvider provider, MediaSize mediaSize, Margins minMargins) {
+ public void init(PageContentProvider provider, Drawable emptyState,
+ MediaSize mediaSize, Margins minMargins) {
final boolean providerChanged = (mProvider == null)
? provider != null : !mProvider.equals(provider);
+ final boolean loadingDrawableChanged = (mEmptyState == null)
+ ? mEmptyState != null : !mEmptyState.equals(emptyState);
final boolean mediaSizeChanged = (mMediaSize == null)
? mediaSize != null : !mMediaSize.equals(mediaSize);
final boolean marginsChanged = (mMinMargins == null)
? minMargins != null : !mMinMargins.equals(minMargins);
- if (!providerChanged && !mediaSizeChanged && !marginsChanged) {
+ if (!providerChanged && !mediaSizeChanged
+ && !marginsChanged && !loadingDrawableChanged) {
return;
}
@@ -101,6 +88,7 @@
mMediaSize = mediaSize;
mMinMargins = minMargins;
+ mEmptyState = emptyState;
mContentRequested = false;
mNeedsLayout = mNeedsLayout || mediaSizeChanged || marginsChanged;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SecureCameraLaunchManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SecureCameraLaunchManager.java
index 562f550..3f5cf3f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SecureCameraLaunchManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SecureCameraLaunchManager.java
@@ -85,12 +85,12 @@
private KeyguardBottomAreaView mKeyguardBottomArea;
private CameraManager mCameraManager;
- private CameraAvailabilityListener mCameraAvailabilityListener;
+ private CameraAvailabilityCallback mCameraAvailabilityCallback;
private Map<String, Boolean> mCameraAvailabilityMap;
private boolean mWaitingToLaunchSecureCamera;
private Runnable mLaunchCameraRunnable;
- private class CameraAvailabilityListener extends CameraManager.AvailabilityListener {
+ private class CameraAvailabilityCallback extends CameraManager.AvailabilityCallback {
@Override
public void onCameraUnavailable(String cameraId) {
if (DEBUG) Log.d(TAG, "onCameraUnavailble(" + cameraId + ")");
@@ -123,10 +123,10 @@
mKeyguardBottomArea = keyguardBottomArea;
mCameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
- mCameraAvailabilityListener = new CameraAvailabilityListener();
+ mCameraAvailabilityCallback = new CameraAvailabilityCallback();
// An onCameraAvailable() or onCameraUnavailable() callback will be received for each camera
- // when the availability listener is registered, thus initializing the map.
+ // when the availability callback is registered, thus initializing the map.
//
// Keeping track of the state of all cameras using the onCameraAvailable() and
// onCameraUnavailable() callbacks can get messy when dealing with hot-pluggable cameras.
@@ -150,14 +150,14 @@
* Initializes the SecureCameraManager and starts listening for camera availability.
*/
public void create() {
- mCameraManager.addAvailabilityListener(mCameraAvailabilityListener, mHandler);
+ mCameraManager.registerAvailabilityCallback(mCameraAvailabilityCallback, mHandler);
}
/**
* Stops listening for camera availability and cleans up the SecureCameraManager.
*/
public void destroy() {
- mCameraManager.removeAvailabilityListener(mCameraAvailabilityListener);
+ mCameraManager.unregisterAvailabilityCallback(mCameraAvailabilityCallback);
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
index 70eaa5c..6f021ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/FlashlightController.java
@@ -81,7 +81,7 @@
if (mCameraId != null) {
ensureHandler();
- mCameraManager.addAvailabilityListener(mAvailabilityListener, mHandler);
+ mCameraManager.registerAvailabilityCallback(mAvailabilityCallback, mHandler);
}
}
@@ -339,8 +339,8 @@
}
};
- private final CameraManager.AvailabilityListener mAvailabilityListener =
- new CameraManager.AvailabilityListener() {
+ private final CameraManager.AvailabilityCallback mAvailabilityCallback =
+ new CameraManager.AvailabilityCallback() {
@Override
public void onCameraAvailable(String cameraId) {
if (DEBUG) Log.d(TAG, "onCameraAvailable(" + cameraId + ")");
diff --git a/services/core/java/com/android/server/NativeDaemonEvent.java b/services/core/java/com/android/server/NativeDaemonEvent.java
index 2095152..59d50bd 100644
--- a/services/core/java/com/android/server/NativeDaemonEvent.java
+++ b/services/core/java/com/android/server/NativeDaemonEvent.java
@@ -201,20 +201,16 @@
}
while (current < length) {
// find the end of the word
- if (quoted) {
- wordEnd = current;
- while ((wordEnd = rawEvent.indexOf('\"', wordEnd)) != -1) {
- if (rawEvent.charAt(wordEnd - 1) != '\\') {
- break;
- } else {
- wordEnd++; // skip this escaped quote and keep looking
- }
+ char terminator = quoted ? '\"' : ' ';
+ wordEnd = current;
+ while (wordEnd < length && rawEvent.charAt(wordEnd) != terminator) {
+ if (rawEvent.charAt(wordEnd) == '\\') {
+ // skip the escaped char
+ ++wordEnd;
}
- } else {
- wordEnd = rawEvent.indexOf(' ', current);
+ ++wordEnd;
}
- // if we didn't find the end-o-word token, take the rest of the string
- if (wordEnd == -1) wordEnd = length;
+ if (wordEnd > length) wordEnd = length;
String word = rawEvent.substring(current, wordEnd);
current += word.length();
if (!quoted) {
diff --git a/services/core/java/com/android/server/NsdService.java b/services/core/java/com/android/server/NsdService.java
index cf7e65c..cb1748d 100644
--- a/services/core/java/com/android/server/NsdService.java
+++ b/services/core/java/com/android/server/NsdService.java
@@ -397,8 +397,7 @@
break;
case NsdManager.NATIVE_DAEMON_EVENT:
NativeEvent event = (NativeEvent) msg.obj;
- if (!handleNativeEvent(event.code, event.raw,
- NativeDaemonEvent.unescapeArgs(event.raw))) {
+ if (!handleNativeEvent(event.code, event.raw, event.cooked)) {
result = NOT_HANDLED;
}
break;
@@ -474,8 +473,14 @@
case NativeResponseCode.SERVICE_RESOLVED:
/* NNN resolveId fullName hostName port txtlen txtdata */
if (DBG) Slog.d(TAG, "SERVICE_RESOLVED Raw: " + raw);
- int index = cooked[2].indexOf(".");
- if (index == -1) {
+ int index = 0;
+ while (index < cooked[2].length() && cooked[2].charAt(index) != '.') {
+ if (cooked[2].charAt(index) == '\\') {
+ ++index;
+ }
+ ++index;
+ }
+ if (index >= cooked[2].length()) {
Slog.e(TAG, "Invalid service found " + raw);
break;
}
@@ -483,6 +488,8 @@
String rest = cooked[2].substring(index);
String type = rest.replace(".local.", "");
+ name = unescape(name);
+
clientInfo.mResolvedService.setServiceName(name);
clientInfo.mResolvedService.setServiceType(type);
clientInfo.mResolvedService.setPort(Integer.parseInt(cooked[4]));
@@ -541,6 +548,30 @@
}
}
+ private String unescape(String s) {
+ StringBuilder sb = new StringBuilder(s.length());
+ for (int i = 0; i < s.length(); ++i) {
+ char c = s.charAt(i);
+ if (c == '\\') {
+ if (++i >= s.length()) {
+ Slog.e(TAG, "Unexpected end of escape sequence in: " + s);
+ break;
+ }
+ c = s.charAt(i);
+ if (c != '.' && c != '\\') {
+ if (i + 2 >= s.length()) {
+ Slog.e(TAG, "Unexpected end of escape sequence in: " + s);
+ break;
+ }
+ c = (char) ((c-'0') * 100 + (s.charAt(i+1)-'0') * 10 + (s.charAt(i+2)-'0'));
+ i += 2;
+ }
+ }
+ sb.append(c);
+ }
+ return sb.toString();
+ }
+
private NativeDaemonConnector mNativeConnector;
private final CountDownLatch mNativeDaemonConnected = new CountDownLatch(1);
@@ -625,10 +656,12 @@
private class NativeEvent {
final int code;
final String raw;
+ final String[] cooked;
- NativeEvent(int code, String raw) {
+ NativeEvent(int code, String raw, String[] cooked) {
this.code = code;
this.raw = raw;
+ this.cooked = cooked;
}
}
@@ -644,7 +677,7 @@
public boolean onEvent(int code, String raw, String[] cooked) {
// TODO: NDC translates a message to a callback, we could enhance NDC to
// directly interact with a state machine through messages
- NativeEvent event = new NativeEvent(code, raw);
+ NativeEvent event = new NativeEvent(code, raw, cooked);
mNsdStateMachine.sendMessage(NsdManager.NATIVE_DAEMON_EVENT, event);
return true;
}
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index c469b42..888fa1a 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -265,7 +265,11 @@
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context1, Intent intent) {
- purgeOldGrantsAll();
+ // Don't delete accounts when updating a authenticator's
+ // package.
+ if (!intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ purgeOldGrantsAll();
+ }
}
}, intentFilter);
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index bc538ed..54f043d 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -69,6 +69,7 @@
import android.service.notification.IConditionListener;
import android.service.notification.IConditionProvider;
import android.service.notification.INotificationListener;
+import android.service.notification.IStatusBarNotificationHolder;
import android.service.notification.NotificationListenerService;
import android.service.notification.NotificationRankingUpdate;
import android.service.notification.StatusBarNotification;
@@ -2848,8 +2849,9 @@
private void notifyPosted(final ManagedServiceInfo info,
final StatusBarNotification sbn, NotificationRankingUpdate rankingUpdate) {
final INotificationListener listener = (INotificationListener)info.service;
+ StatusBarNotificationHolder sbnHolder = new StatusBarNotificationHolder(sbn);
try {
- listener.onNotificationPosted(sbn, rankingUpdate);
+ listener.onNotificationPosted(sbnHolder, rankingUpdate);
} catch (RemoteException ex) {
Log.e(TAG, "unable to notify listener (posted): " + listener, ex);
}
@@ -2861,8 +2863,9 @@
return;
}
final INotificationListener listener = (INotificationListener) info.service;
+ StatusBarNotificationHolder sbnHolder = new StatusBarNotificationHolder(sbn);
try {
- listener.onNotificationRemoved(sbn, rankingUpdate);
+ listener.onNotificationRemoved(sbnHolder, rankingUpdate);
} catch (RemoteException ex) {
Log.e(TAG, "unable to notify listener (removed): " + listener, ex);
}
@@ -2950,4 +2953,22 @@
return zen ? "zen" : ('\'' + pkgFilter + '\'');
}
}
+
+ /**
+ * Wrapper for a StatusBarNotification object that allows transfer across a oneway
+ * binder without sending large amounts of data over a oneway transaction.
+ */
+ private static final class StatusBarNotificationHolder
+ extends IStatusBarNotificationHolder.Stub {
+ private final StatusBarNotification mValue;
+
+ public StatusBarNotificationHolder(StatusBarNotification value) {
+ mValue = value;
+ }
+
+ @Override
+ public StatusBarNotification get() {
+ return mValue;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 9a00923..89ea905 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -897,10 +897,9 @@
private static class Callbacks extends Handler {
private static final int MSG_SESSION_CREATED = 1;
private static final int MSG_SESSION_BADGING_CHANGED = 2;
- private static final int MSG_SESSION_OPENED = 3;
+ private static final int MSG_SESSION_ACTIVE_CHANGED = 3;
private static final int MSG_SESSION_PROGRESS_CHANGED = 4;
- private static final int MSG_SESSION_CLOSED = 5;
- private static final int MSG_SESSION_FINISHED = 6;
+ private static final int MSG_SESSION_FINISHED = 5;
private final RemoteCallbackList<IPackageInstallerCallback>
mCallbacks = new RemoteCallbackList<>();
@@ -945,15 +944,12 @@
case MSG_SESSION_BADGING_CHANGED:
callback.onSessionBadgingChanged(sessionId);
break;
- case MSG_SESSION_OPENED:
- callback.onSessionOpened(sessionId);
+ case MSG_SESSION_ACTIVE_CHANGED:
+ callback.onSessionActiveChanged(sessionId, (boolean) msg.obj);
break;
case MSG_SESSION_PROGRESS_CHANGED:
callback.onSessionProgressChanged(sessionId, (float) msg.obj);
break;
- case MSG_SESSION_CLOSED:
- callback.onSessionClosed(sessionId);
- break;
case MSG_SESSION_FINISHED:
callback.onSessionFinished(sessionId, (boolean) msg.obj);
break;
@@ -968,18 +964,14 @@
obtainMessage(MSG_SESSION_BADGING_CHANGED, sessionId, userId).sendToTarget();
}
- private void notifySessionOpened(int sessionId, int userId) {
- obtainMessage(MSG_SESSION_OPENED, sessionId, userId).sendToTarget();
+ private void notifySessionActiveChanged(int sessionId, int userId, boolean active) {
+ obtainMessage(MSG_SESSION_ACTIVE_CHANGED, sessionId, userId, active).sendToTarget();
}
private void notifySessionProgressChanged(int sessionId, int userId, float progress) {
obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, userId, progress).sendToTarget();
}
- private void notifySessionClosed(int sessionId, int userId) {
- obtainMessage(MSG_SESSION_CLOSED, sessionId, userId).sendToTarget();
- }
-
public void notifySessionFinished(int sessionId, int userId, boolean success) {
obtainMessage(MSG_SESSION_FINISHED, sessionId, userId, success).sendToTarget();
}
@@ -1022,18 +1014,14 @@
writeSessionsAsync();
}
- public void onSessionOpened(PackageInstallerSession session) {
- mCallbacks.notifySessionOpened(session.sessionId, session.userId);
+ public void onSessionActiveChanged(PackageInstallerSession session, boolean active) {
+ mCallbacks.notifySessionActiveChanged(session.sessionId, session.userId, active);
}
public void onSessionProgressChanged(PackageInstallerSession session, float progress) {
mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress);
}
- public void onSessionClosed(PackageInstallerSession session) {
- mCallbacks.notifySessionClosed(session.sessionId, session.userId);
- }
-
public void onSessionFinished(PackageInstallerSession session, boolean success) {
mCallbacks.notifySessionFinished(session.sessionId, session.userId, success);
synchronized (mSessions) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 85ff54e..f8273c0 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -227,7 +227,7 @@
mResolvedBaseFile.getAbsolutePath() : null;
info.progress = mProgress;
info.sealed = mSealed;
- info.open = mOpenCount.get() > 0;
+ info.active = mOpenCount.get() > 0;
info.mode = params.mode;
info.sizeBytes = params.sizeBytes;
@@ -833,14 +833,14 @@
public void open() {
if (mOpenCount.getAndIncrement() == 0) {
- mCallback.onSessionOpened(this);
+ mCallback.onSessionActiveChanged(this, true);
}
}
@Override
public void close() {
if (mOpenCount.decrementAndGet() == 0) {
- mCallback.onSessionClosed(this);
+ mCallback.onSessionActiveChanged(this, false);
}
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index d2a627e..7b4270b 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -3783,21 +3783,25 @@
} else {
pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId);
}
- if ((flags&PackageManager.GET_PERMISSIONS) == 0) {
- if (numMatch == permissions.length) {
- pi.requestedPermissions = permissions;
- } else {
- pi.requestedPermissions = new String[numMatch];
- numMatch = 0;
- for (int i=0; i<permissions.length; i++) {
- if (tmp[i]) {
- pi.requestedPermissions[numMatch] = permissions[i];
- numMatch++;
+ // The above might return null in cases of uninstalled apps or install-state
+ // skew across users/profiles.
+ if (pi != null) {
+ if ((flags&PackageManager.GET_PERMISSIONS) == 0) {
+ if (numMatch == permissions.length) {
+ pi.requestedPermissions = permissions;
+ } else {
+ pi.requestedPermissions = new String[numMatch];
+ numMatch = 0;
+ for (int i=0; i<permissions.length; i++) {
+ if (tmp[i]) {
+ pi.requestedPermissions[numMatch] = permissions[i];
+ numMatch++;
+ }
}
}
}
+ list.add(pi);
}
- list.add(pi);
}
@Override
@@ -10260,7 +10264,7 @@
|| !bp.packageSetting.keySetData.isUsingUpgradeKeySets()
|| ((PackageSetting) bp.packageSetting).sharedUser != null) {
sigsOk = compareSignatures(bp.packageSetting.signatures.mSignatures,
- pkg.mSignatures) != PackageManager.SIGNATURE_MATCH;
+ pkg.mSignatures) == PackageManager.SIGNATURE_MATCH;
} else {
sigsOk = checkUpgradeKeySetLP((PackageSetting) bp.packageSetting, pkg);
}
diff --git a/telecomm/java/android/telecomm/RemoteConference.java b/telecomm/java/android/telecomm/RemoteConference.java
index 02f6de6..b073827 100644
--- a/telecomm/java/android/telecomm/RemoteConference.java
+++ b/telecomm/java/android/telecomm/RemoteConference.java
@@ -32,7 +32,7 @@
*/
public final class RemoteConference {
- public abstract static class Listener {
+ public abstract static class Callback {
public void onStateChanged(RemoteConference conference, int oldState, int newState) {}
public void onDisconnected(RemoteConference conference, int cause, String message) {}
public void onConnectionAdded(RemoteConference conference, RemoteConnection connection) {}
@@ -44,7 +44,7 @@
private final String mId;
private final IConnectionService mConnectionService;
- private final Set<Listener> mListeners = new CopyOnWriteArraySet<>();
+ private final Set<Callback> mCallbacks = new CopyOnWriteArraySet<>();
private final List<RemoteConnection> mChildConnections = new CopyOnWriteArrayList<>();
private final List<RemoteConnection> mUnmodifiableChildConnections =
Collections.unmodifiableList(mChildConnections);
@@ -70,8 +70,8 @@
for (RemoteConnection connection : mChildConnections) {
connection.setConference(null);
}
- for (Listener l : mListeners) {
- l.onDestroyed(this);
+ for (Callback c : mCallbacks) {
+ c.onDestroyed(this);
}
}
@@ -88,8 +88,8 @@
if (mState != newState) {
int oldState = mState;
mState = newState;
- for (Listener l : mListeners) {
- l.onStateChanged(this, oldState, newState);
+ for (Callback c : mCallbacks) {
+ c.onStateChanged(this, oldState, newState);
}
}
}
@@ -99,8 +99,8 @@
if (!mChildConnections.contains(connection)) {
mChildConnections.add(connection);
connection.setConference(this);
- for (Listener l : mListeners) {
- l.onConnectionAdded(this, connection);
+ for (Callback c : mCallbacks) {
+ c.onConnectionAdded(this, connection);
}
}
}
@@ -110,8 +110,8 @@
if (mChildConnections.contains(connection)) {
mChildConnections.remove(connection);
connection.setConference(null);
- for (Listener l : mListeners) {
- l.onConnectionRemoved(this, connection);
+ for (Callback c : mCallbacks) {
+ c.onConnectionRemoved(this, connection);
}
}
}
@@ -120,8 +120,8 @@
void setCallCapabilities(int capabilities) {
if (mCallCapabilities != capabilities) {
mCallCapabilities = capabilities;
- for (Listener l : mListeners) {
- l.onCapabilitiesChanged(this, mCallCapabilities);
+ for (Callback c : mCallbacks) {
+ c.onCapabilitiesChanged(this, mCallCapabilities);
}
}
}
@@ -132,8 +132,8 @@
mDisconnectCause = cause;
mDisconnectMessage = message;
setState(Connection.STATE_DISCONNECTED);
- for (Listener l : mListeners) {
- l.onDisconnected(this, cause, message);
+ for (Callback c : mCallbacks) {
+ c.onDisconnected(this, cause, message);
}
}
}
@@ -188,11 +188,11 @@
return mDisconnectMessage;
}
- public final void addListener(Listener listener) {
- mListeners.add(listener);
+ public final void addCallback(Callback callback) {
+ mCallbacks.add(callback);
}
- public final void removeListener(Listener listener) {
- mListeners.remove(listener);
+ public final void removeCallback(Callback callback) {
+ mCallbacks.remove(callback);
}
}
diff --git a/telecomm/java/android/telecomm/RemoteConnectionService.java b/telecomm/java/android/telecomm/RemoteConnectionService.java
index 0b6badb..79193c2 100644
--- a/telecomm/java/android/telecomm/RemoteConnectionService.java
+++ b/telecomm/java/android/telecomm/RemoteConnectionService.java
@@ -191,7 +191,7 @@
conference.setState(parcel.getState());
conference.setCallCapabilities(parcel.getCapabilities());
mConferenceById.put(callId, conference);
- conference.addListener(new RemoteConference.Listener() {
+ conference.addCallback(new RemoteConference.Callback() {
@Override
public void onDestroyed(RemoteConference c) {
mConferenceById.remove(callId);
diff --git a/telecomm/java/android/telecomm/TelecommManager.java b/telecomm/java/android/telecomm/TelecommManager.java
index b8f6964..5e9e6d0 100644
--- a/telecomm/java/android/telecomm/TelecommManager.java
+++ b/telecomm/java/android/telecomm/TelecommManager.java
@@ -46,34 +46,34 @@
*
* @hide
*/
- public static final String ACTION_INCOMING_CALL = "android.intent.action.INCOMING_CALL";
+ public static final String ACTION_INCOMING_CALL = "android.telecomm.action.INCOMING_CALL";
/**
* The {@link android.content.Intent} action used to configure a
* {@link android.telecomm.ConnectionService}.
*/
public static final String ACTION_CONNECTION_SERVICE_CONFIGURE =
- "android.intent.action.CONNECTION_SERVICE_CONFIGURE";
+ "android.telecomm.action.CONNECTION_SERVICE_CONFIGURE";
/**
* The {@link android.content.Intent} action used to show the call settings page.
*/
public static final String ACTION_SHOW_CALL_SETTINGS =
- "android.telecomm.intent.action.SHOW_CALL_SETTINGS";
+ "android.telecomm.action.SHOW_CALL_SETTINGS";
/**
* The {@link android.content.Intent} action used to show the settings page used to configure
* {@link PhoneAccount} preferences.
*/
public static final String ACTION_CHANGE_PHONE_ACCOUNTS =
- "android.telecomm.intent.action.CHANGE_PHONE_ACCOUNTS";
+ "android.telecomm.action.CHANGE_PHONE_ACCOUNTS";
/**
* Optional extra for {@link android.content.Intent#ACTION_CALL} containing a boolean that
* determines whether the speakerphone should be automatically turned on for an outgoing call.
*/
public static final String EXTRA_START_CALL_WITH_SPEAKERPHONE =
- "android.intent.extra.START_CALL_WITH_SPEAKERPHONE";
+ "android.telecomm.extra.START_CALL_WITH_SPEAKERPHONE";
/**
* Optional extra for {@link android.content.Intent#ACTION_CALL} containing an integer that
@@ -86,7 +86,7 @@
* @hide
*/
public static final String EXTRA_START_CALL_WITH_VIDEO_STATE =
- "android.intent.extra.START_CALL_WITH_VIDEO_STATE";
+ "android.telecomm.extra.START_CALL_WITH_VIDEO_STATE";
/**
* The extra used with an {@link android.content.Intent#ACTION_CALL} and
@@ -96,7 +96,7 @@
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
*/
public static final String EXTRA_PHONE_ACCOUNT_HANDLE =
- "android.intent.extra.PHONE_ACCOUNT_HANDLE";
+ "android.telecomm.extra.PHONE_ACCOUNT_HANDLE";
/**
* Optional extra for {@link #ACTION_INCOMING_CALL} containing a {@link Bundle} which contains
@@ -106,7 +106,7 @@
* @hide
*/
public static final String EXTRA_INCOMING_CALL_EXTRAS =
- "android.intent.extra.INCOMING_CALL_EXTRAS";
+ "android.telecomm.extra.INCOMING_CALL_EXTRAS";
/**
* Optional extra for {@link android.content.Intent#ACTION_CALL} and
@@ -117,7 +117,7 @@
* @hide
*/
public static final String EXTRA_OUTGOING_CALL_EXTRAS =
- "android.intent.extra.OUTGOING_CALL_EXTRAS";
+ "android.telecomm.extra.OUTGOING_CALL_EXTRAS";
/**
* Optional extra for {@link android.telephony.TelephonyManager#ACTION_PHONE_STATE_CHANGED}
@@ -203,7 +203,7 @@
* @hide
*/
public static final String ACTION_CURRENT_TTY_MODE_CHANGED =
- "android.telecomm.intent.action.CURRENT_TTY_MODE_CHANGED";
+ "android.telecomm.action.CURRENT_TTY_MODE_CHANGED";
/**
* The lookup key for an int that indicates the current TTY mode.
@@ -226,7 +226,7 @@
* @hide
*/
public static final String ACTION_TTY_PREFERRED_MODE_CHANGED =
- "android.telecomm.intent.action.TTY_PREFERRED_MODE_CHANGED";
+ "android.telecomm.action.TTY_PREFERRED_MODE_CHANGED";
/**
* The lookup key for an int that indicates preferred TTY mode. Valid modes are: -
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index 8af5e98..1d9e6a9 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -38,8 +38,8 @@
import static com.android.internal.telephony.PhoneConstants.SUBSCRIPTION_KEY;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY;
-import static com.android.internal.telephony.TelephonyProperties.PROPERTY_IDP_STRING;
import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_ISO_COUNTRY;
+import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_IDP_STRING;
import java.util.Locale;
import java.util.regex.Matcher;
@@ -2215,81 +2215,79 @@
cdmaCheckAndProcessPlusCodeByNumberFormat(String dialStr,int currFormat,int defaultFormat) {
String retStr = dialStr;
+ boolean useNanp = (currFormat == defaultFormat) && (currFormat == FORMAT_NANP);
+
// Checks if the plus sign character is in the passed-in dial string
if (dialStr != null &&
dialStr.lastIndexOf(PLUS_SIGN_STRING) != -1) {
- // Format the string based on the rules for the country the number is from,
- // and the current country the phone is camped on.
- if ((currFormat == defaultFormat) && (currFormat == FORMAT_NANP)) {
- // Handle case where default and current telephone numbering plans are NANP.
- String postDialStr = null;
- String tempDialStr = dialStr;
- // Sets the retStr to null since the conversion will be performed below.
- retStr = null;
- if (DBG) log("checkAndProcessPlusCode,dialStr=" + dialStr);
- // This routine is to process the plus sign in the dial string by loop through
- // the network portion, post dial portion 1, post dial portion 2... etc. if
- // applied
- do {
- String networkDialStr;
+ // Handle case where default and current telephone numbering plans are NANP.
+ String postDialStr = null;
+ String tempDialStr = dialStr;
+
+ // Sets the retStr to null since the conversion will be performed below.
+ retStr = null;
+ if (DBG) log("checkAndProcessPlusCode,dialStr=" + dialStr);
+ // This routine is to process the plus sign in the dial string by loop through
+ // the network portion, post dial portion 1, post dial portion 2... etc. if
+ // applied
+ do {
+ String networkDialStr;
+ // Format the string based on the rules for the country the number is from,
+ // and the current country the phone is camped
+ if (useNanp) {
networkDialStr = extractNetworkPortion(tempDialStr);
- // Handles the conversion within NANP
- networkDialStr = processPlusCodeWithinNanp(networkDialStr);
+ } else {
+ networkDialStr = extractNetworkPortionAlt(tempDialStr);
- // Concatenates the string that is converted from network portion
- if (!TextUtils.isEmpty(networkDialStr)) {
- if (retStr == null) {
- retStr = networkDialStr;
- } else {
- retStr = retStr.concat(networkDialStr);
- }
+ }
+
+ networkDialStr = processPlusCode(networkDialStr, useNanp);
+
+ // Concatenates the string that is converted from network portion
+ if (!TextUtils.isEmpty(networkDialStr)) {
+ if (retStr == null) {
+ retStr = networkDialStr;
} else {
- // This should never happen since we checked the if dialStr is null
- // and if it contains the plus sign in the beginning of this function.
- // The plus sign is part of the network portion.
- Rlog.e("checkAndProcessPlusCode: null newDialStr", networkDialStr);
- return dialStr;
+ retStr = retStr.concat(networkDialStr);
}
- postDialStr = extractPostDialPortion(tempDialStr);
- if (!TextUtils.isEmpty(postDialStr)) {
- int dialableIndex = findDialableIndexFromPostDialStr(postDialStr);
+ } else {
+ // This should never happen since we checked the if dialStr is null
+ // and if it contains the plus sign in the beginning of this function.
+ // The plus sign is part of the network portion.
+ Rlog.e("checkAndProcessPlusCode: null newDialStr", networkDialStr);
+ return dialStr;
+ }
+ postDialStr = extractPostDialPortion(tempDialStr);
+ if (!TextUtils.isEmpty(postDialStr)) {
+ int dialableIndex = findDialableIndexFromPostDialStr(postDialStr);
- // dialableIndex should always be greater than 0
- if (dialableIndex >= 1) {
- retStr = appendPwCharBackToOrigDialStr(dialableIndex,
- retStr,postDialStr);
- // Skips the P/W character, extracts the dialable portion
- tempDialStr = postDialStr.substring(dialableIndex);
- } else {
- // Non-dialable character such as P/W should not be at the end of
- // the dial string after P/W processing in CdmaConnection.java
- // Set the postDialStr to "" to break out of the loop
- if (dialableIndex < 0) {
- postDialStr = "";
- }
- Rlog.e("wrong postDialStr=", postDialStr);
+ // dialableIndex should always be greater than 0
+ if (dialableIndex >= 1) {
+ retStr = appendPwCharBackToOrigDialStr(dialableIndex,
+ retStr,postDialStr);
+ // Skips the P/W character, extracts the dialable portion
+ tempDialStr = postDialStr.substring(dialableIndex);
+ } else {
+ // Non-dialable character such as P/W should not be at the end of
+ // the dial string after P/W processing in CdmaConnection.java
+ // Set the postDialStr to "" to break out of the loop
+ if (dialableIndex < 0) {
+ postDialStr = "";
}
+ Rlog.e("wrong postDialStr=", postDialStr);
}
- if (DBG) log("checkAndProcessPlusCode,postDialStr=" + postDialStr);
- } while (!TextUtils.isEmpty(postDialStr) && !TextUtils.isEmpty(tempDialStr));
- } else {
- // TODO: Support NANP international conversion and other telephone numbering plans.
- // Currently the phone is never used in non-NANP system, so return the original
- // dial string.
- Rlog.e("checkAndProcessPlusCode:non-NANP not supported", dialStr);
- }
+ }
+ if (DBG) log("checkAndProcessPlusCode,postDialStr=" + postDialStr);
+ } while (!TextUtils.isEmpty(postDialStr) && !TextUtils.isEmpty(tempDialStr));
}
return retStr;
- }
+ }
- // This function gets the default international dialing prefix
- private static String getDefaultIdp( ) {
- String ps = null;
- SystemProperties.get(PROPERTY_IDP_STRING, ps);
- if (TextUtils.isEmpty(ps)) {
- ps = NANP_IDP_STRING;
- }
+ private static String getCurrentIdp(boolean useNanp) {
+ // in case, there is no IDD is found, we shouldn't convert it.
+ String ps = SystemProperties.get(
+ PROPERTY_OPERATOR_IDP_STRING, useNanp ? NANP_IDP_STRING : PLUS_SIGN_STRING);
return ps;
}
@@ -2399,31 +2397,32 @@
}
/**
- * This function handles the plus code conversion within NANP CDMA network
+ * This function handles the plus code conversion
* If the number format is
* 1)+1NANP,remove +,
* 2)other than +1NANP, any + numbers,replace + with the current IDP
*/
- private static String processPlusCodeWithinNanp(String networkDialStr) {
+ private static String processPlusCode(String networkDialStr, boolean useNanp) {
String retStr = networkDialStr;
- if (DBG) log("processPlusCodeWithinNanp,networkDialStr=" + networkDialStr);
+ if (DBG) log("processPlusCode, networkDialStr = " + networkDialStr
+ + "for NANP = " + useNanp);
// If there is a plus sign at the beginning of the dial string,
// Convert the plus sign to the default IDP since it's an international number
if (networkDialStr != null &&
networkDialStr.charAt(0) == PLUS_SIGN_CHAR &&
networkDialStr.length() > 1) {
String newStr = networkDialStr.substring(1);
- if (isOneNanp(newStr)) {
+ // TODO: for nonNanp, should the '+' be removed if following number is country code
+ if (useNanp && isOneNanp(newStr)) {
// Remove the leading plus sign
retStr = newStr;
- } else {
- String idpStr = getDefaultIdp();
- // Replaces the plus sign with the default IDP
- retStr = networkDialStr.replaceFirst("[+]", idpStr);
+ } else {
+ // Replaces the plus sign with the default IDP
+ retStr = networkDialStr.replaceFirst("[+]", getCurrentIdp(useNanp));
}
}
- if (DBG) log("processPlusCodeWithinNanp,retStr=" + retStr);
+ if (DBG) log("processPlusCode, retStr=" + retStr);
return retStr;
}
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 5ec4247..34992b8 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -123,8 +123,8 @@
/** Indicate the timer value for exiting emergency callback mode */
static final String PROPERTY_ECM_EXIT_TIMER = "ro.cdma.ecmexittimer";
- /** The international dialing prefix conversion string */
- static final String PROPERTY_IDP_STRING = "ro.cdma.idpstring";
+ /** the international dialing prefix of current operator network */
+ static final String PROPERTY_OPERATOR_IDP_STRING = "telephony.operator.idpstring";
/**
* Defines the schema for the carrier specified OTASP number
diff --git a/tests/Camera2Tests/CameraToo/src/com/example/android/camera2/cameratoo/CameraTooActivity.java b/tests/Camera2Tests/CameraToo/src/com/example/android/camera2/cameratoo/CameraTooActivity.java
index c630bad..d513f44 100644
--- a/tests/Camera2Tests/CameraToo/src/com/example/android/camera2/cameratoo/CameraTooActivity.java
+++ b/tests/Camera2Tests/CameraToo/src/com/example/android/camera2/cameratoo/CameraTooActivity.java
@@ -290,14 +290,14 @@
// Open the camera device
try {
- mCameraManager.openCamera(mCameraId, mCameraStateListener,
+ mCameraManager.openCamera(mCameraId, mCameraStateCallback,
mBackgroundHandler);
} catch (CameraAccessException ex) {
Log.e(TAG, "Failed to configure output surface", ex);
}
mGotSecondCallback = true;
- // Control flow continues in mCameraStateListener.onOpened()
+ // Control flow continues in mCameraStateCallback.onOpened()
}
}};
@@ -305,8 +305,8 @@
* Calledbacks invoked upon state changes in our {@code CameraDevice}. <p>These are run on
* {@code mBackgroundThread}.</p>
*/
- final CameraDevice.StateListener mCameraStateListener =
- new CameraDevice.StateListener() {
+ final CameraDevice.StateCallback mCameraStateCallback =
+ new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
Log.i(TAG, "Successfully opened camera");
@@ -337,8 +337,8 @@
* Callbacks invoked upon state changes in our {@code CameraCaptureSession}. <p>These are run on
* {@code mBackgroundThread}.</p>
*/
- final CameraCaptureSession.StateListener mCaptureSessionListener =
- new CameraCaptureSession.StateListener() {
+ final CameraCaptureSession.StateCallback mCaptureSessionListener =
+ new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
Log.i(TAG, "Finished configuring camera outputs");
diff --git a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/Camera2Source.java b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/Camera2Source.java
index 05057f2..07dfb54 100644
--- a/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/Camera2Source.java
+++ b/tests/Camera2Tests/SmartCamera/SimpleCamera/src/androidx/media/filterfw/samples/simplecamera/Camera2Source.java
@@ -38,7 +38,7 @@
import android.view.Surface;
import com.android.ex.camera2.blocking.BlockingCameraManager;
import com.android.ex.camera2.blocking.BlockingCameraManager.BlockingOpenException;
-import com.android.ex.camera2.blocking.BlockingSessionListener;
+import com.android.ex.camera2.blocking.BlockingSessionCallback;
import androidx.media.filterfw.Filter;
import androidx.media.filterfw.Frame;
import androidx.media.filterfw.FrameImage2D;
@@ -72,7 +72,7 @@
private static final long SESSION_TIMEOUT_MS = 2000;
- class MyCameraListener extends CameraManager.AvailabilityListener {
+ class MyCameraListener extends CameraManager.AvailabilityCallback {
@Override
public void onCameraAvailable(String cameraId) {
@@ -88,7 +88,7 @@
}
- class MyCaptureListener extends CameraCaptureSession.CaptureListener {
+ class MyCaptureCallback extends CameraCaptureSession.CaptureCallback {
@Override
public void onCaptureCompleted(CameraCaptureSession camera, CaptureRequest request,
@@ -189,7 +189,7 @@
surfaces.add(mSurface);
CaptureRequest.Builder mCaptureRequest = null;
try {
- BlockingSessionListener blkSession = new BlockingSessionListener();
+ BlockingSessionCallback blkSession = new BlockingSessionCallback();
mCamera.createCaptureSession(surfaces, blkSession, mHandler);
mCaptureRequest = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
@@ -203,7 +203,7 @@
}
try {
- mCameraSession.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureListener(),
+ mCameraSession.setRepeatingRequest(mCaptureRequest.build(), new MyCaptureCallback(),
mHandler);
} catch (CameraAccessException e) {
e.printStackTrace();