diff options
15 files changed, 103 insertions, 44 deletions
diff --git a/api/current.txt b/api/current.txt index eb8befa286c5..7da3ce3a509c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -22998,7 +22998,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23044,7 +23044,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } diff --git a/api/system-current.txt b/api/system-current.txt index 287df85c7ca4..f4db4885d3b9 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -24750,7 +24750,7 @@ package android.media.tv { method public abstract void onConnect(android.net.Uri); method public void onConnect(android.net.Uri, android.os.Bundle); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -24802,7 +24802,7 @@ package android.media.tv { method public void connect(java.lang.String, android.net.Uri, android.os.Bundle); method public void disconnect(); method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } diff --git a/api/test-current.txt b/api/test-current.txt index e7f4336c0971..e461e02c0274 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -23007,7 +23007,7 @@ package android.media.tv { method public void notifyRecordingStopped(android.net.Uri); method public abstract void onConnect(android.net.Uri); method public abstract void onDisconnect(); - method public abstract void onStartRecording(); + method public abstract void onStartRecording(android.net.Uri); method public abstract void onStopRecording(); } @@ -23053,7 +23053,7 @@ package android.media.tv { ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler); method public void connect(java.lang.String, android.net.Uri); method public void disconnect(); - method public void startRecording(); + method public void startRecording(android.net.Uri); method public void stopRecording(); } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 6e38b3268683..947906bf4403 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -460,6 +460,11 @@ public interface WindowManagerPolicy { /** Unregister a system listener for touch events */ void unregisterPointerEventListener(PointerEventListener listener); + + /** + * @return The content insets of the docked divider window. + */ + int getDockedDividerInsetsLw(); } public interface PointerEventListener { diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java index 597c5225f89f..84d0fc70b1ca 100644 --- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java @@ -136,8 +136,7 @@ public class DividerSnapAlgorithm { / (mFirstSplitTarget.position - getStartInset()); } else if (position > mLastSplitTarget.position) { return (float) (position - mLastSplitTarget.position) - / (mDismissEndTarget.position - getEndInset() - - mLastSplitTarget.position - mDividerSize); + / (mDismissEndTarget.position - mLastSplitTarget.position - mDividerSize); } return 0f; } @@ -222,7 +221,8 @@ public class DividerSnapAlgorithm { addMiddleTarget(isHorizontalDivision); break; } - mTargets.add(new SnapTarget(dividerMax, SnapTarget.FLAG_DISMISS_END, 0.35f)); + int navBarSize = isHorizontalDivision ? mInsets.bottom : mInsets.right; + mTargets.add(new SnapTarget(dividerMax - navBarSize, SnapTarget.FLAG_DISMISS_END, 0.35f)); } private void addFixedDivisionTargets(boolean isHorizontalDivision) { diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl index d18933385463..12a220f2974f 100644 --- a/media/java/android/media/tv/ITvInputManager.aidl +++ b/media/java/android/media/tv/ITvInputManager.aidl @@ -88,7 +88,7 @@ interface ITvInputManager { // For the recording session void connect(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId); - void startRecording(in IBinder sessionToken, int userId); + void startRecording(in IBinder sessionToken, in Uri programHint, int userId); void stopRecording(in IBinder sessionToken, int userId); // For TV input hardware binding diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl index 408a76277845..07781bc0a042 100644 --- a/media/java/android/media/tv/ITvInputSession.aidl +++ b/media/java/android/media/tv/ITvInputSession.aidl @@ -58,6 +58,6 @@ oneway interface ITvInputSession { // For the recording session void connect(in Uri channelUri, in Bundle params); void disconnect(); - void startRecording(); + void startRecording(in Uri programHint); void stopRecording(); } diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java index 4ac58766ca94..b15acef583b0 100644 --- a/media/java/android/media/tv/ITvInputSessionWrapper.java +++ b/media/java/android/media/tv/ITvInputSessionWrapper.java @@ -16,6 +16,7 @@ package android.media.tv; +import android.annotation.Nullable; import android.content.Context; import android.graphics.Rect; import android.media.PlaybackParams; @@ -220,7 +221,7 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand break; } case DO_START_RECORDING: { - mTvInputRecordingSessionImpl.startRecording(); + mTvInputRecordingSessionImpl.startRecording((Uri) msg.obj); break; } case DO_STOP_RECORDING: { @@ -366,8 +367,8 @@ public class ITvInputSessionWrapper extends ITvInputSession.Stub implements Hand } @Override - public void startRecording() { - mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_START_RECORDING)); + public void startRecording(@Nullable Uri programHint) { + mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_START_RECORDING, programHint)); } @Override diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index 1cd19589cb94..d76408e3a9d3 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -2039,22 +2039,25 @@ public final class TvInputManager { } /** - * Starts TV program recording for the current recording session. + * Starts TV program recording in the current recording session. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - void startRecording() { + void startRecording(@Nullable Uri programHint) { if (mToken == null) { Log.w(TAG, "The session has been already released"); return; } try { - mService.startRecording(mToken, mUserId); + mService.startRecording(mToken, programHint, mUserId); } catch (RemoteException e) { throw new RuntimeException(e); } } /** - * Stops TV program recording for the current recording session. + * Stops TV program recording in the current recording session. */ void stopRecording() { if (mToken == null) { diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java index d48b2c8b0816..91f1ee9f7e33 100644 --- a/media/java/android/media/tv/TvInputService.java +++ b/media/java/android/media/tv/TvInputService.java @@ -1699,16 +1699,26 @@ public abstract class TvInputService extends Service { * Called when the application requests to start recording. Recording must start * immediately. * + * <p>The application may supply the URI for a TV program as a hint for filling in program + * specific data fields in the {@link android.media.tv.TvContract.RecordedPrograms} table. + * A non-null {@code programHint} implies the started recording should be of that specific + * program, whereas null {@code programHint} does not impose such a requirement and the + * recording can span across multiple TV programs. In either case, the application must call + * {@link TvRecordingClient#stopRecording()} to stop the recording. + * * <p>The session must call either {@link #notifyRecordingStarted()} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be {@code null}. */ - public abstract void onStartRecording(); + public abstract void onStartRecording(@Nullable Uri programHint); /** * Called when the application requests to stop recording. Recording must stop immediately. * * <p>The session must call either {@link #notifyRecordingStopped(Uri)} or - * {@link #notifyError(int)}}. + * {@link #notifyError(int)}. */ public abstract void onStopRecording(); @@ -1744,11 +1754,11 @@ public abstract class TvInputService extends Service { } /** - * Calls {@link #onStartRecording()}. + * Calls {@link #onStartRecording(Uri)}. * */ - void startRecording() { - onStartRecording(); + void startRecording(@Nullable Uri programHint) { + onStartRecording(programHint); } /** diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java index 1d80068fbdf8..b943c3d5f559 100644 --- a/media/java/android/media/tv/TvRecordingClient.java +++ b/media/java/android/media/tv/TvRecordingClient.java @@ -17,6 +17,7 @@ package android.media.tv; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.content.Context; import android.net.Uri; @@ -131,20 +132,31 @@ public class TvRecordingClient { } /** - * Starts TV program recording for the current recording session. It is expected that recording + * Starts TV program recording in the current recording session. It is expected that recording * starts immediately after calling this method. * + * <p>The application may supply the URI for a TV program as a hint to the corresponding TV + * input service for filling in program specific data fields in the + * {@link android.media.tv.TvContract.RecordedPrograms} table. A non-null {@code programHint} + * implies the started recording should be of that specific program, whereas null + * {@code programHint} does not impose such a requirement and the recording can span across + * multiple TV programs. In either case, the caller must call {@link #stopRecording()} to stop + * the recording. + * * <p>The recording session will respond by calling * {@link RecordingCallback#onRecordingStarted()} or {@link RecordingCallback#onError(int)}. + * + * @param programHint The URI for the TV program to record as a hint, built by + * {@link TvContract#buildProgramUri(long)}. Can be null. */ - public void startRecording() { + public void startRecording(@Nullable Uri programHint) { if (mSession != null) { - mSession.startRecording(); + mSession.startRecording(programHint); } } /** - * Stops TV program recording for the current recording session. It is expected that recording + * Stops TV program recording in the current recording session. It is expected that recording * stops immediately after calling this method. * * <p>The recording session will respond by calling @@ -325,7 +337,7 @@ public class TvRecordingClient { @Override public void onRecordingStopped(TvInputManager.Session session, Uri recordedProgramUri) { if (DEBUG) { - Log.d(TAG, "onRecordingStopped()"); + Log.d(TAG, "onRecordingStopped(recordedProgramUri= " + recordedProgramUri + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onRecordingStopped - session not created"); @@ -337,7 +349,7 @@ public class TvRecordingClient { @Override public void onError(TvInputManager.Session session, int error) { if (DEBUG) { - Log.d(TAG, "onError()"); + Log.d(TAG, "onError(error=" + error + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onError - session not created"); @@ -350,7 +362,8 @@ public class TvRecordingClient { public void onSessionEvent(TvInputManager.Session session, String eventType, Bundle eventArgs) { if (DEBUG) { - Log.d(TAG, "onSessionEvent(" + eventType + ")"); + Log.d(TAG, "onSessionEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (this != mSessionCallback) { Log.w(TAG, "onSessionEvent - session not created"); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a92cc31659e6..c046ba610b3a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2645,11 +2645,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } else if (win.getAttrs().type == TYPE_DOCK_DIVIDER) { - if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { - return R.anim.fade_in; - } else if (transit == TRANSIT_EXIT) { - return R.anim.fade_out; - } + return selectDockedDividerAnimationLw(win, transit); } if (transit == TRANSIT_PREVIEW_DONE) { @@ -2669,6 +2665,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } + private int selectDockedDividerAnimationLw(WindowState win, int transit) { + int insets = mWindowManagerFuncs.getDockedDividerInsetsLw(); + + // If the divider is behind the navigation bar, don't animate. + if (mNavigationBar != null + && (win.getFrameLw().top + insets >= mNavigationBar.getFrameLw().top + || win.getFrameLw().left + insets >= mNavigationBar.getFrameLw().left)) { + return 0; + } + if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { + return R.anim.fade_in; + } else if (transit == TRANSIT_EXIT) { + return R.anim.fade_out; + } else { + return 0; + } + } + @Override public void selectRotationAnimationLw(int anim[]) { if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen=" diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 3e99a4cfe01e..0f51c82eba37 100644 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -19,6 +19,7 @@ package com.android.server.tv; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED; import static android.media.tv.TvInputManager.INPUT_STATE_CONNECTED_STANDBY; +import android.annotation.Nullable; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -1582,7 +1583,7 @@ public final class TvInputManagerService extends SystemService { } @Override - public void startRecording(IBinder sessionToken, int userId) { + public void startRecording(IBinder sessionToken, @Nullable Uri programHint, int userId) { final int callingUid = Binder.getCallingUid(); final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid, userId, "startRecording"); @@ -1590,7 +1591,8 @@ public final class TvInputManagerService extends SystemService { try { synchronized (mLock) { try { - getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording(); + getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording( + programHint); } catch (RemoteException | SessionNotFoundException e) { Slog.e(TAG, "error in startRecording", e); } @@ -2474,7 +2476,8 @@ public final class TvInputManagerService extends SystemService { public void onSessionEvent(String eventType, Bundle eventArgs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onEvent(what=" + eventType + ", data=" + eventArgs + ")"); + Slog.d(TAG, "onEvent(eventType=" + eventType + ", eventArgs=" + eventArgs + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2491,7 +2494,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStatusChanged(int status) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStatusChanged()"); + Slog.d(TAG, "onTimeShiftStatusChanged(status=" + status + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2508,7 +2511,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftStartPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftStartPositionChanged()"); + Slog.d(TAG, "onTimeShiftStartPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2525,7 +2528,7 @@ public final class TvInputManagerService extends SystemService { public void onTimeShiftCurrentPositionChanged(long timeMs) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onTimeShiftCurrentPositionChanged()"); + Slog.d(TAG, "onTimeShiftCurrentPositionChanged(timeMs=" + timeMs + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2580,7 +2583,8 @@ public final class TvInputManagerService extends SystemService { public void onRecordingStopped(Uri recordedProgramUri) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onRecordingStopped()"); + Slog.d(TAG, "onRecordingStopped(recordedProgramUri=" + recordedProgramUri + + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; @@ -2598,7 +2602,7 @@ public final class TvInputManagerService extends SystemService { public void onError(int error) { synchronized (mLock) { if (DEBUG) { - Slog.d(TAG, "onError()"); + Slog.d(TAG, "onError(error=" + error + ")"); } if (mSessionState.session == null || mSessionState.client == null) { return; diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 72953183a173..412a45500157 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -72,6 +72,10 @@ public class DockedStackDividerController implements DimLayerUser { return mDividerWindowWidth - 2 * mDividerInsets; } + int getContentInsets() { + return mDividerInsets; + } + void setResizing(boolean resizing) { mResizing = resizing; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1b041cb751f1..d1ffaa07ed13 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9619,6 +9619,11 @@ public class WindowManagerService extends IWindowManager.Stub && !appWindow.mTask.inFreeformWorkspace(); } + @Override + public int getDockedDividerInsetsLw() { + return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets(); + } + void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) { pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); mPolicy.dump(" ", pw, args); |