summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/current.txt4
-rw-r--r--api/system-current.txt4
-rw-r--r--api/test-current.txt4
-rw-r--r--core/java/android/view/WindowManagerPolicy.java5
-rw-r--r--core/java/com/android/internal/policy/DividerSnapAlgorithm.java6
-rw-r--r--media/java/android/media/tv/ITvInputManager.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSession.aidl2
-rw-r--r--media/java/android/media/tv/ITvInputSessionWrapper.java7
-rw-r--r--media/java/android/media/tv/TvInputManager.java11
-rw-r--r--media/java/android/media/tv/TvInputService.java22
-rw-r--r--media/java/android/media/tv/TvRecordingClient.java27
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java24
-rw-r--r--services/core/java/com/android/server/tv/TvInputManagerService.java20
-rw-r--r--services/core/java/com/android/server/wm/DockedStackDividerController.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java5
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);