Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Android.bp
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ filegroup {
":deviceproductinfoconstants_aidl",

":adbrootservice_aidl",
":lmofreeform_aidl",

// For the generated R.java and Manifest.java
":framework-res{.aapt.srcjar}",
Expand Down
15 changes: 15 additions & 0 deletions core/java/android/hardware/display/DisplayManagerInternal.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,21 @@
import android.hardware.SensorManager;
import android.hardware.input.HostUsiVersion;
import android.os.Handler;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.IntArray;
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayInfo;
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.RefreshRateRange;
import android.view.SurfaceControl.Transaction;
import android.window.DisplayWindowPolicyController;
import android.window.ScreenCaptureInternal;

import com.libremobileos.freeform.ILMOFreeformDisplayCallback;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
Expand Down Expand Up @@ -501,6 +505,17 @@ public abstract RefreshRateRange getRefreshRateForDisplayAndSensor(
*/
public abstract IntArray getDisplayIds();

// LMOFreeform
public abstract void createFreeformLocked(String name, ILMOFreeformDisplayCallback callback,
int width, int height, int densityDpi, boolean secure, boolean ownContentOnly,
boolean shouldShowSystemDecorations, Surface surface, float refreshRate,
long presentationDeadlineNanos);

public abstract void resizeFreeform(IBinder appToken, int width, int height,
int densityDpi);

public abstract void releaseFreeform(IBinder appToken);

/**
* Get group id for given display id
*/
Expand Down
23 changes: 23 additions & 0 deletions core/java/android/provider/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -6936,6 +6936,20 @@ public static void setShowGTalkServiceStatusForUser(ContentResolver cr, boolean
*/
public static final String VIBRATE_ON_DISCONNECT = "vibrate_on_disconnect";

/**
* GameSpace: List of added games by user
* @hide
*/
@Readable
public static final String GAMESPACE_GAME_LIST = "gamespace_game_list";

/**
* GameSpace: Whether fullscreen intent will be suppressed while in game session
* @hide
*/
@Readable
public static final String GAMESPACE_SUPPRESS_FULLSCREEN_INTENT = "gamespace_suppress_fullscreen_intent";

/**
* Whether to enable advanced reboot
* @hide
Expand Down Expand Up @@ -13599,6 +13613,15 @@ public static boolean putFloatForUser(ContentResolver cr, String name, float val
*/
public static final String BERRY_BLACK_THEME = "berry_black_theme";

/**
* Our GameSpace can't write to device_config directly [GTS]
* Use this as intermediate to pass device_config property
* from our GameSpace to com.android.server.app.GameManagerService
* so we can set the device_config property from there.
* @hide
*/
public static final String GAME_OVERLAY = "game_overlay";

/**
* User selectable PIF data.
* @hide
Expand Down
114 changes: 114 additions & 0 deletions core/java/android/view/animation/AnimationUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,17 @@
import android.content.res.Resources.Theme;
import android.content.res.XmlResourceParser;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.ravenwood.annotation.RavenwoodIgnore;
import android.ravenwood.annotation.RavenwoodKeepPartialClass;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TimeUtils;
import android.util.Xml;
import android.view.InflateException;

import com.android.internal.R;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

Expand Down Expand Up @@ -224,6 +228,20 @@ public static long getExpectedPresentationTimeMillis() {
public static Animation loadAnimation(Context context, @AnimRes int id)
throws NotFoundException {

if (SystemProperties.getBoolean("persist.sys.activity_anim_perf_override", false)) {
ActivityAnimations.maybeInit(context);
switch (id) {
case R.anim.activity_open_enter:
return ActivityAnimations.getOpenEnter();
case R.anim.activity_open_exit:
return ActivityAnimations.getOpenExit();
case R.anim.activity_close_enter:
return ActivityAnimations.getCloseEnter();
case R.anim.activity_close_exit:
return ActivityAnimations.getCloseExit();
}
}

XmlResourceParser parser = null;
try {
parser = context.getResources().getAnimation(id);
Expand Down Expand Up @@ -504,4 +522,100 @@ private static Interpolator createInterpolatorFromXml(
}
return interpolator;
}

/** @hide */
public final class ActivityAnimations {

private static Animation sOpenEnter;
private static Animation sOpenExit;
private static Animation sCloseEnter;
private static Animation sCloseExit;

private static Interpolator sFastOutExtraSlowInInterpolator;

private static final float DISTANCE = 0.1f;

private ActivityAnimations() {}

/** @hide */
public static void maybeInit(Context context) {
if (sFastOutExtraSlowInInterpolator == null) {
sFastOutExtraSlowInInterpolator = AnimationUtils.loadInterpolator(
context, R.interpolator.fast_out_extra_slow_in);
}
}

private static class ActivityAnimFactory {
private float fromX = 0f, toX = 0f;
private long duration = 200L;

public ActivityAnimFactory fromX(float ratio) {
this.fromX = ratio;
return this;
}

public ActivityAnimFactory toX(float ratio) {
this.toX = ratio;
return this;
}

public Animation build() {
AnimationSet animationSet = new AnimationSet(false);
TranslateAnimation slide = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, fromX,
Animation.RELATIVE_TO_SELF, toX,
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f
);
slide.setDuration(duration);
slide.setInterpolator(sFastOutExtraSlowInInterpolator);
animationSet.addAnimation(slide);
return animationSet;
}
}

/** @hide */
public static Animation getOpenEnter() {
if (sOpenEnter == null) {
sOpenEnter = new ActivityAnimFactory()
.fromX(1.0f)
.toX(0.0f)
.build();
}
return sOpenEnter;
}

/** @hide */
public static Animation getOpenExit() {
if (sOpenExit == null) {
sOpenExit = new ActivityAnimFactory()
.fromX(0.0f)
.toX(-DISTANCE)
.build();
}
return sOpenExit;
}

/** @hide */
public static Animation getCloseEnter() {
if (sCloseEnter == null) {
sCloseEnter = new ActivityAnimFactory()
.fromX(-DISTANCE)
.toX(0.0f)
.build();
}
return sCloseEnter;
}

/** @hide */
public static Animation getCloseExit() {
if (sCloseExit == null) {
sCloseExit = new ActivityAnimFactory()
.fromX(0.0f)
.toX(1.0f)
.build();
}
return sCloseExit;
}
}
}
8 changes: 8 additions & 0 deletions core/res/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -854,6 +854,10 @@
<protected-broadcast android:name="android.service.ondeviceintelligence.MODEL_LOADED" />
<protected-broadcast android:name="android.service.ondeviceintelligence.MODEL_UNLOADED" />
<protected-broadcast android:name="android.telephony.satellite.action.SATELLITE_START_NON_EMERGENCY_SESSION" />

<!-- GameSpace -->
<protected-broadcast android:name="io.chaldeaprjkt.gamespace.action.GAME_START" />
<protected-broadcast android:name="io.chaldeaprjkt.gamespace.action.GAME_STOP" />

<!-- Added in 25Q4 -->
<protected-broadcast android:name="android.intent.action.STOP_VOICE_COMMAND" />
Expand Down Expand Up @@ -941,6 +945,10 @@
android:knownCerts="@array/config_setContactsDefaultAccountKnownSigners"
android:featureFlag="android.provider.new_default_account_api_enabled"/>

<!-- @hide -->
<permission android:name="com.libremobileos.permission.START_FREEFORM"
android:protectionLevel="signature|privileged" />

<!-- ====================================================================== -->
<!-- Permissions for accessing user's calendar -->
<!-- ====================================================================== -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Insets;
import android.graphics.Point;
Expand All @@ -54,6 +55,7 @@
import android.window.DesktopModeFlags;
import android.window.WindowContainerTransaction;

import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.internal.annotations.VisibleForTesting;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
Expand Down Expand Up @@ -220,7 +222,7 @@ static void updateRelayoutParams(
boolean shouldSetTaskVisibilityPositionAndCrop,
boolean isStatusBarVisible,
boolean isKeyguardVisibleAndOccluded,
InsetsState displayInsetsState,
DisplayController displayController,
boolean hasGlobalFocus,
@NonNull Region globalExclusionRegion,
boolean shouldSetBackground,
Expand All @@ -246,6 +248,8 @@ static void updateRelayoutParams(
|| (isStatusBarVisible && !isKeyguardVisibleAndOccluded);
relayoutParams.mDisplayExclusionRegion.set(globalExclusionRegion);
relayoutParams.mInSyncWithTransition = inSyncWithTransition;
relayoutParams.mCornerRadius =
getCornerRadius(context, displayController.getDisplay(taskInfo.displayId));

if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) {
// If the app is requesting to customize the caption bar, allow input to fall
Expand All @@ -265,7 +269,8 @@ static void updateRelayoutParams(
);

relayoutParams.mCaptionTopPadding = getTopPadding(relayoutParams,
taskInfo.getConfiguration().windowConfiguration.getBounds(), displayInsetsState);
taskInfo.getConfiguration().windowConfiguration.getBounds(),
displayController.getInsetsState(taskInfo.displayId));
// Set opaque background for all freeform tasks to prevent freeform tasks below
// from being visible if freeform task window above is translucent.
// Otherwise if fluid resize is enabled, add a background to freeform tasks.
Expand All @@ -290,7 +295,7 @@ void relayout(RunningTaskInfo taskInfo,
updateRelayoutParams(mRelayoutParams, mContext, taskInfo, applyStartTransactionOnDraw,
shouldSetTaskVisibilityPositionAndCrop, mIsStatusBarVisible,
mIsKeyguardVisibleAndOccluded,
mDisplayController.getInsetsState(taskInfo.displayId), hasGlobalFocus,
mDisplayController, hasGlobalFocus,
globalExclusionRegion, mDesktopConfig.shouldSetBackground(taskInfo),
inSyncWithTransition);

Expand Down Expand Up @@ -350,6 +355,19 @@ void relayout(RunningTaskInfo taskInfo,
});
}

private static int getCornerRadius(Context context, Display display) {
// Show rounded corners only on the internal display as we can't get rounded corners for
// external displays.
if (display.getType() != Display.TYPE_INTERNAL) {
return 0;
}
final TypedArray ta = context.obtainStyledAttributes(
new int[]{android.R.attr.dialogCornerRadius});
final int cornerRadius = ta.getDimensionPixelSize(0, 0);
ta.recycle();
return cornerRadius;
}

/**
* Sets up listeners when a new root view is created.
*/
Expand Down
3 changes: 3 additions & 0 deletions packages/SystemUI/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,9 @@

<!-- To be able to decipher default applications for certain roles in shortcut helper -->
<uses-permission android:name="android.permission.MANAGE_DEFAULT_APPLICATIONS" />

<!-- To broadcast status of the GameSpaceManager -->
<uses-permission android:name="android.permission.MANAGE_GAME_MODE" />

<!-- To be able to set unrestricted system gesture exclusion rects -->
<uses-permission android:name="android.permission.SET_UNRESTRICTED_GESTURE_EXCLUSION"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.android.systemui.qs.QSPanelController;
import com.android.systemui.shared.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.GameSpaceManager;
import com.android.systemui.util.Compile;

import java.io.PrintWriter;
Expand Down Expand Up @@ -350,4 +351,6 @@ void setIsLaunchingActivityOverLockscreen(
*/
ActivityTransitionAnimator.Controller getAnimatorControllerFromNotification(
ExpandableNotificationRow associatedView);

GameSpaceManager getGameSpaceManager();
}
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,7 @@
import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorControllerProvider;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
import com.android.systemui.statusbar.policy.GameSpaceManager;
import com.android.systemui.statusbar.notification.init.NotificationsController;
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
Expand Down Expand Up @@ -467,6 +468,8 @@ public void toggleCameraFlash() {
private final UserTracker mUserTracker;
private final ActivityStarter mActivityStarter;

private GameSpaceManager mGameSpaceManager;

private final DisplayMetrics mDisplayMetrics;

// XXX: gesture research
Expand Down Expand Up @@ -848,6 +851,8 @@ public CentralSurfacesImpl(
mActivityIntentHelper = new ActivityIntentHelper(mContext);
mActivityTransitionAnimator = activityTransitionAnimator;

mGameSpaceManager = new GameSpaceManager(mContext, mKeyguardStateController);

// TODO(b/190746471): Find a better home for this.
DateTimeView.setReceiverHandler(timeTickHandler);

Expand Down Expand Up @@ -1483,6 +1488,13 @@ protected void registerBroadcastReceiver() {
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_CAMERA_GESTURE);
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);

mGameSpaceManager.observe();
}

@Override
public GameSpaceManager getGameSpaceManager() {
return mGameSpaceManager;
}

protected QS createDefaultQSFragment() {
Expand Down
Loading