diff options
11 files changed, 162 insertions, 33 deletions
diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java index 31e6e254a951..0cf8df130cd4 100644 --- a/core/java/android/hardware/camera2/CameraCaptureSession.java +++ b/core/java/android/hardware/camera2/CameraCaptureSession.java @@ -65,6 +65,12 @@ import java.util.List; public abstract class CameraCaptureSession implements AutoCloseable { /** + * Used to identify invalid session ID. + * @hide + */ + public static final int SESSION_ID_NONE = -1; + + /** * Get the camera device that this session is created for. */ public abstract CameraDevice getDevice(); @@ -168,10 +174,11 @@ public abstract class CameraCaptureSession implements AutoCloseable { * @throws IllegalArgumentException if the request targets no Surfaces or Surfaces that are not * configured as outputs for this session; or a reprocess * capture request is submitted in a non-reprocessible capture - * session; or the capture targets a Surface in the middle - * of being {@link #prepare prepared}; or the handler is - * null, the listener is not null, and the calling thread has - * no looper. + * session; or the reprocess capture request was created with + * a {@link TotalCaptureResult} from a different session; or + * the capture targets a Surface in the middle of being + * {@link #prepare prepared}; or the handler is null, the + * listener is not null, and the calling thread has no looper. * * @see #captureBurst * @see #setRepeatingRequest @@ -226,7 +233,9 @@ public abstract class CameraCaptureSession implements AutoCloseable { * capture request is submitted in a non-reprocessible capture * session; or the list of requests contains both requests to * capture images from the camera and reprocess capture - * requests; or one of the captures targets a Surface in the + * requests; or one of the reprocess capture requests was + * created with a {@link TotalCaptureResult} from a different + * session; or one of the captures targets a Surface in the * middle of being {@link #prepare prepared}; or if the handler * is null, the listener is not null, and the calling thread * has no looper. diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 35727e871e40..19d17b136bff 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -158,6 +158,9 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> private final HashSet<Surface> mSurfaceSet; private final CameraMetadataNative mSettings; private boolean mIsReprocess; + // Each reprocess request must be tied to a reprocessible session ID. + // Valid only for reprocess requests (mIsReprocess == true). + private int mReprocessibleSessionId; private Object mUserTag; @@ -170,6 +173,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> mSettings = new CameraMetadataNative(); mSurfaceSet = new HashSet<Surface>(); mIsReprocess = false; + mReprocessibleSessionId = CameraCaptureSession.SESSION_ID_NONE; } /** @@ -182,6 +186,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> mSettings = new CameraMetadataNative(source.mSettings); mSurfaceSet = (HashSet<Surface>) source.mSurfaceSet.clone(); mIsReprocess = source.mIsReprocess; + mReprocessibleSessionId = source.mReprocessibleSessionId; mUserTag = source.mUserTag; } @@ -189,11 +194,36 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * Take ownership of passed-in settings. * * Used by the Builder to create a mutable CaptureRequest. + * + * @param settings Settings for this capture request. + * @param isReprocess Indicates whether to create a reprocess capture request. {@code true} + * to create a reprocess capture request. {@code false} to create a regular + * capture request. + * @param reprocessibleSessionId The ID of the camera capture session this capture is created + * for. This is used to validate if the application submits a + * reprocess capture request to the same session where + * the {@link TotalCaptureResult}, used to create the reprocess + * capture, came from. + * + * @throws IllegalArgumentException If creating a reprocess capture request with an invalid + * reprocessibleSessionId. + * + * @see CameraDevice#createReprocessCaptureRequest */ - private CaptureRequest(CameraMetadataNative settings, boolean isReprocess) { + private CaptureRequest(CameraMetadataNative settings, boolean isReprocess, + int reprocessibleSessionId) { mSettings = CameraMetadataNative.move(settings); mSurfaceSet = new HashSet<Surface>(); mIsReprocess = isReprocess; + if (isReprocess) { + if (reprocessibleSessionId == CameraCaptureSession.SESSION_ID_NONE) { + throw new IllegalArgumentException("Create a reprocess capture request with an " + + "invalid session ID: " + reprocessibleSessionId); + } + mReprocessibleSessionId = reprocessibleSessionId; + } else { + mReprocessibleSessionId = CameraCaptureSession.SESSION_ID_NONE; + } } /** @@ -277,6 +307,23 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> } /** + * Get the reprocessible session ID this reprocess capture request is associated with. + * + * @return the reprocessible session ID this reprocess capture request is associated with + * + * @throws IllegalStateException if this capture request is not a reprocess capture request. + * @hide + */ + public int getReprocessibleSessionId() { + if (mIsReprocess == false || + mReprocessibleSessionId == CameraCaptureSession.SESSION_ID_NONE) { + throw new IllegalStateException("Getting the reprocessible session ID for a "+ + "non-reprocess capture request is illegal."); + } + return mReprocessibleSessionId; + } + + /** * Determine whether this CaptureRequest is equal to another CaptureRequest. * * <p>A request is considered equal to another is if it's set of key/values is equal, it's @@ -298,7 +345,8 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> && Objects.equals(mUserTag, other.mUserTag) && mSurfaceSet.equals(other.mSurfaceSet) && mSettings.equals(other.mSettings) - && mIsReprocess == other.mIsReprocess; + && mIsReprocess == other.mIsReprocess + && mReprocessibleSessionId == other.mReprocessibleSessionId; } @Override @@ -347,6 +395,7 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> } mIsReprocess = (in.readInt() == 0) ? false : true; + mReprocessibleSessionId = CameraCaptureSession.SESSION_ID_NONE; } @Override @@ -397,10 +446,23 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * Initialize the builder using the template; the request takes * ownership of the template. * + * @param template Template settings for this capture request. + * @param reprocess Indicates whether to create a reprocess capture request. {@code true} + * to create a reprocess capture request. {@code false} to create a regular + * capture request. + * @param reprocessibleSessionId The ID of the camera capture session this capture is + * created for. This is used to validate if the application + * submits a reprocess capture request to the same session + * where the {@link TotalCaptureResult}, used to create the + * reprocess capture, came from. + * + * @throws IllegalArgumentException If creating a reprocess capture request with an invalid + * reprocessibleSessionId. * @hide */ - public Builder(CameraMetadataNative template, boolean reprocess) { - mRequest = new CaptureRequest(template, reprocess); + public Builder(CameraMetadataNative template, boolean reprocess, + int reprocessibleSessionId) { + mRequest = new CaptureRequest(template, reprocess, reprocessibleSessionId); } /** diff --git a/core/java/android/hardware/camera2/TotalCaptureResult.java b/core/java/android/hardware/camera2/TotalCaptureResult.java index 6f7dd78952c2..fb3c098a8f29 100644 --- a/core/java/android/hardware/camera2/TotalCaptureResult.java +++ b/core/java/android/hardware/camera2/TotalCaptureResult.java @@ -50,6 +50,7 @@ import java.util.List; public final class TotalCaptureResult extends CaptureResult { private final List<CaptureResult> mPartialResults; + private final int mSessionId; /** * Takes ownership of the passed-in camera metadata and the partial results @@ -58,7 +59,7 @@ public final class TotalCaptureResult extends CaptureResult { * @hide */ public TotalCaptureResult(CameraMetadataNative results, CaptureRequest parent, - CaptureResultExtras extras, List<CaptureResult> partials) { + CaptureResultExtras extras, List<CaptureResult> partials, int sessionId) { super(results, parent, extras); if (partials == null) { @@ -66,6 +67,8 @@ public final class TotalCaptureResult extends CaptureResult { } else { mPartialResults = partials; } + + mSessionId = sessionId; } /** @@ -78,6 +81,7 @@ public final class TotalCaptureResult extends CaptureResult { super(results, sequenceId); mPartialResults = new ArrayList<>(); + mSessionId = CameraCaptureSession.SESSION_ID_NONE; } /** @@ -95,4 +99,14 @@ public final class TotalCaptureResult extends CaptureResult { public List<CaptureResult> getPartialResults() { return Collections.unmodifiableList(mPartialResults); } + + /** + * Get the ID of the session where the capture request of this result was submitted. + * + * @return The session ID + * @hide + */ + public int getSessionId() { + return mSessionId; + } } diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java index c74204d63c96..3c195298b759 100644 --- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java @@ -156,9 +156,10 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession { } else if (request.isReprocess() && !isReprocessible()) { throw new IllegalArgumentException("this capture session cannot handle reprocess " + "requests"); + } else if (request.isReprocess() && request.getReprocessibleSessionId() != mId) { + throw new IllegalArgumentException("capture request was created for another session"); } - checkNotClosed(); handler = checkHandler(handler, callback); @@ -185,12 +186,17 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession { if (reprocess && !isReprocessible()) { throw new IllegalArgumentException("this capture session cannot handle reprocess " + "requests"); + } else if (reprocess && requests.get(0).getReprocessibleSessionId() != mId) { + throw new IllegalArgumentException("capture request was created for another session"); } for (int i = 1; i < requests.size(); i++) { if (requests.get(i).isReprocess() != reprocess) { throw new IllegalArgumentException("cannot mix regular and reprocess capture " + " requests"); + } else if (reprocess && requests.get(i).getReprocessibleSessionId() != mId) { + throw new IllegalArgumentException("capture request was created for another " + + "session"); } } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 1e680dfd21b3..ff4ad79f120f 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -585,8 +585,8 @@ public class CameraDeviceImpl extends CameraDevice { return null; } - CaptureRequest.Builder builder = - new CaptureRequest.Builder(templatedRequest, /*reprocess*/false); + CaptureRequest.Builder builder = new CaptureRequest.Builder( + templatedRequest, /*reprocess*/false, CameraCaptureSession.SESSION_ID_NONE); return builder; } @@ -601,7 +601,8 @@ public class CameraDeviceImpl extends CameraDevice { CameraMetadataNative resultMetadata = new CameraMetadataNative(inputResult.getNativeCopy()); - return new CaptureRequest.Builder(resultMetadata, /*reprocess*/true); + return new CaptureRequest.Builder(resultMetadata, /*reprocess*/true, + inputResult.getSessionId()); } } @@ -763,7 +764,7 @@ public class CameraDeviceImpl extends CameraDevice { if (callback != null) { mCaptureCallbackMap.put(requestId, new CaptureCallbackHolder(callback, - requestList, handler, repeating)); + requestList, handler, repeating, mNextSessionId - 1)); } else { if (DEBUG) { Log.d(TAG, "Listen for request " + requestId + " is null"); @@ -1095,9 +1096,10 @@ public class CameraDeviceImpl extends CameraDevice { private final CaptureCallback mCallback; private final List<CaptureRequest> mRequestList; private final Handler mHandler; + private final int mSessionId; CaptureCallbackHolder(CaptureCallback callback, List<CaptureRequest> requestList, - Handler handler, boolean repeating) { + Handler handler, boolean repeating, int sessionId) { if (callback == null || handler == null) { throw new UnsupportedOperationException( "Must have a valid handler and a valid callback"); @@ -1106,6 +1108,7 @@ public class CameraDeviceImpl extends CameraDevice { mHandler = handler; mRequestList = new ArrayList<CaptureRequest>(requestList); mCallback = callback; + mSessionId = sessionId; } public boolean isRepeating() { @@ -1140,6 +1143,10 @@ public class CameraDeviceImpl extends CameraDevice { return mHandler; } + public int getSessionId() { + return mSessionId; + } + } /** @@ -1643,8 +1650,8 @@ public class CameraDeviceImpl extends CameraDevice { List<CaptureResult> partialResults = mFrameNumberTracker.popPartialResults(frameNumber); - final TotalCaptureResult resultAsCapture = - new TotalCaptureResult(result, request, resultExtras, partialResults); + final TotalCaptureResult resultAsCapture = new TotalCaptureResult(result, + request, resultExtras, partialResults, holder.getSessionId()); // Final capture result resultDispatch = new Runnable() { @@ -1665,7 +1672,8 @@ public class CameraDeviceImpl extends CameraDevice { holder.getHandler().post(resultDispatch); // Collect the partials for a total result; or mark the frame as totally completed - mFrameNumberTracker.updateTracker(frameNumber, finalResult, isPartialResult, isReprocess); + mFrameNumberTracker.updateTracker(frameNumber, finalResult, isPartialResult, + isReprocess); // Fire onCaptureSequenceCompleted if (!isPartialResult) { diff --git a/core/java/android/provider/Browser.java b/core/java/android/provider/Browser.java index 69a05c4f0b19..bae06b80f5ca 100644 --- a/core/java/android/provider/Browser.java +++ b/core/java/android/provider/Browser.java @@ -16,6 +16,7 @@ package android.provider; +import android.annotation.RequiresPermission; import android.content.ContentResolver; import android.content.ContentUris; import android.content.ContentValues; @@ -32,6 +33,9 @@ import android.provider.BrowserContract.Searches; import android.util.Log; import android.webkit.WebIconDatabase; +import static android.Manifest.permission.READ_HISTORY_BOOKMARKS; +import static android.Manifest.permission.WRITE_HISTORY_BOOKMARKS; + public class Browser { private static final String LOGTAG = "browser"; @@ -41,6 +45,8 @@ public class Browser { * {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} permission and writing to it * requires the {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} permission. */ + @RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) + @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks"); /** @@ -122,6 +128,8 @@ public class Browser { * {@link android.Manifest.permission#READ_HISTORY_BOOKMARKS} permission and writing to it * requires the {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} permission. */ + @RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) + @RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) public static final Uri SEARCHES_URI = Uri.parse("content://browser/searches"); /** @@ -233,6 +241,7 @@ public class Browser { * * @param cr The ContentResolver used to access the database. */ + @RequiresPermission(READ_HISTORY_BOOKMARKS) public static final Cursor getAllBookmarks(ContentResolver cr) throws IllegalStateException { return cr.query(Bookmarks.CONTENT_URI, @@ -248,6 +257,7 @@ public class Browser { * * @param cr The ContentResolver used to access the database. */ + @RequiresPermission(READ_HISTORY_BOOKMARKS) public static final Cursor getAllVisitedUrls(ContentResolver cr) throws IllegalStateException { return cr.query(Combined.CONTENT_URI, @@ -308,6 +318,7 @@ public class Browser { * @param real If true, this is an actual visit, and should add to the * number of visits. If false, the user entered it manually. */ + @RequiresPermission(allOf = {READ_HISTORY_BOOKMARKS, WRITE_HISTORY_BOOKMARKS}) public static final void updateVisitedHistory(ContentResolver cr, String url, boolean real) { long now = System.currentTimeMillis(); @@ -358,6 +369,7 @@ public class Browser { * @param cr The ContentResolver used to access the database. * @hide pending API council approval */ + @RequiresPermission(READ_HISTORY_BOOKMARKS) public static final String[] getVisitedHistory(ContentResolver cr) { Cursor c = null; String[] str = null; @@ -393,6 +405,7 @@ public class Browser { * * @param cr The ContentResolver used to access the database. */ + @RequiresPermission(allOf = {READ_HISTORY_BOOKMARKS, WRITE_HISTORY_BOOKMARKS}) public static final void truncateHistory(ContentResolver cr) { // TODO make a single request to the provider to do this in a single transaction Cursor cursor = null; @@ -424,6 +437,7 @@ public class Browser { * @param cr The ContentResolver used to access the database. * @return boolean True if the history can be cleared. */ + @RequiresPermission(READ_HISTORY_BOOKMARKS) public static final boolean canClearHistory(ContentResolver cr) { Cursor cursor = null; boolean ret = false; @@ -446,6 +460,7 @@ public class Browser { * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} * @param cr The ContentResolver used to access the database. */ + @RequiresPermission(WRITE_HISTORY_BOOKMARKS) public static final void clearHistory(ContentResolver cr) { deleteHistoryWhere(cr, null); } @@ -461,6 +476,7 @@ public class Browser { * @param whereClause String to limit the items affected. * null means all items. */ + @RequiresPermission(allOf = {READ_HISTORY_BOOKMARKS, WRITE_HISTORY_BOOKMARKS}) private static final void deleteHistoryWhere(ContentResolver cr, String whereClause) { Cursor cursor = null; try { @@ -486,6 +502,7 @@ public class Browser { * @param end Last date to remove. If -1, all dates after begin. * Non-inclusive. */ + @RequiresPermission(WRITE_HISTORY_BOOKMARKS) public static final void deleteHistoryTimeFrame(ContentResolver cr, long begin, long end) { String whereClause; @@ -511,6 +528,7 @@ public class Browser { * @param cr The ContentResolver used to access the database. * @param url url to remove. */ + @RequiresPermission(WRITE_HISTORY_BOOKMARKS) public static final void deleteFromHistory(ContentResolver cr, String url) { cr.delete(History.CONTENT_URI, History.URL + "=?", new String[] { url }); @@ -523,6 +541,7 @@ public class Browser { * @param cr The ContentResolver used to access the database. * @param search The string to add to the searches database. */ + @RequiresPermission(allOf = {READ_HISTORY_BOOKMARKS, WRITE_HISTORY_BOOKMARKS}) public static final void addSearchUrl(ContentResolver cr, String search) { // The content provider will take care of updating existing searches instead of duplicating ContentValues values = new ContentValues(); @@ -536,6 +555,7 @@ public class Browser { * Requires {@link android.Manifest.permission#WRITE_HISTORY_BOOKMARKS} * @param cr The ContentResolver used to access the database. */ + @RequiresPermission(WRITE_HISTORY_BOOKMARKS) public static final void clearSearches(ContentResolver cr) { // FIXME: Should this clear the urls to which these searches lead? // (i.e. remove google.com/query= blah blah blah) @@ -557,6 +577,7 @@ public class Browser { * @param listener IconListener that gets the icons once they are * retrieved. */ + @RequiresPermission(READ_HISTORY_BOOKMARKS) public static final void requestAllIcons(ContentResolver cr, String where, WebIconDatabase.IconListener listener) { // Do nothing: this is no longer used. diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java index f0e2f5c5e0cf..46d33b468982 100644 --- a/media/java/android/media/tv/TvInputInfo.java +++ b/media/java/android/media/tv/TvInputInfo.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.content.ComponentName; import android.content.Context; @@ -424,7 +425,7 @@ public final class TvInputInfo implements Parcelable { * @return a CharSequence containing the TV input's label. If the TV input does not have * a label, its name is returned. */ - public CharSequence loadLabel(Context context) { + public CharSequence loadLabel(@NonNull Context context) { if (TextUtils.isEmpty(mLabel)) { return mService.loadLabel(context.getPackageManager()); } else { @@ -452,7 +453,7 @@ public final class TvInputInfo implements Parcelable { * @return a Drawable containing the TV input's icon. If the TV input does not have an icon, * application's icon is returned. If it's unavailable too, {@code null} is returned. */ - public Drawable loadIcon(Context context) { + public Drawable loadIcon(@NonNull Context context) { if (mIconUri == null) { return loadServiceIcon(context); } @@ -506,7 +507,7 @@ public final class TvInputInfo implements Parcelable { * @param flags The flags used for parceling. */ @Override - public void writeToParcel(Parcel dest, int flags) { + public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeString(mId); dest.writeString(mParentId); mService.writeToParcel(dest, flags); diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 105084e3fd3e..0f265de74ce8 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.graphics.Rect; @@ -932,7 +933,7 @@ public final class TvInputManager { * @return the {@link TvInputInfo} for a given TV input. {@code null} if not found. */ @Nullable - public TvInputInfo getTvInputInfo(String inputId) { + public TvInputInfo getTvInputInfo(@NonNull String inputId) { if (inputId == null) { throw new IllegalArgumentException("inputId cannot be null"); } @@ -956,7 +957,7 @@ public final class TvInputManager { * @param inputId The id of the TV input. * @throws IllegalArgumentException if the argument is {@code null}. */ - public int getInputState(String inputId) { + public int getInputState(@NonNull String inputId) { if (inputId == null) { throw new IllegalArgumentException("inputId cannot be null"); } @@ -977,7 +978,7 @@ public final class TvInputManager { * @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 registerCallback(TvInputCallback callback, Handler handler) { + public void registerCallback(@NonNull TvInputCallback callback, @NonNull Handler handler) { if (callback == null) { throw new IllegalArgumentException("callback cannot be null"); } @@ -995,7 +996,7 @@ public final class TvInputManager { * @param callback The existing callback to remove. * @throws IllegalArgumentException if any of the arguments is {@code null}. */ - public void unregisterCallback(final TvInputCallback callback) { + public void unregisterCallback(@NonNull final TvInputCallback callback) { if (callback == null) { throw new IllegalArgumentException("callback cannot be null"); } @@ -1047,7 +1048,7 @@ public final class TvInputManager { * @param rating The TV content rating to check. * @return {@code true} if the given TV content rating is blocked, {@code false} otherwise. */ - public boolean isRatingBlocked(TvContentRating rating) { + public boolean isRatingBlocked(@NonNull TvContentRating rating) { if (rating == null) { throw new IllegalArgumentException("rating cannot be null"); } diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index 382ec91b5e80..4258534a0014 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.annotation.SystemApi; @@ -314,7 +315,7 @@ public abstract class TvInputService extends Service { @SystemApi public void notifySessionEvent(final String eventType, final Bundle eventArgs) { if (eventType == null) { - throw new IllegalArgumentException("eventType should not be null."); + throw new IllegalArgumentException("eventType cannot be null"); } executeOrPostRunnable(new Runnable() { @Override @@ -544,7 +545,10 @@ public abstract class TvInputService extends Service { * @see #notifyContentAllowed * @see TvInputManager */ - public void notifyContentBlocked(final TvContentRating rating) { + public void notifyContentBlocked(@NonNull final TvContentRating rating) { + if (rating == null) { + throw new IllegalArgumentException("rating cannot be null"); + } executeOrPostRunnable(new Runnable() { @Override public void run() { @@ -828,7 +832,7 @@ public abstract class TvInputService extends Service { * @hide */ @SystemApi - public void onAppPrivateCommand(String action, Bundle data) { + public void onAppPrivateCommand(@NonNull String action, Bundle data) { } /** diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java index 645604996d6f..d248b1232221 100644 --- a/media/java/android/media/tv/TvView.java +++ b/media/java/android/media/tv/TvView.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; @@ -273,7 +274,7 @@ public class TvView extends ViewGroup { * @param inputId The ID of TV input which will play the given channel. * @param channelUri The URI of a channel. */ - public void tune(String inputId, Uri channelUri) { + public void tune(@NonNull String inputId, Uri channelUri) { tune(inputId, channelUri, null); } @@ -494,7 +495,7 @@ public class TvView extends ViewGroup { * @hide */ @SystemApi - public void sendAppPrivateCommand(String action, Bundle data) { + public void sendAppPrivateCommand(@NonNull String action, Bundle data) { if (TextUtils.isEmpty(action)) { throw new IllegalArgumentException("action cannot be null or an empty string"); } diff --git a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java index 6f336725eab5..d71b44bf549a 100644 --- a/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java +++ b/media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/integration/CameraDeviceBinderTest.java @@ -19,6 +19,7 @@ package com.android.mediaframeworktest.integration; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.hardware.camera2.CameraMetadata; +import android.hardware.camera2.CameraCaptureSession; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.ICameraDeviceCallbacks; @@ -170,7 +171,8 @@ public class CameraDeviceBinderTest extends AndroidTestCase { assertEquals(CameraBinderTestUtils.NO_ERROR, status); assertFalse(metadata.isEmpty()); - CaptureRequest.Builder request = new CaptureRequest.Builder(metadata, /*reprocess*/false); + CaptureRequest.Builder request = new CaptureRequest.Builder(metadata, /*reprocess*/false, + CameraCaptureSession.SESSION_ID_NONE); assertFalse(request.isEmpty()); assertFalse(metadata.isEmpty()); if (needStream) { |