Loading packages/SystemUI/res/values/config_tv.xml +4 −0 Original line number Original line Diff line number Diff line Loading @@ -15,6 +15,10 @@ --> --> <resources> <resources> <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP menu is shown with settings. --> <string translatable="false" name="pip_settings_bounds">"662 54 1142 324"</string> <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP menu is shown in center. --> when the PIP menu is shown in center. --> <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string> <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string> Loading packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +62 −4 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.RemoteException; import android.os.RemoteException; import android.os.SystemProperties; import android.os.SystemProperties; import android.util.Log; import android.util.Log; import android.util.Pair; import com.android.systemui.Prefs; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.R; Loading @@ -62,6 +63,20 @@ public class PipManager { private static final int MAX_RUNNING_TASKS_COUNT = 10; private static final int MAX_RUNNING_TASKS_COUNT = 10; /** * List of package and class name which are considered as Settings, * so PIP location should be adjusted to the left of the side panel. */ private static final List<Pair<String, String>> sSettingsPackageAndClassNamePairList; static { sSettingsPackageAndClassNamePairList = new ArrayList<>(); sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( "com.android.tv.settings", null)); sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( "com.google.android.leanbacklauncher", "com.google.android.leanbacklauncher.settings.HomeScreenSettingsActivity")); } /** /** * State when there's no PIP. * State when there's no PIP. */ */ Loading Loading @@ -108,6 +123,7 @@ public class PipManager { private int mSuspendPipResizingReason; private int mSuspendPipResizingReason; private Context mContext; private Context mContext; private SystemServicesProxy mSystemServiceProxy; private PipRecentsOverlayManager mPipRecentsOverlayManager; private PipRecentsOverlayManager mPipRecentsOverlayManager; private IActivityManager mActivityManager; private IActivityManager mActivityManager; private MediaSessionManager mMediaSessionManager; private MediaSessionManager mMediaSessionManager; Loading @@ -117,6 +133,8 @@ public class PipManager { private List<MediaListener> mMediaListeners = new ArrayList<>(); private List<MediaListener> mMediaListeners = new ArrayList<>(); private Rect mCurrentPipBounds; private Rect mCurrentPipBounds; private Rect mPipBounds; private Rect mPipBounds; private Rect mDefaultPipBounds; private Rect mSettingsPipBounds; private Rect mMenuModePipBounds; private Rect mMenuModePipBounds; private Rect mRecentsPipBounds; private Rect mRecentsPipBounds; private Rect mRecentsFocusedPipBounds; private Rect mRecentsFocusedPipBounds; Loading Loading @@ -176,8 +194,10 @@ public class PipManager { mInitialized = true; mInitialized = true; mContext = context; mContext = context; Resources res = context.getResources(); Resources res = context.getResources(); mPipBounds = Rect.unflattenFromString(res.getString( mDefaultPipBounds = Rect.unflattenFromString(res.getString( com.android.internal.R.string.config_defaultPictureInPictureBounds)); com.android.internal.R.string.config_defaultPictureInPictureBounds)); mSettingsPipBounds = Rect.unflattenFromString(res.getString( R.string.pip_settings_bounds)); mMenuModePipBounds = Rect.unflattenFromString(res.getString( mMenuModePipBounds = Rect.unflattenFromString(res.getString( R.string.pip_menu_bounds)); R.string.pip_menu_bounds)); mRecentsPipBounds = Rect.unflattenFromString(res.getString( mRecentsPipBounds = Rect.unflattenFromString(res.getString( Loading @@ -186,9 +206,11 @@ public class PipManager { R.string.pip_recents_focused_bounds)); R.string.pip_recents_focused_bounds)); mRecentsFocusChangedAnimationDurationMs = res.getInteger( mRecentsFocusChangedAnimationDurationMs = res.getInteger( R.integer.recents_tv_pip_focus_anim_duration); R.integer.recents_tv_pip_focus_anim_duration); mPipBounds = mDefaultPipBounds; mActivityManager = ActivityManagerNative.getDefault(); mActivityManager = ActivityManagerNative.getDefault(); SystemServicesProxy.getInstance(context).registerTaskStackListener(mTaskStackListener); mSystemServiceProxy = SystemServicesProxy.getInstance(context); mSystemServiceProxy.registerTaskStackListener(mTaskStackListener); IntentFilter intentFilter = new IntentFilter(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); mContext.registerReceiver(mBroadcastReceiver, intentFilter); mContext.registerReceiver(mBroadcastReceiver, intentFilter); Loading Loading @@ -522,10 +544,25 @@ public class PipManager { return PLAYBACK_STATE_UNAVAILABLE; return PLAYBACK_STATE_UNAVAILABLE; } } private static boolean isSettingsShown(ComponentName topActivity) { for (Pair<String, String> componentName : sSettingsPackageAndClassNamePairList) { String packageName = componentName.first; if (topActivity.getPackageName().equals(componentName.first)) { String className = componentName.second; if (className == null || topActivity.getClassName().equals(className)) { return true; } } } return false; } private TaskStackListener mTaskStackListener = new TaskStackListener() { private TaskStackListener mTaskStackListener = new TaskStackListener() { @Override @Override public void onTaskStackChanged() { public void onTaskStackChanged() { if (mState != STATE_NO_PIP) { if (mState != STATE_NO_PIP) { boolean hasPip = false; StackInfo stackInfo = null; StackInfo stackInfo = null; try { try { stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID); stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID); Loading @@ -541,11 +578,32 @@ public class PipManager { for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) { for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) { if (stackInfo.taskIds[i] == mPipTaskId) { if (stackInfo.taskIds[i] == mPipTaskId) { // PIP task is still alive. // PIP task is still alive. return; hasPip = true; break; } } } } if (!hasPip) { // PIP task doesn't exist anymore in PINNED_STACK. // PIP task doesn't exist anymore in PINNED_STACK. closePipInternal(true); closePipInternal(true); return; } } if (mState == STATE_PIP_OVERLAY) { try { List<RunningTaskInfo> runningTasks = mActivityManager.getTasks(1, 0); if (runningTasks == null || runningTasks.size() == 0) { return; } RunningTaskInfo topTask = runningTasks.get(0); Rect bounds = isSettingsShown(topTask.topActivity) ? mSettingsPipBounds : mDefaultPipBounds; if (mPipBounds != bounds) { mPipBounds = bounds; resizePinnedStack(STATE_PIP_OVERLAY); } } catch (RemoteException e) { Log.d(TAG, "Failed to detect top activity", e); } } } } } Loading Loading
packages/SystemUI/res/values/config_tv.xml +4 −0 Original line number Original line Diff line number Diff line Loading @@ -15,6 +15,10 @@ --> --> <resources> <resources> <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP menu is shown with settings. --> <string translatable="false" name="pip_settings_bounds">"662 54 1142 324"</string> <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, <!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP menu is shown in center. --> when the PIP menu is shown in center. --> <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string> <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string> Loading
packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java +62 −4 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,7 @@ import android.os.Handler; import android.os.RemoteException; import android.os.RemoteException; import android.os.SystemProperties; import android.os.SystemProperties; import android.util.Log; import android.util.Log; import android.util.Pair; import com.android.systemui.Prefs; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.R; Loading @@ -62,6 +63,20 @@ public class PipManager { private static final int MAX_RUNNING_TASKS_COUNT = 10; private static final int MAX_RUNNING_TASKS_COUNT = 10; /** * List of package and class name which are considered as Settings, * so PIP location should be adjusted to the left of the side panel. */ private static final List<Pair<String, String>> sSettingsPackageAndClassNamePairList; static { sSettingsPackageAndClassNamePairList = new ArrayList<>(); sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( "com.android.tv.settings", null)); sSettingsPackageAndClassNamePairList.add(new Pair<String, String>( "com.google.android.leanbacklauncher", "com.google.android.leanbacklauncher.settings.HomeScreenSettingsActivity")); } /** /** * State when there's no PIP. * State when there's no PIP. */ */ Loading Loading @@ -108,6 +123,7 @@ public class PipManager { private int mSuspendPipResizingReason; private int mSuspendPipResizingReason; private Context mContext; private Context mContext; private SystemServicesProxy mSystemServiceProxy; private PipRecentsOverlayManager mPipRecentsOverlayManager; private PipRecentsOverlayManager mPipRecentsOverlayManager; private IActivityManager mActivityManager; private IActivityManager mActivityManager; private MediaSessionManager mMediaSessionManager; private MediaSessionManager mMediaSessionManager; Loading @@ -117,6 +133,8 @@ public class PipManager { private List<MediaListener> mMediaListeners = new ArrayList<>(); private List<MediaListener> mMediaListeners = new ArrayList<>(); private Rect mCurrentPipBounds; private Rect mCurrentPipBounds; private Rect mPipBounds; private Rect mPipBounds; private Rect mDefaultPipBounds; private Rect mSettingsPipBounds; private Rect mMenuModePipBounds; private Rect mMenuModePipBounds; private Rect mRecentsPipBounds; private Rect mRecentsPipBounds; private Rect mRecentsFocusedPipBounds; private Rect mRecentsFocusedPipBounds; Loading Loading @@ -176,8 +194,10 @@ public class PipManager { mInitialized = true; mInitialized = true; mContext = context; mContext = context; Resources res = context.getResources(); Resources res = context.getResources(); mPipBounds = Rect.unflattenFromString(res.getString( mDefaultPipBounds = Rect.unflattenFromString(res.getString( com.android.internal.R.string.config_defaultPictureInPictureBounds)); com.android.internal.R.string.config_defaultPictureInPictureBounds)); mSettingsPipBounds = Rect.unflattenFromString(res.getString( R.string.pip_settings_bounds)); mMenuModePipBounds = Rect.unflattenFromString(res.getString( mMenuModePipBounds = Rect.unflattenFromString(res.getString( R.string.pip_menu_bounds)); R.string.pip_menu_bounds)); mRecentsPipBounds = Rect.unflattenFromString(res.getString( mRecentsPipBounds = Rect.unflattenFromString(res.getString( Loading @@ -186,9 +206,11 @@ public class PipManager { R.string.pip_recents_focused_bounds)); R.string.pip_recents_focused_bounds)); mRecentsFocusChangedAnimationDurationMs = res.getInteger( mRecentsFocusChangedAnimationDurationMs = res.getInteger( R.integer.recents_tv_pip_focus_anim_duration); R.integer.recents_tv_pip_focus_anim_duration); mPipBounds = mDefaultPipBounds; mActivityManager = ActivityManagerNative.getDefault(); mActivityManager = ActivityManagerNative.getDefault(); SystemServicesProxy.getInstance(context).registerTaskStackListener(mTaskStackListener); mSystemServiceProxy = SystemServicesProxy.getInstance(context); mSystemServiceProxy.registerTaskStackListener(mTaskStackListener); IntentFilter intentFilter = new IntentFilter(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); intentFilter.addAction(Intent.ACTION_MEDIA_RESOURCE_GRANTED); mContext.registerReceiver(mBroadcastReceiver, intentFilter); mContext.registerReceiver(mBroadcastReceiver, intentFilter); Loading Loading @@ -522,10 +544,25 @@ public class PipManager { return PLAYBACK_STATE_UNAVAILABLE; return PLAYBACK_STATE_UNAVAILABLE; } } private static boolean isSettingsShown(ComponentName topActivity) { for (Pair<String, String> componentName : sSettingsPackageAndClassNamePairList) { String packageName = componentName.first; if (topActivity.getPackageName().equals(componentName.first)) { String className = componentName.second; if (className == null || topActivity.getClassName().equals(className)) { return true; } } } return false; } private TaskStackListener mTaskStackListener = new TaskStackListener() { private TaskStackListener mTaskStackListener = new TaskStackListener() { @Override @Override public void onTaskStackChanged() { public void onTaskStackChanged() { if (mState != STATE_NO_PIP) { if (mState != STATE_NO_PIP) { boolean hasPip = false; StackInfo stackInfo = null; StackInfo stackInfo = null; try { try { stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID); stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID); Loading @@ -541,11 +578,32 @@ public class PipManager { for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) { for (int i = stackInfo.taskIds.length - 1; i >= 0; --i) { if (stackInfo.taskIds[i] == mPipTaskId) { if (stackInfo.taskIds[i] == mPipTaskId) { // PIP task is still alive. // PIP task is still alive. return; hasPip = true; break; } } } } if (!hasPip) { // PIP task doesn't exist anymore in PINNED_STACK. // PIP task doesn't exist anymore in PINNED_STACK. closePipInternal(true); closePipInternal(true); return; } } if (mState == STATE_PIP_OVERLAY) { try { List<RunningTaskInfo> runningTasks = mActivityManager.getTasks(1, 0); if (runningTasks == null || runningTasks.size() == 0) { return; } RunningTaskInfo topTask = runningTasks.get(0); Rect bounds = isSettingsShown(topTask.topActivity) ? mSettingsPipBounds : mDefaultPipBounds; if (mPipBounds != bounds) { mPipBounds = bounds; resizePinnedStack(STATE_PIP_OVERLAY); } } catch (RemoteException e) { Log.d(TAG, "Failed to detect top activity", e); } } } } } Loading