Merge "Make sure test APK is build when test is run via test mapping"
diff --git a/api/current.txt b/api/current.txt
index 00f06ec..c4fa0ab 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -45972,6 +45972,7 @@
field public static final int TYPE_MCX = 1024; // 0x400
field public static final int TYPE_MMS = 2; // 0x2
field public static final int TYPE_SUPL = 4; // 0x4
+ field public static final int TYPE_XCAP = 2048; // 0x800
}
public static class ApnSetting.Builder {
diff --git a/api/system-current.txt b/api/system-current.txt
index 472f1ec..7e846d8 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6885,7 +6885,7 @@
method @BinderThread public abstract void onRevokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull String, @NonNull java.util.function.Consumer<java.util.Map<java.lang.String,java.util.List<java.lang.String>>>);
method @BinderThread public abstract void onSetRuntimePermissionGrantStateByDeviceAdmin(@NonNull String, @NonNull String, @NonNull String, int, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @BinderThread public void onStageAndApplyRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.InputStream, @NonNull Runnable);
- method @BinderThread public void onUpdateUserSensitive();
+ method @BinderThread public void onUpdateUserSensitivePermissionFlags();
field public static final String SERVICE_INTERFACE = "android.permission.PermissionControllerService";
}
diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java
index 8f765fa..f914663 100644
--- a/core/java/android/permission/PermissionControllerService.java
+++ b/core/java/android/permission/PermissionControllerService.java
@@ -221,7 +221,7 @@
* permission controller package.
*/
@BinderThread
- public void onUpdateUserSensitive() {
+ public void onUpdateUserSensitivePermissionFlags() {
throw new AbstractMethodError("Must be overridden in implementing class");
}
@@ -449,7 +449,7 @@
public void updateUserSensitive(AndroidFuture callback) {
Preconditions.checkNotNull(callback, "callback cannot be null");
- onUpdateUserSensitive();
+ onUpdateUserSensitivePermissionFlags();
callback.complete(null);
}
};
diff --git a/core/java/android/service/controls/BooleanAction.java b/core/java/android/service/controls/BooleanAction.java
index 8508c63..877f82e 100644
--- a/core/java/android/service/controls/BooleanAction.java
+++ b/core/java/android/service/controls/BooleanAction.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Bundle;
import android.os.Parcel;
/**
@@ -26,6 +27,8 @@
*/
public final class BooleanAction extends ControlAction {
+ private static final String KEY_NEW_STATE = "key_new_state";
+
private final boolean mNewState;
/**
@@ -49,9 +52,9 @@
mNewState = newValue;
}
- BooleanAction(Parcel in) {
- super(in);
- mNewState = in.readByte() == 1;
+ BooleanAction(Bundle b) {
+ super(b);
+ mNewState = b.getBoolean(KEY_NEW_STATE);
}
/**
@@ -72,17 +75,17 @@
return ControlAction.TYPE_BOOLEAN;
}
-
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeByte(mNewState ? (byte) 1 : (byte) 0);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putBoolean(KEY_NEW_STATE, mNewState);
+ return b;
}
public static final @NonNull Creator<BooleanAction> CREATOR = new Creator<BooleanAction>() {
@Override
public BooleanAction createFromParcel(Parcel source) {
- return new BooleanAction(source);
+ return new BooleanAction(source.readBundle());
}
@Override
diff --git a/core/java/android/service/controls/Control.java b/core/java/android/service/controls/Control.java
index a69408c..2c17e89 100644
--- a/core/java/android/service/controls/Control.java
+++ b/core/java/android/service/controls/Control.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.PendingIntent;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Icon;
@@ -55,7 +56,7 @@
private final @NonNull Icon mIcon;
private final @NonNull CharSequence mTitle;
private final @Nullable ColorStateList mTintColor;
- private final @NonNull Intent mAppIntent;
+ private final @NonNull PendingIntent mAppIntent;
private final @ControlTemplate.TemplateType int mPrimaryType;
/**
@@ -64,14 +65,15 @@
* @param title the user facing name of this control (e.g. "Bedroom thermostat").
* @param tintColor the color to tint parts of the element UI. If {@code null} is passed, the
* system accent color will be used.
- * @param appIntent an intent linking to a page to interact with the corresponding device.
+ * @param appIntent a {@link PendingIntent} linking to a page to interact with the
+ * corresponding device.
* @param primaryType the primary template for this type.
*/
public Control(@NonNull String controlId,
@NonNull Icon icon,
@NonNull CharSequence title,
@Nullable ColorStateList tintColor,
- @NonNull Intent appIntent,
+ @NonNull PendingIntent appIntent,
int primaryType) {
Preconditions.checkNotNull(controlId);
Preconditions.checkNotNull(icon);
@@ -94,7 +96,7 @@
} else {
mTintColor = null;
}
- mAppIntent = Intent.CREATOR.createFromParcel(in);
+ mAppIntent = PendingIntent.CREATOR.createFromParcel(in);
mPrimaryType = in.readInt();
}
@@ -119,7 +121,7 @@
}
@NonNull
- public Intent getAppIntent() {
+ public PendingIntent getAppIntent() {
return mAppIntent;
}
@@ -175,17 +177,17 @@
private Icon mIcon;
private CharSequence mTitle = "";
private ColorStateList mTintColor;
- private @Nullable Intent mAppIntent;
+ private @Nullable PendingIntent mAppIntent;
private @ControlTemplate.TemplateType int mPrimaryType = ControlTemplate.TYPE_NONE;
/**
* @param controlId the identifier for the {@link Control}.
* @param icon the icon for the {@link Control}.
- * @param appIntent the intent linking to the device Activity.
+ * @param appIntent the pending intent linking to the device Activity.
*/
public Builder(@NonNull String controlId,
@NonNull Icon icon,
- @NonNull Intent appIntent) {
+ @NonNull PendingIntent appIntent) {
Preconditions.checkNotNull(controlId);
Preconditions.checkNotNull(icon);
Preconditions.checkNotNull(appIntent);
@@ -256,7 +258,7 @@
* @return {@code this}
*/
@NonNull
- public Builder setAppIntent(@NonNull Intent appIntent) {
+ public Builder setAppIntent(@NonNull PendingIntent appIntent) {
Preconditions.checkNotNull(appIntent);
mAppIntent = appIntent;
return this;
diff --git a/core/java/android/service/controls/ControlAction.java b/core/java/android/service/controls/ControlAction.java
index 8b75955..0a7c97c 100644
--- a/core/java/android/service/controls/ControlAction.java
+++ b/core/java/android/service/controls/ControlAction.java
@@ -16,9 +16,11 @@
package android.service.controls;
+import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -36,25 +38,38 @@
*/
public abstract class ControlAction implements Parcelable {
+ private static final String KEY_TEMPLATE_ID = "key_template_id";
+ private static final String KEY_CHALLENGE_VALUE = "key_challenge_value";
+
+ public static final ControlAction UNKNOWN_ACTION = new ControlAction() {
+
+ @Override
+ public int getActionType() {
+ return TYPE_UNKNOWN;
+ }
+ };
+
/**
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
+ TYPE_UNKNOWN,
TYPE_BOOLEAN,
TYPE_FLOAT
})
public @interface ActionType {};
+ public static final @ActionType int TYPE_UNKNOWN = 0;
/**
* The identifier of {@link BooleanAction}.
*/
- public static final @ActionType int TYPE_BOOLEAN = 0;
+ public static final @ActionType int TYPE_BOOLEAN = 1;
/**
* The identifier of {@link FloatAction}.
*/
- public static final @ActionType int TYPE_FLOAT = 1;
+ public static final @ActionType int TYPE_FLOAT = 2;
/**
* @hide
@@ -120,13 +135,9 @@
/**
* @hide
*/
- ControlAction(Parcel in) {
- mTemplateId = in.readString();
- if (in.readByte() == 1) {
- mChallengeValue = in.readString();
- } else {
- mChallengeValue = null;
- }
+ ControlAction(Bundle b) {
+ mTemplateId = b.getString(KEY_TEMPLATE_ID);
+ mChallengeValue = b.getString(KEY_CHALLENGE_VALUE);
}
/**
@@ -151,15 +162,24 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public final void writeToParcel(Parcel dest, int flags) {
dest.writeInt(getActionType());
- dest.writeString(mTemplateId);
- if (mChallengeValue != null) {
- dest.writeByte((byte) 1);
- dest.writeString(mChallengeValue);
- } else {
- dest.writeByte((byte) 0);
- }
+ dest.writeBundle(getDataBundle());
+ }
+
+ /**
+ * Obtain a {@link Bundle} describing this object populated with data.
+ *
+ * Implementations in subclasses should populate the {@link Bundle} returned by
+ * {@link ControlAction}.
+ * @return a {@link Bundle} containing the data that represents this object.
+ */
+ @CallSuper
+ protected Bundle getDataBundle() {
+ Bundle b = new Bundle();
+ b.putString(KEY_TEMPLATE_ID, mTemplateId);
+ b.putString(KEY_CHALLENGE_VALUE, mChallengeValue);
+ return b;
}
public static final @NonNull Creator<ControlAction> CREATOR = new Creator<ControlAction>() {
@@ -175,6 +195,7 @@
}
};
+
private static ControlAction createActionFromType(@ActionType int type, Parcel source) {
switch(type) {
case TYPE_BOOLEAN:
@@ -182,7 +203,8 @@
case TYPE_FLOAT:
return FloatAction.CREATOR.createFromParcel(source);
default:
- return null;
+ source.readBundle();
+ return UNKNOWN_ACTION;
}
}
diff --git a/core/java/android/service/controls/ControlButton.java b/core/java/android/service/controls/ControlButton.java
index fed3115..969c0a7 100644
--- a/core/java/android/service/controls/ControlButton.java
+++ b/core/java/android/service/controls/ControlButton.java
@@ -29,29 +29,29 @@
*/
public class ControlButton implements Parcelable {
- private final boolean mActive;
+ private final boolean mChecked;
private final @NonNull Icon mIcon;
private final @NonNull CharSequence mContentDescription;
/**
- * @param active true if the button should be rendered as active.
+ * @param checked true if the button should be rendered as active.
* @param icon icon to display in the button.
* @param contentDescription content description for the button.
*/
- public ControlButton(boolean active, @NonNull Icon icon,
+ public ControlButton(boolean checked, @NonNull Icon icon,
@NonNull CharSequence contentDescription) {
Preconditions.checkNotNull(icon);
Preconditions.checkNotNull(contentDescription);
- mActive = active;
+ mChecked = checked;
mIcon = icon;
mContentDescription = contentDescription;
}
/**
- * Whether the button should be rendered in its active state.
+ * Whether the button should be rendered in a checked state.
*/
- public boolean isActive() {
- return mActive;
+ public boolean isChecked() {
+ return mChecked;
}
/**
@@ -78,13 +78,13 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeByte(mActive ? (byte) 1 : (byte) 0);
+ dest.writeByte(mChecked ? (byte) 1 : (byte) 0);
mIcon.writeToParcel(dest, flags);
dest.writeCharSequence(mContentDescription);
}
ControlButton(Parcel in) {
- mActive = in.readByte() != 0;
+ mChecked = in.readByte() != 0;
mIcon = Icon.CREATOR.createFromParcel(in);
mContentDescription = in.readCharSequence();
}
diff --git a/core/java/android/service/controls/ControlState.java b/core/java/android/service/controls/ControlState.java
index 804aef7..f2410a8 100644
--- a/core/java/android/service/controls/ControlState.java
+++ b/core/java/android/service/controls/ControlState.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.PendingIntent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Icon;
import android.os.Parcel;
@@ -33,11 +34,11 @@
* Current state for a {@link Control}.
*
* Collects information to render the current state of a {@link Control} as well as possible action
- * that can be performed on it. Some of the information may temporarily override the defaults
- * provided by the corresponding {@link Control}, while this state is being displayed.
- *
- * Additionally, this can be used to modify information related to the corresponding
- * {@link Control}.
+ * that can be performed on it.
+ * <p>
+ * Additionally, this object is used to modify elements from the {@link Control} such as icons,
+ * colors, names and intents. This information will last until it is again modified by a
+ * {@link ControlState}.
* @hide
*/
public final class ControlState implements Parcelable {
@@ -74,58 +75,81 @@
*/
public static final int STATUS_DISABLED = 3;
- private final @NonNull Control mControl;
+ private final @NonNull String mControlId;
private final @Status int mStatus;
private final @NonNull ControlTemplate mControlTemplate;
private final @NonNull CharSequence mStatusText;
- private final @Nullable Icon mOverrideIcon;
- private final @Nullable ColorStateList mOverrideTint;
+ private final @Nullable CharSequence mTitle;
+ private final @Nullable PendingIntent mAppIntent;
+ private final @Nullable Icon mIcon;
+ private final @Nullable ColorStateList mTint;
/**
- * @param control the {@link Control} this state should be applied to. Can be used to
- * update information about the {@link Control}
+ * @param controlId the identifier of the {@link Control} this object refers to.
* @param status the current status of the {@link Control}.
- * @param controlTemplate the template to be used to render the {@link Control}.
- * @param statusText the text describing the current status.
- * @param overrideIcon the icon to temporarily override the one provided in
- * {@link Control#getIcon()}. Pass {@code null} to use the icon in
- * {@link Control#getIcon()}.
- * @param overrideTint the colors to temporarily override those provided in
- * {@link Control#getTint()}. Pass {@code null} to use the colors in
- * {@link Control#getTint()}.
+ * @param controlTemplate the template to be used to render the {@link Control}. This can be
+ * of a different
+ * {@link android.service.controls.ControlTemplate.TemplateType} than the
+ * one defined in {@link Control#getPrimaryType}
+ * @param statusText the user facing text describing the current status.
+ * @param title the title to replace the one set in the {@link Control} or set in the
+ * last {@link ControlState}. Pass {@code null} to use the last value set for this
+ * {@link Control}
+ * @param appIntent the {@link PendingIntent} to replace the one set in the {@link Control} or
+ * set in the last {@link ControlState}. Pass {@code null} to use the last
+ * value set for this {@link Control}.
+ * @param icon the icon to replace the one set in the {@link Control} or set in the last
+ * {@link ControlState}. Pass {@code null} to use the last value set for this
+ * {@link Control}.
+ * @param tint the colors to replace those set in the {@link Control} or set in the last
+ * {@link ControlState}. Pass {@code null} to use the last value set for this
+ * {@link Control}.
*/
- public ControlState(@NonNull Control control,
+ public ControlState(@NonNull String controlId,
int status,
@NonNull ControlTemplate controlTemplate,
@NonNull CharSequence statusText,
- @Nullable Icon overrideIcon,
- @Nullable ColorStateList overrideTint) {
- Preconditions.checkNotNull(control);
+ @Nullable CharSequence title,
+ @Nullable PendingIntent appIntent,
+ @Nullable Icon icon,
+ @Nullable ColorStateList tint) {
+ Preconditions.checkNotNull(controlId);
Preconditions.checkNotNull(controlTemplate);
Preconditions.checkNotNull(statusText);
-
- mControl = control;
+ mControlId = controlId;
mStatus = status;
mControlTemplate = controlTemplate;
- mOverrideIcon = overrideIcon;
mStatusText = statusText;
- mOverrideTint = overrideTint;
+ mTitle = title;
+ mAppIntent = appIntent;
+ mIcon = icon;
+ mTint = tint;
}
ControlState(Parcel in) {
- mControl = Control.CREATOR.createFromParcel(in);
+ mControlId = in.readString();
mStatus = in.readInt();
mControlTemplate = ControlTemplate.CREATOR.createFromParcel(in);
mStatusText = in.readCharSequence();
if (in.readByte() == 1) {
- mOverrideIcon = Icon.CREATOR.createFromParcel(in);
+ mTitle = in.readCharSequence();
} else {
- mOverrideIcon = null;
+ mTitle = null;
}
if (in.readByte() == 1) {
- mOverrideTint = ColorStateList.CREATOR.createFromParcel(in);
+ mAppIntent = PendingIntent.CREATOR.createFromParcel(in);
} else {
- mOverrideTint = null;
+ mAppIntent = null;
+ }
+ if (in.readByte() == 1) {
+ mIcon = Icon.CREATOR.createFromParcel(in);
+ } else {
+ mIcon = null;
+ }
+ if (in.readByte() == 1) {
+ mTint = ColorStateList.CREATOR.createFromParcel(in);
+ } else {
+ mTint = null;
}
}
@@ -134,6 +158,21 @@
return 0;
}
+ @NonNull
+ public String getControlId() {
+ return mControlId;
+ }
+
+ @Nullable
+ public CharSequence getTitle() {
+ return mTitle;
+ }
+
+ @Nullable
+ public PendingIntent getAppIntent() {
+ return mAppIntent;
+ }
+
@Status
public int getStatus() {
return mStatus;
@@ -145,8 +184,8 @@
}
@Nullable
- public Icon getOverrideIcon() {
- return mOverrideIcon;
+ public Icon getIcon() {
+ return mIcon;
}
@NonNull
@@ -155,35 +194,35 @@
}
@Nullable
- public ColorStateList getOverrideTint() {
- return mOverrideTint;
- }
-
- @NonNull
- public Control getControl() {
- return mControl;
- }
-
- @NonNull
- public String getControlId() {
- return mControl.getControlId();
+ public ColorStateList getTint() {
+ return mTint;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
- mControl.writeToParcel(dest, flags);
+ dest.writeString(mControlId);
dest.writeInt(mStatus);
mControlTemplate.writeToParcel(dest, flags);
dest.writeCharSequence(mStatusText);
- if (mOverrideIcon != null) {
+ if (mTitle != null) {
dest.writeByte((byte) 1);
- mOverrideIcon.writeToParcel(dest, flags);
+ dest.writeCharSequence(mTitle);
} else {
dest.writeByte((byte) 0);
}
- if (mOverrideTint != null) {
+ if (mAppIntent != null) {
dest.writeByte((byte) 1);
- mOverrideTint.writeToParcel(dest, flags);
+ mAppIntent.writeToParcel(dest, flags);
+ }
+ if (mIcon != null) {
+ dest.writeByte((byte) 1);
+ mIcon.writeToParcel(dest, flags);
+ } else {
+ dest.writeByte((byte) 0);
+ }
+ if (mTint != null) {
+ dest.writeByte((byte) 1);
+ mTint.writeToParcel(dest, flags);
} else {
dest.writeByte((byte) 0);
}
@@ -213,19 +252,22 @@
* </ul>
*/
public static class Builder {
- private @NonNull Control mControl;
+ private @NonNull String mControlId;
private @Status int mStatus = STATUS_OK;
private @NonNull ControlTemplate mControlTemplate = ControlTemplate.NO_TEMPLATE;
private @NonNull CharSequence mStatusText = "";
- private @Nullable Icon mOverrideIcon;
- private @Nullable ColorStateList mOverrideTint;
+ private @Nullable CharSequence mTitle;
+ private @Nullable PendingIntent mAppIntent;
+ private @Nullable Icon mIcon;
+ private @Nullable ColorStateList mTint;
/**
- * @param control the {@link Control} that the resulting {@link ControlState} refers to.
+ * @param controlId the identifier of the {@link Control} that the resulting
+ * {@link ControlState} refers to.
*/
- public Builder(@NonNull Control control) {
- Preconditions.checkNotNull(control);
- mControl = control;
+ public Builder(@NonNull String controlId) {
+ Preconditions.checkNotNull(controlId);
+ mControlId = controlId;
}
/**
@@ -234,21 +276,24 @@
*/
public Builder(@NonNull ControlState controlState) {
Preconditions.checkNotNull(controlState);
- mControl = controlState.mControl;
+ mControlId = controlState.mControlId;
+ mStatus = controlState.mStatus;
mControlTemplate = controlState.mControlTemplate;
- mOverrideIcon = controlState.mOverrideIcon;
mStatusText = controlState.mStatusText;
- mOverrideTint = controlState.mOverrideTint;
+ mTitle = controlState.mTitle;
+ mAppIntent = controlState.mAppIntent;
+ mIcon = controlState.mIcon;
+ mTint = controlState.mTint;
}
/**
- * @param control the updated {@link Control} information.
+ * @param controlId the identifier of the {@link Control} for the resulting object.
* @return {@code this}
*/
@NonNull
- public Builder setControl(@NonNull Control control) {
- mControl = control;
+ public Builder setControlId(@NonNull String controlId) {
+ mControlId = controlId;
return this;
}
@@ -285,24 +330,50 @@
}
/**
- * @param overrideIcon the icon to override the one defined in the corresponding
- * {@code Control}. Pass {@code null} to remove the override.
+ * @param title the title to replace the one defined in the corresponding {@link Control} or
+ * set by the last {@link ControlState}. Pass {@code null} to keep the last
+ * value.
* @return {@code this}
*/
@NonNull
- public Builder setOverrideIcon(@Nullable Icon overrideIcon) {
- mOverrideIcon = overrideIcon;
+ public Builder setTitle(@Nullable CharSequence title) {
+ mTitle = title;
return this;
}
/**
- * @param overrideTint the colors to override the ones defined in the corresponding
- * {@code Control}. Pass {@code null} to remove the override.
+ * @param appIntent the Pending Intent to replace the one defined in the corresponding
+ * {@link Control} or set by the last {@link ControlState}. Pass
+ * {@code null} to keep the last value.
* @return {@code this}
*/
@NonNull
- public Builder setOverrideTint(@Nullable ColorStateList overrideTint) {
- mOverrideTint = overrideTint;
+ public Builder setAppIntent(@Nullable PendingIntent appIntent) {
+ mAppIntent = appIntent;
+ return this;
+ }
+
+ /**
+ * @param icon the title to replace the one defined in the corresponding {@link Control} or
+ * set by the last {@link ControlState}. Pass {@code null} to keep the last
+ * value.
+ * @return {@code this}
+ */
+ @NonNull
+ public Builder setIcon(@Nullable Icon icon) {
+ mIcon = icon;
+ return this;
+ }
+
+ /**
+ * @param tint the title to replace the one defined in the corresponding {@link Control} or
+ * set by the last {@link ControlState}. Pass {@code null} to keep the last
+ * value.
+ * @return {@code this}
+ */
+ @NonNull
+ public Builder setTint(@Nullable ColorStateList tint) {
+ mTint = tint;
return this;
}
@@ -310,8 +381,8 @@
* @return a new {@link ControlState}
*/
public ControlState build() {
- return new ControlState(mControl, mStatus, mControlTemplate, mStatusText,
- mOverrideIcon, mOverrideTint);
+ return new ControlState(mControlId, mStatus, mControlTemplate, mStatusText,
+ mTitle, mAppIntent, mIcon, mTint);
}
}
}
diff --git a/core/java/android/service/controls/ControlTemplate.java b/core/java/android/service/controls/ControlTemplate.java
index e559862..8bcabd6 100644
--- a/core/java/android/service/controls/ControlTemplate.java
+++ b/core/java/android/service/controls/ControlTemplate.java
@@ -16,8 +16,10 @@
package android.service.controls;
+import android.annotation.CallSuper;
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -40,6 +42,8 @@
*/
public abstract class ControlTemplate implements Parcelable {
+ private static final String KEY_TEMPLATE_ID = "key_template_id";
+
/**
* Singleton representing a {@link Control} with no input.
*/
@@ -114,17 +118,28 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public final void writeToParcel(Parcel dest, int flags) {
dest.writeInt(getTemplateType());
- dest.writeString(mTemplateId);
+ dest.writeBundle(getDataBundle());
+ }
+
+ /**
+ * Obtain a {@link Bundle} describing this object populated with data.
+ * @return a {@link Bundle} containing the data that represents this object.
+ */
+ @CallSuper
+ protected Bundle getDataBundle() {
+ Bundle b = new Bundle();
+ b.putString(KEY_TEMPLATE_ID, mTemplateId);
+ return b;
}
private ControlTemplate() {
mTemplateId = "";
}
- ControlTemplate(Parcel in) {
- mTemplateId = in.readString();
+ ControlTemplate(@NonNull Bundle b) {
+ mTemplateId = b.getString(KEY_TEMPLATE_ID);
}
/**
@@ -148,6 +163,7 @@
}
};
+
private static ControlTemplate createTemplateFromType(@TemplateType int type, Parcel source) {
switch(type) {
case TYPE_TOGGLE:
@@ -159,9 +175,9 @@
case TYPE_DISCRETE_TOGGLE:
return DiscreteToggleTemplate.CREATOR.createFromParcel(source);
case TYPE_NONE:
- return NO_TEMPLATE;
default:
- return null;
+ source.readBundle();
+ return NO_TEMPLATE;
}
}
}
diff --git a/core/java/android/service/controls/DiscreteToggleTemplate.java b/core/java/android/service/controls/DiscreteToggleTemplate.java
index 5167af4..5718252 100644
--- a/core/java/android/service/controls/DiscreteToggleTemplate.java
+++ b/core/java/android/service/controls/DiscreteToggleTemplate.java
@@ -17,6 +17,7 @@
package android.service.controls;
import android.annotation.NonNull;
+import android.os.Bundle;
import android.os.Parcel;
import com.android.internal.util.Preconditions;
@@ -34,6 +35,9 @@
*/
public class DiscreteToggleTemplate extends ControlTemplate {
+ private static final String KEY_NEGATIVE_BUTTON = "key_negative_button";
+ private static final String KEY_POSITIVE_BUTTON = "key_positive_button";
+
private final @NonNull ControlButton mNegativeButton;
private final @NonNull ControlButton mPositiveButton;
@@ -52,10 +56,10 @@
mPositiveButton = positiveButton;
}
- DiscreteToggleTemplate(Parcel in) {
- super(in);
- this.mNegativeButton = ControlButton.CREATOR.createFromParcel(in);
- this.mPositiveButton = ControlButton.CREATOR.createFromParcel(in);
+ DiscreteToggleTemplate(Bundle b) {
+ super(b);
+ mNegativeButton = b.getParcelable(KEY_NEGATIVE_BUTTON);
+ mPositiveButton = b.getParcelable(KEY_POSITIVE_BUTTON);
}
/**
@@ -89,17 +93,18 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- mNegativeButton.writeToParcel(dest, flags);
- mPositiveButton.writeToParcel(dest, flags);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putObject(KEY_NEGATIVE_BUTTON, mNegativeButton);
+ b.putObject(KEY_POSITIVE_BUTTON, mPositiveButton);
+ return b;
}
public static final Creator<DiscreteToggleTemplate> CREATOR =
new Creator<DiscreteToggleTemplate>() {
@Override
public DiscreteToggleTemplate createFromParcel(Parcel source) {
- return new DiscreteToggleTemplate(source);
+ return new DiscreteToggleTemplate(source.readBundle());
}
@Override
diff --git a/core/java/android/service/controls/FloatAction.java b/core/java/android/service/controls/FloatAction.java
index fe6db10..229435f 100644
--- a/core/java/android/service/controls/FloatAction.java
+++ b/core/java/android/service/controls/FloatAction.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Bundle;
import android.os.Parcel;
/**
@@ -26,6 +27,8 @@
*/
public final class FloatAction extends ControlAction {
+ private static final String KEY_NEW_VALUE = "key_new_value";
+
private final float mNewValue;
/**
@@ -50,9 +53,9 @@
mNewValue = newValue;
}
- public FloatAction(Parcel in) {
- super(in);
- mNewValue = in.readFloat();
+ public FloatAction(Bundle b) {
+ super(b);
+ mNewValue = b.getFloat(KEY_NEW_VALUE);
}
/**
@@ -71,15 +74,16 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeFloat(mNewValue);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putFloat(KEY_NEW_VALUE, mNewValue);
+ return b;
}
public static final @NonNull Creator<FloatAction> CREATOR = new Creator<FloatAction>() {
@Override
public FloatAction createFromParcel(Parcel source) {
- return new FloatAction(source);
+ return new FloatAction(source.readBundle());
}
@Override
diff --git a/core/java/android/service/controls/RangeTemplate.java b/core/java/android/service/controls/RangeTemplate.java
index 70bf2dd..f0bce30 100644
--- a/core/java/android/service/controls/RangeTemplate.java
+++ b/core/java/android/service/controls/RangeTemplate.java
@@ -18,10 +18,9 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.os.Bundle;
import android.os.Parcel;
-import com.android.internal.util.Preconditions;
-
import java.security.InvalidParameterException;
/**
@@ -32,6 +31,12 @@
*/
public final class RangeTemplate extends ControlTemplate {
+ private static final String KEY_MIN_VALUE = "key_min_value";
+ private static final String KEY_MAX_VALUE = "key_max_value";
+ private static final String KEY_CURRENT_VALUE = "key_current_value";
+ private static final String KEY_STEP_VALUE = "key_step_value";
+ private static final String KEY_FORMAT_STRING = "key_format_string";
+
private final float mMinValue;
private final float mMaxValue;
private final float mCurrentValue;
@@ -67,7 +72,6 @@
float stepValue,
@Nullable CharSequence formatString) {
super(templateId);
- Preconditions.checkNotNull(formatString);
mMinValue = minValue;
mMaxValue = maxValue;
mCurrentValue = currentValue;
@@ -87,13 +91,13 @@
* @see RangeTemplate#RangeTemplate(String, float, float, float, float, CharSequence)
* @hide
*/
- RangeTemplate(Parcel in) {
- super(in);
- mMinValue = in.readFloat();
- mMaxValue = in.readFloat();
- mCurrentValue = in.readFloat();
- mStepValue = in.readFloat();
- mFormatString = in.readCharSequence();
+ RangeTemplate(Bundle b) {
+ super(b);
+ mMinValue = b.getFloat(KEY_MIN_VALUE);
+ mMaxValue = b.getFloat(KEY_MAX_VALUE);
+ mCurrentValue = b.getFloat(KEY_CURRENT_VALUE);
+ mStepValue = b.getFloat(KEY_STEP_VALUE);
+ mFormatString = b.getCharSequence(KEY_FORMAT_STRING, "%.1f");
validate();
}
@@ -144,13 +148,14 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- dest.writeFloat(mMinValue);
- dest.writeFloat(mMaxValue);
- dest.writeFloat(mCurrentValue);
- dest.writeFloat(mStepValue);
- dest.writeCharSequence(mFormatString);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putFloat(KEY_MIN_VALUE, mMinValue);
+ b.putFloat(KEY_MAX_VALUE, mMaxValue);
+ b.putFloat(KEY_CURRENT_VALUE, mCurrentValue);
+ b.putFloat(KEY_STEP_VALUE, mStepValue);
+ b.putCharSequence(KEY_FORMAT_STRING, mFormatString);
+ return b;
}
/**
@@ -179,7 +184,7 @@
public static final Creator<RangeTemplate> CREATOR = new Creator<RangeTemplate>() {
@Override
public RangeTemplate createFromParcel(Parcel source) {
- return new RangeTemplate(source);
+ return new RangeTemplate(source.readBundle());
}
@Override
diff --git a/core/java/android/service/controls/ThumbnailTemplate.java b/core/java/android/service/controls/ThumbnailTemplate.java
index 796d2de..6e729c0 100644
--- a/core/java/android/service/controls/ThumbnailTemplate.java
+++ b/core/java/android/service/controls/ThumbnailTemplate.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.graphics.drawable.Icon;
+import android.os.Bundle;
import android.os.Parcel;
import com.android.internal.util.Preconditions;
@@ -28,6 +29,9 @@
*/
public final class ThumbnailTemplate extends ControlTemplate {
+ private static final String KEY_ICON = "key_icon";
+ private static final String KEY_CONTENT_DESCRIPTION = "key_content_description";
+
private final @NonNull Icon mThumbnail;
private final @NonNull CharSequence mContentDescription;
@@ -45,10 +49,10 @@
mContentDescription = contentDescription;
}
- ThumbnailTemplate(Parcel in) {
- super(in);
- mThumbnail = Icon.CREATOR.createFromParcel(in);
- mContentDescription = in.readCharSequence();
+ ThumbnailTemplate(Bundle b) {
+ super(b);
+ mThumbnail = b.getParcelable(KEY_ICON);
+ mContentDescription = b.getCharSequence(KEY_CONTENT_DESCRIPTION, "");
}
/**
@@ -74,17 +78,19 @@
public int getTemplateType() {
return TYPE_THUMBNAIL;
}
+
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- mThumbnail.writeToParcel(dest, flags);
- dest.writeCharSequence(mContentDescription);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putObject(KEY_ICON, mThumbnail);
+ b.putObject(KEY_CONTENT_DESCRIPTION, mContentDescription);
+ return b;
}
public static final Creator<ThumbnailTemplate> CREATOR = new Creator<ThumbnailTemplate>() {
@Override
public ThumbnailTemplate createFromParcel(Parcel source) {
- return new ThumbnailTemplate(source);
+ return new ThumbnailTemplate(source.readBundle());
}
@Override
diff --git a/core/java/android/service/controls/ToggleTemplate.java b/core/java/android/service/controls/ToggleTemplate.java
index 3766bd1..4c4fd5e 100644
--- a/core/java/android/service/controls/ToggleTemplate.java
+++ b/core/java/android/service/controls/ToggleTemplate.java
@@ -17,6 +17,7 @@
package android.service.controls;
import android.annotation.NonNull;
+import android.os.Bundle;
import android.os.Parcel;
import com.android.internal.util.Preconditions;
@@ -24,7 +25,7 @@
/**
* A template for a {@link Control} with a single button that can be toggled between two states.
*
- * The states for the toggle correspond to the states in {@link ControlButton#isActive()}.
+ * The states for the toggle correspond to the states in {@link ControlButton#isChecked()}.
* An action on this template will originate a {@link BooleanAction} to change that state.
*
* @see BooleanAction
@@ -32,6 +33,7 @@
*/
public final class ToggleTemplate extends ControlTemplate {
+ private static final String KEY_BUTTON = "key_button";
private final @NonNull ControlButton mButton;
/**
@@ -44,9 +46,9 @@
mButton = button;
}
- ToggleTemplate(Parcel in) {
- super(in);
- mButton = ControlButton.CREATOR.createFromParcel(in);
+ ToggleTemplate(Bundle b) {
+ super(b);
+ mButton = b.getParcelable(KEY_BUTTON);
}
/**
@@ -66,15 +68,16 @@
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
- super.writeToParcel(dest, flags);
- mButton.writeToParcel(dest, flags);
+ protected Bundle getDataBundle() {
+ Bundle b = super.getDataBundle();
+ b.putObject(KEY_BUTTON, mButton);
+ return b;
}
public static final Creator<ToggleTemplate> CREATOR = new Creator<ToggleTemplate>() {
@Override
public ToggleTemplate createFromParcel(Parcel source) {
- return new ToggleTemplate(source);
+ return new ToggleTemplate(source.readBundle());
}
@Override
diff --git a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
index bffc6b9..03bd61a 100644
--- a/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
+++ b/packages/CarSystemUI/src/com/android/systemui/CarSystemUIModule.java
@@ -35,6 +35,7 @@
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl;
+import com.android.systemui.statusbar.car.CarShadeControllerImpl;
import com.android.systemui.statusbar.car.CarStatusBar;
import com.android.systemui.statusbar.car.CarStatusBarKeyguardViewManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
@@ -119,7 +120,7 @@
KeyguardEnvironmentImpl keyguardEnvironment);
@Binds
- abstract ShadeController provideShadeController(CarStatusBar statusBar);
+ abstract ShadeController provideShadeController(CarShadeControllerImpl shadeController);
@Provides
@Singleton
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java
new file mode 100644
index 0000000..d1d352a
--- /dev/null
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarShadeControllerImpl.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.car;
+
+import android.view.View;
+import android.view.WindowManager;
+
+import com.android.car.notification.CarNotificationView;
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.phone.ShadeControllerImpl;
+import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
+import com.android.systemui.statusbar.phone.StatusBarWindowController;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+
+/** Car specific implementation of {@link com.android.systemui.statusbar.phone.ShadeController}. */
+@Singleton
+public class CarShadeControllerImpl extends ShadeControllerImpl {
+
+ @Inject
+ public CarShadeControllerImpl(CommandQueue commandQueue,
+ StatusBarStateController statusBarStateController,
+ StatusBarWindowController statusBarWindowController,
+ StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+ WindowManager windowManager,
+ Lazy<StatusBar> statusBarLazy,
+ Lazy<AssistManager> assistManagerLazy,
+ Lazy<BubbleController> bubbleControllerLazy) {
+ super(commandQueue, statusBarStateController, statusBarWindowController,
+ statusBarKeyguardViewManager, windowManager,
+ statusBarLazy, assistManagerLazy, bubbleControllerLazy);
+ }
+
+ @Override
+ public void animateCollapsePanels(int flags, boolean force, boolean delayed,
+ float speedUpFactor) {
+ super.animateCollapsePanels(flags, force, delayed, speedUpFactor);
+ if (!getCarStatusBar().isPanelExpanded()
+ || getCarNotificationView().getVisibility() == View.INVISIBLE) {
+ return;
+ }
+
+ mStatusBarWindowController.setStatusBarFocusable(false);
+ getCarStatusBar().getStatusBarWindowViewController().cancelExpandHelper();
+ getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor);
+
+ getCarStatusBar().animateNotificationPanel(getCarStatusBar().getClosingVelocity(), true);
+
+ if (!getCarStatusBar().isTracking()) {
+ mStatusBarWindowController.setPanelVisible(false);
+ getCarNotificationView().setVisibility(View.INVISIBLE);
+ }
+
+ getCarStatusBar().setPanelExpanded(false);
+ }
+
+ private CarStatusBar getCarStatusBar() {
+ return (CarStatusBar) mStatusBarLazy.get();
+ }
+
+ private CarNotificationView getCarNotificationView() {
+ return getCarStatusBar().getCarNotificationView();
+ }
+}
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index c8532e0..0d6701d 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -118,6 +118,7 @@
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarComponent;
import com.android.systemui.statusbar.phone.StatusBarIconController;
@@ -175,6 +176,7 @@
private final Object mQueueLock = new Object();
private final CarNavigationBarController mCarNavigationBarController;
private final Lazy<PowerManagerHelper> mPowerManagerHelperLazy;
+ private final ShadeController mShadeController;
private final CarServiceProvider mCarServiceProvider;
private DeviceProvisionedController mDeviceProvisionedController;
@@ -308,6 +310,7 @@
LightsOutNotifController lightsOutNotifController,
StatusBarNotificationActivityStarter.Builder
statusBarNotificationActivityStarterBuilder,
+ ShadeController shadeController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
DismissCallbackRegistry dismissCallbackRegistry,
@@ -385,6 +388,7 @@
dividerOptional,
lightsOutNotifController,
statusBarNotificationActivityStarterBuilder,
+ shadeController,
superStatusBarViewFactory,
statusBarKeyguardViewManager,
viewMediatorCallback,
@@ -392,6 +396,7 @@
mScrimController = scrimController;
mLockscreenLockIconController = lockscreenLockIconController;
mDeviceProvisionedController = deviceProvisionedController;
+ mShadeController = shadeController;
mCarServiceProvider = carServiceProvider;
mPowerManagerHelperLazy = powerManagerHelperLazy;
mFullscreenUserSwitcherLazy = fullscreenUserSwitcherLazy;
@@ -506,7 +511,7 @@
@Override
protected void close() {
if (mPanelExpanded) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
});
@@ -516,7 +521,7 @@
@Override
protected void close() {
if (mPanelExpanded) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
});
@@ -551,7 +556,7 @@
mNotificationClickHandlerFactory.registerClickListener((launchResult, alertEntry) -> {
if (launchResult == ActivityManager.START_TASK_TO_FRONT
|| launchResult == ActivityManager.START_SUCCESS) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
});
CarNotificationListener carNotificationListener = new CarNotificationListener();
@@ -712,25 +717,16 @@
setPanelExpanded(true);
}
- @Override
- public void animateCollapsePanels(int flags, boolean force, boolean delayed,
- float speedUpFactor) {
- super.animateCollapsePanels(flags, force, delayed, speedUpFactor);
- if (!mPanelExpanded || mNotificationView.getVisibility() == View.INVISIBLE) {
- return;
- }
- mStatusBarWindowController.setStatusBarFocusable(false);
- mStatusBarWindowViewController.cancelExpandHelper();
- mStatusBarView.collapsePanel(true /* animate */, delayed, speedUpFactor);
+ public CarNotificationView getCarNotificationView() {
+ return mNotificationView;
+ }
- animateNotificationPanel(mClosingVelocity, true);
+ public float getClosingVelocity() {
+ return mClosingVelocity;
+ }
- if (!mIsTracking) {
- mStatusBarWindowController.setPanelVisible(false);
- mNotificationView.setVisibility(View.INVISIBLE);
- }
-
- setPanelExpanded(false);
+ public boolean isTracking() {
+ return mIsTracking;
}
private void maybeCompleteAnimation(MotionEvent event) {
@@ -749,7 +745,7 @@
* close the notification shade completely with a velocity. If the animation is to close the
* notification shade this method also makes the view invisible after animation ends.
*/
- private void animateNotificationPanel(float velocity, boolean isClosing) {
+ void animateNotificationPanel(float velocity, boolean isClosing) {
float to = 0;
if (!isClosing) {
to = mNotificationView.getHeight();
diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
index eff60fa..ff4dc9c 100644
--- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
+++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBarModule.java
@@ -78,6 +78,7 @@
import com.android.systemui.statusbar.phone.NotificationGroupAlertTransferHelper;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.phone.ScrimController;
+import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.statusbar.phone.StatusBarComponent;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
@@ -183,6 +184,7 @@
LightsOutNotifController lightsOutNotifController,
StatusBarNotificationActivityStarter.Builder
statusBarNotificationActivityStarterBuilder,
+ ShadeController shadeController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
DismissCallbackRegistry dismissCallbackRegistry,
@@ -259,6 +261,7 @@
superStatusBarViewFactory,
lightsOutNotifController,
statusBarNotificationActivityStarterBuilder,
+ shadeController,
statusBarKeyguardViewManager,
viewMediatorCallback,
dismissCallbackRegistry,
diff --git a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
index b562243..cef351c 100644
--- a/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
+++ b/packages/SystemUI/src/com/android/systemui/bubbles/BubbleController.java
@@ -109,8 +109,6 @@
import javax.inject.Inject;
import javax.inject.Singleton;
-import dagger.Lazy;
-
/**
* Bubbles are a special type of content that can "float" on top of other apps or System UI.
* Bubbles can be expanded to show more content.
@@ -147,7 +145,7 @@
private BubbleExpandListener mExpandListener;
@Nullable private BubbleStackView.SurfaceSynchronizer mSurfaceSynchronizer;
private final NotificationGroupManager mNotificationGroupManager;
- private final Lazy<ShadeController> mShadeController;
+ private final ShadeController mShadeController;
private final RemoteInputUriController mRemoteInputUriController;
private Handler mHandler = new Handler() {};
@@ -243,7 +241,7 @@
public BubbleController(Context context,
StatusBarWindowController statusBarWindowController,
StatusBarStateController statusBarStateController,
- Lazy<ShadeController> shadeController,
+ ShadeController shadeController,
BubbleData data,
ConfigurationController configurationController,
NotificationInterruptionStateProvider interruptionStateProvider,
@@ -261,7 +259,7 @@
public BubbleController(Context context,
StatusBarWindowController statusBarWindowController,
StatusBarStateController statusBarStateController,
- Lazy<ShadeController> shadeController,
+ ShadeController shadeController,
BubbleData data,
@Nullable BubbleStackView.SurfaceSynchronizer synchronizer,
ConfigurationController configurationController,
@@ -272,6 +270,7 @@
NotificationEntryManager entryManager,
RemoteInputUriController remoteInputUriController) {
mContext = context;
+ mShadeController = shadeController;
mNotificationInterruptionStateProvider = interruptionStateProvider;
mNotifUserManager = notifUserManager;
mZenModeController = zenModeController;
@@ -319,7 +318,6 @@
}
});
- mShadeController = shadeController;
mStatusBarWindowController = statusBarWindowController;
mStatusBarStateListener = new StatusBarStateListener();
statusBarStateController.addCallback(mStatusBarStateListener);
@@ -579,7 +577,7 @@
if (DEBUG_EXPERIMENTS || DEBUG_BUBBLE_CONTROLLER) {
Log.d(TAG, "onUserCreatedBubble: " + entry.getKey());
}
- mShadeController.get().collapsePanel(true);
+ mShadeController.collapsePanel(true);
entry.setFlagBubble(true);
updateBubble(entry, true /* suppressFlyout */, false /* showInShade */);
mUserCreatedBubbles.add(entry.getKey());
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
index f44eae7..ccb6c2f 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIDefaultModule.java
@@ -39,7 +39,7 @@
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.KeyguardEnvironmentImpl;
import com.android.systemui.statusbar.phone.ShadeController;
-import com.android.systemui.statusbar.phone.StatusBar;
+import com.android.systemui.statusbar.phone.ShadeControllerImpl;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import java.util.Optional;
@@ -82,7 +82,7 @@
KeyguardEnvironmentImpl keyguardEnvironment);
@Binds
- abstract ShadeController provideShadeController(StatusBar statusBar);
+ abstract ShadeController provideShadeController(ShadeControllerImpl shadeController);
@Singleton
@Provides
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 8d08b28..beba203 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -210,8 +210,7 @@
private AlarmManager mAlarmManager;
private AudioManager mAudioManager;
private StatusBarManager mStatusBarManager;
- private final StatusBarWindowController mStatusBarWindowController =
- Dependency.get(StatusBarWindowController.class);
+ private final StatusBarWindowController mStatusBarWindowController;
private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class);
private boolean mSystemReady;
@@ -688,12 +687,14 @@
FalsingManager falsingManager,
LockPatternUtils lockPatternUtils,
BroadcastDispatcher broadcastDispatcher,
+ StatusBarWindowController statusBarWindowController,
Lazy<StatusBarKeyguardViewManager> statusBarKeyguardViewManagerLazy,
DismissCallbackRegistry dismissCallbackRegistry) {
super(context);
mFalsingManager = falsingManager;
mLockPatternUtils = lockPatternUtils;
mBroadcastDispatcher = broadcastDispatcher;
+ mStatusBarWindowController = statusBarWindowController;
mStatusBarKeyguardViewManagerLazy = statusBarKeyguardViewManagerLazy;
mDismissCallbackRegistry = dismissCallbackRegistry;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
index 4204f68..1648196 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationViewHierarchyManager.java
@@ -37,7 +37,6 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.util.Assert;
import com.android.systemui.util.Utils;
@@ -49,8 +48,6 @@
import javax.inject.Inject;
import javax.inject.Singleton;
-import dagger.Lazy;
-
/**
* NotificationViewHierarchyManager manages updating the view hierarchy of notification views based
* on their group structure. For example, if a notification becomes bundled with another,
@@ -75,9 +72,6 @@
private final SysuiStatusBarStateController mStatusBarStateController;
private final NotificationEntryManager mEntryManager;
- // Lazy
- private final Lazy<ShadeController> mShadeController;
-
/**
* {@code true} if notifications not part of a group should by default be rendered in their
* expanded state. If {@code false}, then only the first notification will be expanded if
@@ -105,7 +99,6 @@
VisualStabilityManager visualStabilityManager,
StatusBarStateController statusBarStateController,
NotificationEntryManager notificationEntryManager,
- Lazy<ShadeController> shadeController,
KeyguardBypassController bypassController,
BubbleController bubbleController,
DynamicPrivacyController privacyController) {
@@ -117,7 +110,6 @@
mVisualStabilityManager = visualStabilityManager;
mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController;
mEntryManager = notificationEntryManager;
- mShadeController = shadeController;
Resources res = context.getResources();
mAlwaysExpandNonGroupedNotification =
res.getBoolean(R.bool.config_alwaysExpandNonGroupedNotifications);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index 43af3aa..71342c5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -5519,7 +5519,7 @@
if (viewsToRemove.isEmpty()) {
if (closeShade) {
- mStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
+ mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
}
return;
}
@@ -5581,7 +5581,7 @@
setDismissAllInProgress(false);
onAnimationComplete.run();
});
- mStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
+ mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
} else {
setDismissAllInProgress(false);
onAnimationComplete.run();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
index 865d7e7..250f730 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/BiometricUnlockController.java
@@ -41,6 +41,7 @@
import com.android.systemui.keyguard.KeyguardViewMediator;
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -136,6 +137,7 @@
private final Handler mHandler;
private final KeyguardBypassController mKeyguardBypassController;
private PowerManager.WakeLock mWakeLock;
+ private final ShadeController mShadeController;
private final KeyguardUpdateMonitor mUpdateMonitor;
private final DozeParameters mDozeParameters;
private final KeyguardStateController mKeyguardStateController;
@@ -159,20 +161,23 @@
@Inject
public BiometricUnlockController(Context context, DozeScrimController dozeScrimController,
KeyguardViewMediator keyguardViewMediator, ScrimController scrimController,
- StatusBar statusBar, KeyguardStateController keyguardStateController, Handler handler,
+ StatusBar statusBar, ShadeController shadeController,
+ StatusBarWindowController statusBarWindowController,
+ KeyguardStateController keyguardStateController, Handler handler,
KeyguardUpdateMonitor keyguardUpdateMonitor,
@MainResources Resources resources,
KeyguardBypassController keyguardBypassController, DozeParameters dozeParameters,
MetricsLogger metricsLogger, DumpController dumpController) {
mContext = context;
mPowerManager = context.getSystemService(PowerManager.class);
+ mShadeController = shadeController;
mUpdateMonitor = keyguardUpdateMonitor;
mDozeParameters = dozeParameters;
mUpdateMonitor.registerCallback(this);
mMediaManager = Dependency.get(NotificationMediaManager.class);
Dependency.get(WakefulnessLifecycle.class).addObserver(mWakefulnessObserver);
Dependency.get(ScreenLifecycle.class).addObserver(mScreenObserver);
- mStatusBarWindowController = Dependency.get(StatusBarWindowController.class);
+ mStatusBarWindowController = statusBarWindowController;
mDozeScrimController = dozeScrimController;
mKeyguardViewMediator = keyguardViewMediator;
mScrimController = scrimController;
@@ -358,8 +363,8 @@
if (mMode == MODE_SHOW_BOUNCER) {
mStatusBarKeyguardViewManager.showBouncer(false);
}
- mStatusBarKeyguardViewManager.animateCollapsePanels(
- BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR);
+ mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
+ false /* delayed */, BIOMETRIC_COLLAPSE_SPEEDUP_FACTOR);
mPendingShowBouncer = false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 0703d8c..ebe2117 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -164,6 +164,7 @@
private int mDisabledFlags1;
private int mDisabledFlags2;
private final Lazy<StatusBar> mStatusBarLazy;
+ private final ShadeController mShadeController;
private Recents mRecents;
private StatusBar mStatusBar;
private final Divider mDivider;
@@ -216,7 +217,7 @@
mNavigationBarView.getRotationButtonController().setRotateSuggestionButtonState(false);
// Hide the notifications panel when quick step starts
- mStatusBarLazy.get().collapsePanel(true /* animate */);
+ mShadeController.collapsePanel(true /* animate */);
}
@Override
@@ -272,6 +273,7 @@
BroadcastDispatcher broadcastDispatcher,
CommandQueue commandQueue, Divider divider,
Optional<Recents> recentsOptional, Lazy<StatusBar> statusBarLazy,
+ ShadeController shadeController,
@MainHandler Handler mainHandler) {
mAccessibilityManagerWrapper = accessibilityManagerWrapper;
mDeviceProvisionedController = deviceProvisionedController;
@@ -280,6 +282,7 @@
mAssistManager = assistManager;
mSysUiFlagsContainer = sysUiFlagsContainer;
mStatusBarLazy = statusBarLazy;
+ mShadeController = shadeController;
mAssistantAvailable = mAssistManager.getAssistInfoForUser(UserHandle.USER_CURRENT) != null;
mOverviewProxyService = overviewProxyService;
mNavigationModeController = navigationModeController;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
index deea3f1..2fa6795 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeController.java
@@ -32,12 +32,24 @@
*/
void instantExpandNotificationsPanel();
+ /** See {@link #animateCollapsePanels(int, boolean)}. */
+ void animateCollapsePanels();
+
+ /** See {@link #animateCollapsePanels(int, boolean)}. */
+ void animateCollapsePanels(int flags);
+
/**
* Collapse the shade animated, showing the bouncer when on {@link StatusBarState#KEYGUARD} or
* dismissing {@link StatusBar} when on {@link StatusBarState#SHADE}.
*/
void animateCollapsePanels(int flags, boolean force);
+ /** See {@link #animateCollapsePanels(int, boolean)}. */
+ void animateCollapsePanels(int flags, boolean force, boolean delayed);
+
+ /** See {@link #animateCollapsePanels(int, boolean)}. */
+ void animateCollapsePanels(int flags, boolean force, boolean delayed, float speedUpFactor);
+
/**
* If the notifications panel is not fully expanded, collapse it animated.
*
@@ -61,11 +73,9 @@
void addPostCollapseAction(Runnable action);
/**
- * Notify the shade controller that the current user changed
- *
- * @param newUserId userId of the new user
+ * Run all of the runnables added by {@link #addPostCollapseAction}.
*/
- void setLockscreenUser(int newUserId);
+ void runPostCollapseRunnables();
/**
* If secure with redaction: Show bouncer, go to unlocked shade.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
new file mode 100644
index 0000000..57e7014
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ShadeControllerImpl.java
@@ -0,0 +1,236 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.util.Log;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.WindowManager;
+
+import com.android.systemui.assist.AssistManager;
+import com.android.systemui.bubbles.BubbleController;
+import com.android.systemui.plugins.statusbar.StatusBarStateController;
+import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.NotificationPresenter;
+import com.android.systemui.statusbar.StatusBarState;
+
+import java.util.ArrayList;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import dagger.Lazy;
+
+/** An implementation of {@link com.android.systemui.statusbar.phone.ShadeController}. */
+@Singleton
+public class ShadeControllerImpl implements ShadeController {
+
+ private static final String TAG = "ShadeControllerImpl";
+ private static final boolean SPEW = false;
+
+ private final CommandQueue mCommandQueue;
+ private final StatusBarStateController mStatusBarStateController;
+ protected final StatusBarWindowController mStatusBarWindowController;
+ private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
+ private final int mDisplayId;
+ protected final Lazy<StatusBar> mStatusBarLazy;
+ private final Lazy<AssistManager> mAssistManagerLazy;
+ private final Lazy<BubbleController> mBubbleControllerLazy;
+
+ private final ArrayList<Runnable> mPostCollapseRunnables = new ArrayList<>();
+
+ @Inject
+ public ShadeControllerImpl(
+ CommandQueue commandQueue,
+ StatusBarStateController statusBarStateController,
+ StatusBarWindowController statusBarWindowController,
+ StatusBarKeyguardViewManager statusBarKeyguardViewManager,
+ WindowManager windowManager,
+ Lazy<StatusBar> statusBarLazy,
+ Lazy<AssistManager> assistManagerLazy,
+ Lazy<BubbleController> bubbleControllerLazy
+ ) {
+ mCommandQueue = commandQueue;
+ mStatusBarStateController = statusBarStateController;
+ mStatusBarWindowController = statusBarWindowController;
+ mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
+ mDisplayId = windowManager.getDefaultDisplay().getDisplayId();
+ // TODO: Remove circular reference to StatusBar when possible.
+ mStatusBarLazy = statusBarLazy;
+ mAssistManagerLazy = assistManagerLazy;
+ mBubbleControllerLazy = bubbleControllerLazy;
+ }
+
+ @Override
+ public void instantExpandNotificationsPanel() {
+ // Make our window larger and the panel expanded.
+ getStatusBar().makeExpandedVisible(true /* force */);
+ getNotificationPanelView().expand(false /* animate */);
+ mCommandQueue.recomputeDisableFlags(mDisplayId, false /* animate */);
+ }
+
+ @Override
+ public void animateCollapsePanels() {
+ animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
+ }
+
+ @Override
+ public void animateCollapsePanels(int flags) {
+ animateCollapsePanels(flags, false /* force */, false /* delayed */,
+ 1.0f /* speedUpFactor */);
+ }
+
+ @Override
+ public void animateCollapsePanels(int flags, boolean force) {
+ animateCollapsePanels(flags, force, false /* delayed */, 1.0f /* speedUpFactor */);
+ }
+
+ @Override
+ public void animateCollapsePanels(int flags, boolean force, boolean delayed) {
+ animateCollapsePanels(flags, force, delayed, 1.0f /* speedUpFactor */);
+ }
+
+ @Override
+ public void animateCollapsePanels(int flags, boolean force, boolean delayed,
+ float speedUpFactor) {
+ if (!force && mStatusBarStateController.getState() != StatusBarState.SHADE) {
+ runPostCollapseRunnables();
+ return;
+ }
+ if (SPEW) {
+ Log.d(TAG, "animateCollapse():"
+ + " mExpandedVisible=" + getStatusBar().isExpandedVisible()
+ + " flags=" + flags);
+ }
+
+ if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
+ getStatusBar().postHideRecentApps();
+ }
+
+ // TODO(b/62444020): remove when this bug is fixed
+ Log.v(TAG, "mStatusBarWindow: " + getStatusBarWindowView() + " canPanelBeCollapsed(): "
+ + getNotificationPanelView().canPanelBeCollapsed());
+ if (getStatusBarWindowView() != null && getNotificationPanelView().canPanelBeCollapsed()) {
+ // release focus immediately to kick off focus change transition
+ mStatusBarWindowController.setStatusBarFocusable(false);
+
+ getStatusBar().getStatusBarWindowViewController().cancelExpandHelper();
+ getStatusBarView().collapsePanel(true /* animate */, delayed, speedUpFactor);
+ } else {
+ mBubbleControllerLazy.get().collapseStack();
+ }
+ }
+
+
+ @Override
+ public boolean closeShadeIfOpen() {
+ if (!getNotificationPanelView().isFullyCollapsed()) {
+ mCommandQueue.animateCollapsePanels(
+ CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */);
+ getStatusBar().visibilityChanged(false);
+ mAssistManagerLazy.get().hideAssist();
+ }
+ return false;
+ }
+
+ @Override
+ public void postOnShadeExpanded(Runnable executable) {
+ getNotificationPanelView().getViewTreeObserver().addOnGlobalLayoutListener(
+ new ViewTreeObserver.OnGlobalLayoutListener() {
+ @Override
+ public void onGlobalLayout() {
+ if (getStatusBar().getStatusBarWindow().getHeight()
+ != getStatusBar().getStatusBarHeight()) {
+ getNotificationPanelView().getViewTreeObserver()
+ .removeOnGlobalLayoutListener(this);
+ getNotificationPanelView().post(executable);
+ }
+ }
+ });
+ }
+
+ @Override
+ public void addPostCollapseAction(Runnable action) {
+ mPostCollapseRunnables.add(action);
+ }
+
+ @Override
+ public void runPostCollapseRunnables() {
+ ArrayList<Runnable> clonedList = new ArrayList<>(mPostCollapseRunnables);
+ mPostCollapseRunnables.clear();
+ int size = clonedList.size();
+ for (int i = 0; i < size; i++) {
+ clonedList.get(i).run();
+ }
+ mStatusBarKeyguardViewManager.readyForKeyguardDone();
+ }
+
+ @Override
+ public void goToLockedShade(View startingChild) {
+ // TODO: Move this code out of StatusBar into ShadeController.
+ getStatusBar().goToLockedShade(startingChild);
+ }
+
+ @Override
+ public boolean collapsePanel() {
+ if (!getNotificationPanelView().isFullyCollapsed()) {
+ // close the shade if it was open
+ animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
+ true /* force */, true /* delayed */);
+ getStatusBar().visibilityChanged(false);
+
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public void collapsePanel(boolean animate) {
+ if (animate) {
+ boolean willCollapse = collapsePanel();
+ if (!willCollapse) {
+ runPostCollapseRunnables();
+ }
+ } else if (!getPresenter().isPresenterFullyCollapsed()) {
+ getStatusBar().instantCollapseNotificationPanel();
+ getStatusBar().visibilityChanged(false);
+ } else {
+ runPostCollapseRunnables();
+ }
+ }
+
+ private StatusBar getStatusBar() {
+ return mStatusBarLazy.get();
+ }
+
+ private NotificationPresenter getPresenter() {
+ return getStatusBar().getPresenter();
+ }
+
+ protected StatusBarWindowView getStatusBarWindowView() {
+ return getStatusBar().getStatusBarWindow();
+ }
+
+ protected PhoneStatusBarView getStatusBarView() {
+ return (PhoneStatusBarView) getStatusBar().getStatusBarView();
+ }
+
+ private NotificationPanelView getNotificationPanelView() {
+ return getStatusBar().getPanel();
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index e31ad9f..a9d7601 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -107,7 +107,6 @@
import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
import android.view.WindowInsetsController.Appearance;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
@@ -232,7 +231,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.io.StringWriter;
-import java.util.ArrayList;
import java.util.Map;
import java.util.Optional;
@@ -245,8 +243,7 @@
ActivityStarter, KeyguardStateController.Callback,
OnHeadsUpChangedListener, CommandQueue.Callbacks,
ColorExtractor.OnColorsChangedListener, ConfigurationListener,
- StatusBarStateController.StateListener, ShadeController,
- ActivityLaunchAnimator.Callback {
+ StatusBarStateController.StateListener, ActivityLaunchAnimator.Callback {
public static final boolean MULTIUSER_DEBUG = false;
public static final boolean ENABLE_CHILD_NOTIFICATIONS
@@ -387,6 +384,7 @@
private final Optional<Divider> mDividerOptional;
private final StatusBarNotificationActivityStarter.Builder
mStatusBarNotificationActivityStarterBuilder;
+ private final ShadeController mShadeController;
private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
private final LightsOutNotifController mLightsOutNotifController;
private final DismissCallbackRegistry mDismissCallbackRegistry;
@@ -409,7 +407,6 @@
private boolean mExpandedVisible;
private final int[] mAbsPos = new int[2];
- private final ArrayList<Runnable> mPostCollapseRunnables = new ArrayList<>();
private final NotificationGutsManager mGutsManager;
private final NotificationLogger mNotificationLogger;
@@ -683,6 +680,7 @@
LightsOutNotifController lightsOutNotifController,
StatusBarNotificationActivityStarter.Builder
statusBarNotificationActivityStarterBuilder,
+ ShadeController shadeController,
SuperStatusBarViewFactory superStatusBarViewFactory,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
@@ -754,6 +752,7 @@
mRemoteInputUriController = remoteInputUriController;
mDividerOptional = dividerOptional;
mStatusBarNotificationActivityStarterBuilder = statusBarNotificationActivityStarterBuilder;
+ mShadeController = shadeController;
mSuperStatusBarViewFactory = superStatusBarViewFactory;
mLightsOutNotifController = lightsOutNotifController;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
@@ -1240,7 +1239,7 @@
mScrimController, mActivityLaunchAnimator, mDynamicPrivacyController,
mNotificationAlertingManager, rowBinder, mKeyguardStateController,
mKeyguardIndicationController,
- this /* statusBar */, mCommandQueue);
+ this /* statusBar */, mShadeController, mCommandQueue);
mNotificationListController =
new NotificationListController(
@@ -1318,7 +1317,7 @@
mRemoteInputManager.checkRemoteInputOutside(event);
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (mExpandedVisible) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
return mStatusBarWindow.onTouchEvent(event);
@@ -1419,6 +1418,10 @@
return mStatusBarWindow;
}
+ public StatusBarWindowViewController getStatusBarWindowViewController() {
+ return mStatusBarWindowViewController;
+ }
+
protected ViewGroup getBouncerContainer() {
return mStatusBarWindow;
}
@@ -1574,7 +1577,7 @@
if ((diff1 & StatusBarManager.DISABLE_EXPAND) != 0) {
if ((state1 & StatusBarManager.DISABLE_EXPAND) != 0) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
@@ -1598,7 +1601,7 @@
if ((diff2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0) {
updateQsExpansionEnabled();
if ((state1 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
}
@@ -1840,7 +1843,7 @@
&& !mActivityLaunchAnimator.isLaunchForActivity()) {
onClosingFinished();
} else {
- collapsePanel(true /* animate */);
+ mShadeController.collapsePanel(true /* animate */);
}
}
@@ -1888,7 +1891,7 @@
animateExpandSettingsPanel((String) m.obj);
break;
case MSG_CLOSE_PANELS:
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
break;
case MSG_LAUNCH_TRANSITION_TIMEOUT:
onLaunchTransitionTimeout();
@@ -1985,20 +1988,13 @@
setInteracting(StatusBarManager.WINDOW_STATUS_BAR, true);
}
- public void animateCollapsePanels() {
- animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE);
- }
-
- private final Runnable mAnimateCollapsePanels = this::animateCollapsePanels;
-
public void postAnimateCollapsePanels() {
- mHandler.post(mAnimateCollapsePanels);
+ mHandler.post(mShadeController::animateCollapsePanels);
}
public void postAnimateForceCollapsePanels() {
- mHandler.post(() -> {
- animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
- });
+ mHandler.post(() -> mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE,
+ true /* force */));
}
public void postAnimateOpenPanels() {
@@ -2008,67 +2004,35 @@
@Override
public void togglePanel() {
if (mPanelExpanded) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
} else {
animateExpandNotificationsPanel();
}
}
- public void animateCollapsePanels(int flags) {
- animateCollapsePanels(flags, false /* force */, false /* delayed */,
+ @Override
+ public void animateCollapsePanels(int flags, boolean force) {
+ mShadeController.animateCollapsePanels(flags, force, false /* delayed */,
1.0f /* speedUpFactor */);
}
- @Override
- public void animateCollapsePanels(int flags, boolean force) {
- animateCollapsePanels(flags, force, false /* delayed */, 1.0f /* speedUpFactor */);
- }
-
- public void animateCollapsePanels(int flags, boolean force, boolean delayed) {
- animateCollapsePanels(flags, force, delayed, 1.0f /* speedUpFactor */);
- }
-
- public void animateCollapsePanels(int flags, boolean force, boolean delayed,
- float speedUpFactor) {
- if (!force && mState != StatusBarState.SHADE) {
- runPostCollapseRunnables();
- return;
- }
- if (SPEW) {
- Log.d(TAG, "animateCollapse():"
- + " mExpandedVisible=" + mExpandedVisible
- + " flags=" + flags);
- }
-
- if ((flags & CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL) == 0) {
- if (!mHandler.hasMessages(MSG_HIDE_RECENT_APPS)) {
- mHandler.removeMessages(MSG_HIDE_RECENT_APPS);
- mHandler.sendEmptyMessage(MSG_HIDE_RECENT_APPS);
- }
- }
-
- // TODO(b/62444020): remove when this bug is fixed
- Log.v(TAG, "mStatusBarWindow: " + mStatusBarWindow + " canPanelBeCollapsed(): "
- + mNotificationPanel.canPanelBeCollapsed());
- if (mStatusBarWindow != null && mNotificationPanel.canPanelBeCollapsed()) {
- // release focus immediately to kick off focus change transition
- mStatusBarWindowController.setStatusBarFocusable(false);
-
- mStatusBarWindowViewController.cancelExpandHelper();
- mStatusBarView.collapsePanel(true /* animate */, delayed, speedUpFactor);
- } else {
- mBubbleController.collapseStack();
+ /**
+ * Called by {@link ShadeController} when it calls
+ * {@link ShadeController#animateCollapsePanels(int, boolean, boolean, float)}.
+ */
+ void postHideRecentApps() {
+ if (!mHandler.hasMessages(MSG_HIDE_RECENT_APPS)) {
+ mHandler.removeMessages(MSG_HIDE_RECENT_APPS);
+ mHandler.sendEmptyMessage(MSG_HIDE_RECENT_APPS);
}
}
- private void runPostCollapseRunnables() {
- ArrayList<Runnable> clonedList = new ArrayList<>(mPostCollapseRunnables);
- mPostCollapseRunnables.clear();
- int size = clonedList.size();
- for (int i = 0; i < size; i++) {
- clonedList.get(i).run();
- }
- mStatusBarKeyguardViewManager.readyForKeyguardDone();
+ public boolean isExpandedVisible() {
+ return mExpandedVisible;
+ }
+
+ public boolean isPanelExpanded() {
+ return mPanelExpanded;
}
/**
@@ -2147,7 +2111,7 @@
mGutsManager.closeAndSaveGuts(true /* removeLeavebehind */, true /* force */,
true /* removeControls */, -1 /* x */, -1 /* y */, true /* resetMenu */);
- runPostCollapseRunnables();
+ mShadeController.runPostCollapseRunnables();
setInteracting(StatusBarManager.WINDOW_STATUS_BAR, false);
if (!mNotificationActivityStarter.isCollapsingToShowActivityOverLockscreen()) {
showBouncerIfKeyguard();
@@ -2672,12 +2636,12 @@
}
if (dismissShade) {
if (mExpandedVisible && !mBouncerShowing) {
- animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */,
- true /* delayed*/);
+ mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
+ true /* force */, true /* delayed*/);
} else {
// Do it after DismissAction has been processed to conserve the needed ordering.
- mHandler.post(this::runPostCollapseRunnables);
+ mHandler.post(mShadeController::runPostCollapseRunnables);
}
} else if (isInLaunchTransition() && mNotificationPanel.isLaunchTransitionFinished()) {
@@ -2709,7 +2673,7 @@
if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
- animateCollapsePanels(flags);
+ mShadeController.animateCollapsePanels(flags);
}
}
else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
@@ -2803,7 +2767,11 @@
mScreenPinningRequest.onConfigurationChanged();
}
- @Override
+ /**
+ * Notify the shade controller that the current user changed
+ *
+ * @param newUserId userId of the new user
+ */
public void setLockscreenUser(int newUserId) {
if (mLockscreenWallpaper != null) {
mLockscreenWallpaper.setCurrentUser(newUserId);
@@ -3145,7 +3113,7 @@
private void updatePanelExpansionForKeyguard() {
if (mState == StatusBarState.KEYGUARD && mBiometricUnlockController.getMode()
!= BiometricUnlockController.MODE_WAKE_AND_UNLOCK && !mBouncerShowing) {
- instantExpandNotificationsPanel();
+ mShadeController.instantExpandNotificationsPanel();
} else if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
instantCollapseNotificationPanel();
}
@@ -3160,10 +3128,6 @@
mPresenter.updateMediaMetaData(true /* metaDataChanged */, true);
}
- public void addPostCollapseAction(Runnable r) {
- mPostCollapseRunnables.add(r);
- }
-
public boolean isInLaunchTransition() {
return mNotificationPanel.isLaunchTransitionRunning()
|| mNotificationPanel.isLaunchTransitionFinished();
@@ -3396,7 +3360,7 @@
public boolean onMenuPressed() {
if (shouldUnlockOnMenuPressed()) {
- animateCollapsePanels(
+ mShadeController.animateCollapsePanels(
CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL /* flags */, true /* force */);
return true;
}
@@ -3426,7 +3390,7 @@
}
if (mState != StatusBarState.KEYGUARD && mState != StatusBarState.SHADE_LOCKED) {
if (mNotificationPanel.canPanelBeCollapsed()) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
} else {
mBubbleController.performBackPressIfNeeded();
}
@@ -3440,7 +3404,7 @@
public boolean onSpacePressed() {
if (mDeviceInteractive && mState != StatusBarState.SHADE) {
- animateCollapsePanels(
+ mShadeController.animateCollapsePanels(
CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL /* flags */, true /* force */);
return true;
}
@@ -3454,43 +3418,9 @@
}
}
- @Override
- public void instantExpandNotificationsPanel() {
- // Make our window larger and the panel expanded.
- makeExpandedVisible(true);
- mNotificationPanel.expand(false /* animate */);
- mCommandQueue.recomputeDisableFlags(mDisplayId, false /* animate */);
- }
-
- @Override
- public boolean closeShadeIfOpen() {
- if (!mNotificationPanel.isFullyCollapsed()) {
- mCommandQueue.animateCollapsePanels(
- CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */);
- visibilityChanged(false);
- mAssistManagerLazy.get().hideAssist();
- }
- return false;
- }
-
- @Override
- public void postOnShadeExpanded(Runnable executable) {
- mNotificationPanel.getViewTreeObserver().addOnGlobalLayoutListener(
- new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- if (getStatusBarWindow().getHeight() != getStatusBarHeight()) {
- mNotificationPanel.getViewTreeObserver()
- .removeOnGlobalLayoutListener(this);
- mNotificationPanel.post(executable);
- }
- }
- });
- }
-
- private void instantCollapseNotificationPanel() {
+ void instantCollapseNotificationPanel() {
mNotificationPanel.instantCollapse();
- runPostCollapseRunnables();
+ mShadeController.runPostCollapseRunnables();
}
@Override
@@ -3576,11 +3506,11 @@
}
public void onTrackingStarted() {
- runPostCollapseRunnables();
+ mShadeController.runPostCollapseRunnables();
}
public void onClosingFinished() {
- runPostCollapseRunnables();
+ mShadeController.runPostCollapseRunnables();
if (!mPresenter.isPresenterFullyCollapsed()) {
// if we set it not to be focusable when collapsing, we have to undo it when we aborted
// the closing
@@ -3641,7 +3571,7 @@
*
* @param expandView The view to expand after going to the shade.
*/
- public void goToLockedShade(View expandView) {
+ void goToLockedShade(View expandView) {
if ((mDisabled2 & StatusBarManager.DISABLE2_NOTIFICATION_SHADE) != 0) {
return;
}
@@ -3700,7 +3630,7 @@
mStatusBarWindowViewController.cancelCurrentTouch();
}
if (mPanelExpanded && mState == StatusBarState.SHADE) {
- animateCollapsePanels();
+ mShadeController.animateCollapsePanels();
}
}
@@ -4067,7 +3997,7 @@
Settings.Secure.putInt(mContext.getContentResolver(),
Settings.Secure.SHOW_NOTE_ABOUT_NOTIFICATION_HIDING, 0);
if (BANNER_ACTION_SETUP.equals(action)) {
- animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
+ mShadeController.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL,
true /* force */);
mContext.startActivity(new Intent(Settings.ACTION_APP_NOTIFICATION_REDACTION)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
@@ -4078,35 +4008,6 @@
}
};
- @Override
- public void collapsePanel(boolean animate) {
- if (animate) {
- boolean willCollapse = collapsePanel();
- if (!willCollapse) {
- runPostCollapseRunnables();
- }
- } else if (!mPresenter.isPresenterFullyCollapsed()) {
- instantCollapseNotificationPanel();
- visibilityChanged(false);
- } else {
- runPostCollapseRunnables();
- }
- }
-
- @Override
- public boolean collapsePanel() {
- if (!mNotificationPanel.isFullyCollapsed()) {
- // close the shade if it was open
- animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL, true /* force */,
- true /* delayed */);
- visibilityChanged(false);
-
- return true;
- } else {
- return false;
- }
- }
-
private final NotificationListener mNotificationListener;
public void setNotificationSnoozed(StatusBarNotification sbn, SnoozeOption snoozeOption) {
@@ -4217,7 +4118,7 @@
action.run();
}).start();
- return collapsePanel();
+ return mShadeController.collapsePanel();
}, afterKeyguardGone);
}
@@ -4277,7 +4178,7 @@
return options.toBundle();
}
- protected void visibilityChanged(boolean visible) {
+ void visibilityChanged(boolean visible) {
if (mVisible != visible) {
mVisible = visible;
if (!visible) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index dac4e58..f51174b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -48,7 +48,6 @@
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.shared.system.QuickStepContract;
-import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.NotificationMediaManager;
import com.android.systemui.statusbar.RemoteInputController;
@@ -921,12 +920,6 @@
mStatusBar.keyguardGoingAway();
}
- public void animateCollapsePanels(float speedUpFactor) {
- mStatusBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */,
- false /* delayed */, speedUpFactor);
- }
-
-
/**
* Called when cancel button in bouncer is pressed.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
index 312c85f..e31c53a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarModule.java
@@ -164,6 +164,7 @@
LightsOutNotifController lightsOutNotifController,
StatusBarNotificationActivityStarter.Builder
statusBarNotificationActivityStarterBuilder,
+ ShadeController shadeController,
SuperStatusBarViewFactory superStatusBarViewFactory,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
ViewMediatorCallback viewMediatorCallback,
@@ -237,6 +238,7 @@
dividerOptional,
lightsOutNotifController,
statusBarNotificationActivityStarterBuilder,
+ shadeController,
superStatusBarViewFactory,
statusBarKeyguardViewManager,
viewMediatorCallback,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
index 1988b42..3123f8d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java
@@ -524,7 +524,7 @@
private final ActivityIntentHelper mActivityIntentHelper;
private final BubbleController mBubbleController;
private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
- private ShadeController mShadeController;
+ private final ShadeController mShadeController;
private NotificationPresenter mNotificationPresenter;
private ActivityLaunchAnimator mActivityLaunchAnimator;
private StatusBar mStatusBar;
@@ -553,6 +553,7 @@
@BgHandler Handler backgroundHandler,
ActivityIntentHelper activityIntentHelper,
BubbleController bubbleController,
+ ShadeController shadeController,
SuperStatusBarViewFactory superStatusBarViewFactory) {
mContext = context;
mCommandQueue = commandQueue;
@@ -577,13 +578,13 @@
mBackgroundHandler = backgroundHandler;
mActivityIntentHelper = activityIntentHelper;
mBubbleController = bubbleController;
+ mShadeController = shadeController;
mSuperStatusBarViewFactory = superStatusBarViewFactory;
}
- /** Sets the status bar to use as {@link StatusBar} and {@link ShadeController}. */
+ /** Sets the status bar to use as {@link StatusBar}. */
public Builder setStatusBar(StatusBar statusBar) {
mStatusBar = statusBar;
- mShadeController = statusBar;
return this;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
index 2649166..8fc624d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java
@@ -88,7 +88,6 @@
private static final String TAG = "StatusBarNotificationPresenter";
- private final ShadeController mShadeController = Dependency.get(ShadeController.class);
private final ActivityStarter mActivityStarter = Dependency.get(ActivityStarter.class);
private final KeyguardStateController mKeyguardStateController;
private final NotificationViewHierarchyManager mViewHierarchyManager =
@@ -116,6 +115,7 @@
private final Context mContext;
private final KeyguardIndicationController mKeyguardIndicationController;
private final StatusBar mStatusBar;
+ private final ShadeController mShadeController;
private final CommandQueue mCommandQueue;
private final AccessibilityManager mAccessibilityManager;
@@ -145,6 +145,7 @@
KeyguardStateController keyguardStateController,
KeyguardIndicationController keyguardIndicationController,
StatusBar statusBar,
+ ShadeController shadeController,
CommandQueue commandQueue) {
mContext = context;
mKeyguardStateController = keyguardStateController;
@@ -154,6 +155,7 @@
mKeyguardIndicationController = keyguardIndicationController;
// TODO: use KeyguardStateController#isOccluded to remove this dependency
mStatusBar = statusBar;
+ mShadeController = shadeController;
mCommandQueue = commandQueue;
mAboveShelfObserver = new AboveShelfObserver(stackScroller);
mActivityLaunchAnimator = activityLaunchAnimator;
@@ -387,7 +389,7 @@
}
updateNotificationViews();
mMediaManager.clearCurrentMediaNotification();
- mShadeController.setLockscreenUser(newUserId);
+ mStatusBar.setLockscreenUser(newUserId);
updateMediaMetaData(true, false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
index 2012b57..6193a8e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallback.java
@@ -50,8 +50,6 @@
import javax.inject.Inject;
import javax.inject.Singleton;
-import dagger.Lazy;
-
/**
*/
@Singleton
@@ -62,9 +60,9 @@
private final SysuiStatusBarStateController mStatusBarStateController;
private final NotificationLockscreenUserManager mLockscreenUserManager;
private final ActivityStarter mActivityStarter;
- private final Lazy<ShadeController> mShadeControllerLazy;
private final Context mContext;
private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
+ private final ShadeController mShadeController;
private final ActivityIntentHelper mActivityIntentHelper;
private final NotificationGroupManager mGroupManager;
private View mPendingWorkRemoteInputView;
@@ -83,16 +81,16 @@
KeyguardStateController keyguardStateController,
StatusBarStateController statusBarStateController,
StatusBarKeyguardViewManager statusBarKeyguardViewManager,
- ActivityStarter activityStarter, Lazy<ShadeController> shadeControllerLazy,
+ ActivityStarter activityStarter, ShadeController shadeController,
CommandQueue commandQueue) {
mContext = context;
mStatusBarKeyguardViewManager = statusBarKeyguardViewManager;
+ mShadeController = shadeController;
mContext.registerReceiverAsUser(mChallengeReceiver, UserHandle.ALL,
new IntentFilter(ACTION_DEVICE_LOCKED_CHANGED), null, null);
mLockscreenUserManager = notificationLockscreenUserManager;
mKeyguardStateController = keyguardStateController;
mStatusBarStateController = (SysuiStatusBarStateController) statusBarStateController;
- mShadeControllerLazy = shadeControllerLazy;
mActivityStarter = activityStarter;
mStatusBarStateController.addCallback(this);
mKeyguardManager = context.getSystemService(KeyguardManager.class);
@@ -167,8 +165,8 @@
});
}
};
- mShadeControllerLazy.get().postOnShadeExpanded(clickPendingViewRunnable);
- mShadeControllerLazy.get().instantExpandNotificationsPanel();
+ mShadeController.postOnShadeExpanded(clickPendingViewRunnable);
+ mShadeController.instantExpandNotificationsPanel();
}
}
@@ -256,7 +254,7 @@
boolean handled = defaultHandler.handleClick();
// close the shade if it was open and maybe wait for activity start.
- return handled && mShadeControllerLazy.get().closeShadeIfOpen();
+ return handled && mShadeController.closeShadeIfOpen();
}, null, afterKeyguardGone);
return true;
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
index f8929e0..eb86bcc 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowViewController.java
@@ -57,12 +57,9 @@
import javax.inject.Inject;
-import dagger.Lazy;
-
/**
* Controller for {@link StatusBarWindowView}.
*/
-//@Singleton
public class StatusBarWindowViewController {
private final InjectionInflationController mInjectionInflationController;
private final NotificationWakeUpCoordinator mCoordinator;
@@ -80,7 +77,7 @@
private final DozeParameters mDozeParameters;
private final CommandQueue mCommandQueue;
private final StatusBarWindowView mView;
- private final Lazy<ShadeController> mShadeControllerLazy;
+ private final ShadeController mShadeController;
private GestureDetector mGestureDetector;
private View mBrightnessMirror;
@@ -114,7 +111,7 @@
DozeLog dozeLog,
DozeParameters dozeParameters,
CommandQueue commandQueue,
- Lazy<ShadeController> shadeControllerLazy,
+ ShadeController shadeController,
DockManager dockManager,
StatusBarWindowView statusBarWindowView) {
mInjectionInflationController = injectionInflationController;
@@ -133,7 +130,7 @@
mDozeParameters = dozeParameters;
mCommandQueue = commandQueue;
mView = statusBarWindowView;
- mShadeControllerLazy = shadeControllerLazy;
+ mShadeController = shadeController;
mDockManager = dockManager;
// This view is not part of the newly inflated expanded status bar.
@@ -153,7 +150,7 @@
mBypassController,
mFalsingManager,
mPluginManager,
- mShadeControllerLazy.get(),
+ mShadeController,
mNotificationLockscreenUserManager,
mNotificationEntryManager,
mKeyguardStateController,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
index e0d31d0..2ccecec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/BubbleControllerTest.java
@@ -94,8 +94,6 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import dagger.Lazy;
-
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@@ -153,7 +151,7 @@
@Mock
private Resources mResources;
@Mock
- private Lazy<ShadeController> mShadeController;
+ private ShadeController mShadeController;
@Mock
private RemoteInputUriController mRemoteInputUriController;
@@ -719,7 +717,7 @@
TestableBubbleController(Context context,
StatusBarWindowController statusBarWindowController,
StatusBarStateController statusBarStateController,
- Lazy<ShadeController> shadeController,
+ ShadeController shadeController,
BubbleData data,
ConfigurationController configurationController,
NotificationInterruptionStateProvider interruptionStateProvider,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
index cbfcfdd..a8a2b33 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java
@@ -68,15 +68,14 @@
mDependency.injectTestDependency(FalsingManager.class, mFalsingManager);
mDependency.injectTestDependency(KeyguardUpdateMonitor.class, mUpdateMonitor);
- mDependency.injectTestDependency(StatusBarWindowController.class,
- mStatusBarWindowController);
when(mLockPatternUtils.getDevicePolicyManager()).thenReturn(mDevicePolicyManager);
TestableLooper.get(this).runWithLooper(() -> {
mViewMediator = new KeyguardViewMediator(
mContext, mFalsingManager, mLockPatternUtils, mBroadcastDispatcher,
- () -> mStatusBarKeyguardViewManager, mDismissCallbackRegistry);
+ mStatusBarWindowController, () -> mStatusBarKeyguardViewManager,
+ mDismissCallbackRegistry);
});
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
index 46a8dad..07d2e31 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationViewHierarchyManagerTest.java
@@ -53,7 +53,6 @@
import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
-import com.android.systemui.statusbar.phone.ShadeController;
import com.android.systemui.util.Assert;
import com.google.android.collect.Lists;
@@ -79,7 +78,6 @@
@Mock private NotificationLockscreenUserManager mLockscreenUserManager;
@Mock private NotificationGroupManager mGroupManager;
@Mock private VisualStabilityManager mVisualStabilityManager;
- @Mock private ShadeController mShadeController;
private TestableLooper mTestableLooper;
private Handler mHandler;
@@ -99,14 +97,12 @@
mLockscreenUserManager);
mDependency.injectTestDependency(NotificationGroupManager.class, mGroupManager);
mDependency.injectTestDependency(VisualStabilityManager.class, mVisualStabilityManager);
- mDependency.injectTestDependency(ShadeController.class, mShadeController);
mHelper = new NotificationTestHelper(mContext, mDependency);
mViewHierarchyManager = new NotificationViewHierarchyManager(mContext,
mHandler, mLockscreenUserManager, mGroupManager, mVisualStabilityManager,
mock(StatusBarStateControllerImpl.class), mEntryManager,
- () -> mShadeController,
mock(KeyguardBypassController.class),
mock(BubbleController.class),
mock(DynamicPrivacyController.class));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
index 4451fa4..5907a0a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/BiometricsUnlockControllerTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
@@ -76,6 +77,8 @@
@Mock
private StatusBar mStatusBar;
@Mock
+ private ShadeController mShadeController;
+ @Mock
private KeyguardStateController mKeyguardStateController;
@Mock
private Handler mHandler;
@@ -98,13 +101,12 @@
when(mKeyguardBypassController.canPlaySubtleWindowAnimations()).thenReturn(true);
mContext.addMockSystemService(PowerManager.class, mPowerManager);
mDependency.injectTestDependency(NotificationMediaManager.class, mMediaManager);
- mDependency.injectTestDependency(StatusBarWindowController.class,
- mStatusBarWindowController);
res.addOverride(com.android.internal.R.integer.config_wakeUpDelayDoze, 0);
mBiometricUnlockController = new BiometricUnlockController(mContext, mDozeScrimController,
- mKeyguardViewMediator, mScrimController, mStatusBar, mKeyguardStateController,
- mHandler, mUpdateMonitor, res.getResources(), mKeyguardBypassController,
- mDozeParameters, mMetricsLogger, mDumpController);
+ mKeyguardViewMediator, mScrimController, mStatusBar, mShadeController,
+ mStatusBarWindowController, mKeyguardStateController, mHandler, mUpdateMonitor,
+ res.getResources(), mKeyguardBypassController, mDozeParameters, mMetricsLogger,
+ mDumpController);
mBiometricUnlockController.setStatusBarKeyguardViewManager(mStatusBarKeyguardViewManager);
}
@@ -113,7 +115,8 @@
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
BiometricSourceType.FINGERPRINT);
verify(mStatusBarKeyguardViewManager).showBouncer(eq(false));
- verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
+ verify(mShadeController).animateCollapsePanels(anyInt(), anyBoolean(), anyBoolean(),
+ anyFloat());
}
@Test
@@ -136,7 +139,8 @@
BiometricSourceType.FINGERPRINT);
verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean());
- verify(mStatusBarKeyguardViewManager).animateCollapsePanels(anyFloat());
+ verify(mShadeController).animateCollapsePanels(anyInt(), anyBoolean(), anyBoolean(),
+ anyFloat());
}
@Test
@@ -155,7 +159,8 @@
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
BiometricSourceType.FACE);
- verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+ verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(),
+ anyBoolean(), anyFloat());
verify(mStatusBarKeyguardViewManager, never()).notifyKeyguardAuthenticated(anyBoolean());
}
@@ -168,7 +173,8 @@
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
BiometricSourceType.FACE);
- verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+ verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(),
+ anyBoolean(), anyFloat());
verify(mStatusBarKeyguardViewManager).notifyKeyguardAuthenticated(eq(false));
}
@@ -201,7 +207,8 @@
BiometricSourceType.FACE);
verify(mStatusBarKeyguardViewManager, never()).showBouncer(anyBoolean());
- verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+ verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(),
+ anyBoolean(), anyFloat());
assertThat(mBiometricUnlockController.getMode())
.isEqualTo(BiometricUnlockController.MODE_NONE);
}
@@ -253,7 +260,8 @@
mBiometricUnlockController.onBiometricAuthenticated(UserHandle.USER_CURRENT,
BiometricSourceType.FACE);
- verify(mStatusBarKeyguardViewManager, never()).animateCollapsePanels(anyFloat());
+ verify(mShadeController, never()).animateCollapsePanels(anyInt(), anyBoolean(),
+ anyBoolean(), anyFloat());
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 0df2ebc8..39afbe0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -254,6 +254,7 @@
mDivider,
Optional.of(mRecents),
() -> mock(StatusBar.class),
+ mock(ShadeController.class),
mHandler);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
index d7c00cf..532192b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java
@@ -111,6 +111,8 @@
private Handler mHandler;
@Mock
private BubbleController mBubbleController;
+ @Mock
+ private ShadeControllerImpl mShadeController;
@Mock
private ActivityIntentHelper mActivityIntentHelper;
@@ -177,7 +179,7 @@
mKeyguardStateController,
mock(NotificationInterruptionStateProvider.class), mock(MetricsLogger.class),
mock(LockPatternUtils.class), mHandler, mHandler, mActivityIntentHelper,
- mBubbleController, mSuperStatusBarViewFactory))
+ mBubbleController, mShadeController, mSuperStatusBarViewFactory))
.setStatusBar(mStatusBar)
.setNotificationPresenter(mock(NotificationPresenter.class))
.setActivityLaunchAnimator(mock(ActivityLaunchAnimator.class))
@@ -194,7 +196,7 @@
// set up addPostCollapseAction to synchronously invoke the Runnable arg
doAnswer(answerVoid(Runnable::run))
- .when(mStatusBar).addPostCollapseAction(any(Runnable.class));
+ .when(mShadeController).addPostCollapseAction(any(Runnable.class));
// set up Handler to synchronously invoke the Runnable arg
doAnswer(answerVoid(Runnable::run))
@@ -219,7 +221,7 @@
mNotificationActivityStarter.onNotificationClicked(sbn, mNotificationRow);
// Then
- verify(mStatusBar, atLeastOnce()).collapsePanel();
+ verify(mShadeController, atLeastOnce()).collapsePanel();
verify(mContentIntent).sendAndReturnResult(
any(Context.class),
@@ -254,7 +256,7 @@
verify(mBubbleController).expandStackAndSelectBubble(eq(sbn.getKey()));
// This is called regardless, and simply short circuits when there is nothing to do.
- verify(mStatusBar, atLeastOnce()).collapsePanel();
+ verify(mShadeController, atLeastOnce()).collapsePanel();
verify(mAssistManager).hideAssist();
@@ -284,7 +286,7 @@
// Then
verify(mBubbleController).expandStackAndSelectBubble(eq(sbn.getKey()));
- verify(mStatusBar, atLeastOnce()).collapsePanel();
+ verify(mShadeController, atLeastOnce()).collapsePanel();
verify(mAssistManager).hideAssist();
@@ -314,7 +316,7 @@
// Then
verify(mBubbleController).expandStackAndSelectBubble(eq(sbn.getKey()));
- verify(mStatusBar, atLeastOnce()).collapsePanel();
+ verify(mShadeController, atLeastOnce()).collapsePanel();
verify(mAssistManager).hideAssist();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
index fb6e168..575f145 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenterTest.java
@@ -115,7 +115,7 @@
mock(NotificationAlertingManager.class),
mock(NotificationRowBinderImpl.class), mock(KeyguardStateController.class),
mock(KeyguardIndicationController.class),
- mStatusBar, mCommandQueue);
+ mStatusBar, mock(ShadeControllerImpl.class), mCommandQueue);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
index 6dfd082..cd2c349 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarRemoteInputCallbackTest.java
@@ -73,7 +73,7 @@
mRemoteInputCallback = spy(new StatusBarRemoteInputCallback(mContext,
mock(NotificationGroupManager.class), mNotificationLockscreenUserManager,
mKeyguardStateController, mStatusBarStateController, mStatusBarKeyguardViewManager,
- mActivityStarter, () -> mShadeController, new CommandQueue(mContext)));
+ mActivityStarter, mShadeController, new CommandQueue(mContext)));
mRemoteInputCallback.mChallengeReceiver = mRemoteInputCallback.new ChallengeReceiver();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index be68097..d3fce56 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -63,6 +63,7 @@
import android.util.SparseArray;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
import android.widget.LinearLayout;
import androidx.test.filters.SmallTest;
@@ -243,6 +244,7 @@
@Mock private LockscreenLockIconController mLockscreenLockIconController;
@Mock private StatusBarNotificationActivityStarter.Builder
mStatusBarNotificationActivityStarterBuilder;
+ private ShadeController mShadeController;
@Before
public void setup() throws Exception {
@@ -310,6 +312,11 @@
when(mStatusBarComponent.getStatusBarWindowViewController()).thenReturn(
mStatusBarWindowViewController);
+ mShadeController = new ShadeControllerImpl(mCommandQueue,
+ mStatusBarStateController, mStatusBarWindowController,
+ mStatusBarKeyguardViewManager, mContext.getSystemService(WindowManager.class),
+ () -> mStatusBar, () -> mAssistManager, () -> mBubbleController);
+
mStatusBar = new StatusBar(
mContext,
mFeatureFlags,
@@ -382,6 +389,7 @@
Optional.of(mDivider),
mLightsOutNotifController,
mStatusBarNotificationActivityStarterBuilder,
+ mShadeController,
mSuperStatusBarViewFactory,
mStatusBarKeyguardViewManager,
mViewMediatorCallback,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
index 00ea187..9f899ee 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarWindowViewTest.java
@@ -102,7 +102,7 @@
mDozeLog,
mDozeParameters,
new CommandQueue(mContext),
- () -> mShadeController,
+ mShadeController,
mDockManager,
mView);
mController.setupExpandedStatusBar();
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java
index 15e6021..9115a8e 100644
--- a/services/core/java/com/android/server/PackageWatchdog.java
+++ b/services/core/java/com/android/server/PackageWatchdog.java
@@ -346,8 +346,9 @@
if (mAllObservers.isEmpty()) {
return;
}
-
- if (failureReason == FAILURE_REASON_NATIVE_CRASH) {
+ boolean requiresImmediateAction = (failureReason == FAILURE_REASON_NATIVE_CRASH
+ || failureReason == FAILURE_REASON_EXPLICIT_HEALTH_CHECK);
+ if (requiresImmediateAction) {
handleFailureImmediately(packages, failureReason);
} else {
for (int pIndex = 0; pIndex < packages.size(); pIndex++) {
@@ -384,8 +385,8 @@
}
/**
- * For native crashes, call directly into each observer to mitigate the error without going
- * through failure threshold logic.
+ * For native crashes or explicit health check failures, call directly into each observer to
+ * mitigate the error without going through failure threshold logic.
*/
private void handleFailureImmediately(List<VersionedPackage> packages,
@FailureReasons int failureReason) {
@@ -867,13 +868,8 @@
Slog.wtf(TAG, "NetworkStack failed but could not find its package");
return;
}
- // This is a severe failure and recovery should be attempted immediately.
- // TODO: have a better way to handle such failures.
final List<VersionedPackage> pkgList = Collections.singletonList(pkg);
- final long failureCount = getTriggerFailureCount();
- for (int i = 0; i < failureCount; i++) {
- onPackageFailure(pkgList, FAILURE_REASON_EXPLICIT_HEALTH_CHECK);
- }
+ onPackageFailure(pkgList, FAILURE_REASON_EXPLICIT_HEALTH_CHECK);
});
}
diff --git a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
index 0202e71..72a7f50 100644
--- a/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timedetector/TimeDetectorServiceTest.java
@@ -95,13 +95,13 @@
@Test
public void testSuggestManualTime() throws Exception {
- doNothing().when(mMockContext).enforceCallingPermission(anyString(), any());
+ doNothing().when(mMockContext).enforceCallingOrSelfPermission(anyString(), any());
ManualTimeSuggestion manualTimeSuggestion = createManualTimeSuggestion();
mTimeDetectorService.suggestManualTime(manualTimeSuggestion);
mTestHandler.assertTotalMessagesEnqueued(1);
- verify(mMockContext).enforceCallingPermission(
+ verify(mMockContext).enforceCallingOrSelfPermission(
eq(android.Manifest.permission.SET_TIME),
anyString());
diff --git a/telephony/java/android/telephony/Annotation.java b/telephony/java/android/telephony/Annotation.java
index 73faf9f..3940a3b 100644
--- a/telephony/java/android/telephony/Annotation.java
+++ b/telephony/java/android/telephony/Annotation.java
@@ -116,7 +116,8 @@
ApnSetting.TYPE_CBS,
ApnSetting.TYPE_IA,
ApnSetting.TYPE_EMERGENCY,
- ApnSetting.TYPE_MCX
+ ApnSetting.TYPE_MCX,
+ ApnSetting.TYPE_XCAP,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ApnType {
diff --git a/telephony/java/android/telephony/data/ApnSetting.java b/telephony/java/android/telephony/data/ApnSetting.java
index 60774e7..034fc22 100644
--- a/telephony/java/android/telephony/data/ApnSetting.java
+++ b/telephony/java/android/telephony/data/ApnSetting.java
@@ -20,7 +20,7 @@
import android.annotation.Nullable;
import android.content.ContentValues;
import android.database.Cursor;
-import android.hardware.radio.V1_4.ApnTypes;
+import android.hardware.radio.V1_5.ApnTypes;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
@@ -110,6 +110,8 @@
public static final int TYPE_EMERGENCY = ApnTypes.EMERGENCY;
/** APN type for MCX (Mission Critical Service) where X can be PTT/Video/Data */
public static final int TYPE_MCX = ApnTypes.MCX;
+ /** APN type for XCAP. */
+ public static final int TYPE_XCAP = ApnTypes.XCAP;
// Possible values for authentication types.
/** No authentication type. */
@@ -198,6 +200,7 @@
APN_TYPE_STRING_MAP.put("ia", TYPE_IA);
APN_TYPE_STRING_MAP.put("emergency", TYPE_EMERGENCY);
APN_TYPE_STRING_MAP.put("mcx", TYPE_MCX);
+ APN_TYPE_STRING_MAP.put("xcap", TYPE_XCAP);
APN_TYPE_INT_MAP = new ArrayMap<Integer, String>();
APN_TYPE_INT_MAP.put(TYPE_DEFAULT, "default");
APN_TYPE_INT_MAP.put(TYPE_MMS, "mms");
@@ -210,6 +213,7 @@
APN_TYPE_INT_MAP.put(TYPE_IA, "ia");
APN_TYPE_INT_MAP.put(TYPE_EMERGENCY, "emergency");
APN_TYPE_INT_MAP.put(TYPE_MCX, "mcx");
+ APN_TYPE_INT_MAP.put(TYPE_XCAP, "xcap");
PROTOCOL_STRING_MAP = new ArrayMap<String, Integer>();
PROTOCOL_STRING_MAP.put("IP", PROTOCOL_IP);
@@ -1944,8 +1948,9 @@
* {@link ApnSetting} built from this builder otherwise.
*/
public ApnSetting build() {
- if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI |
- TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX)) == 0
+ if ((mApnTypeBitmask & (TYPE_DEFAULT | TYPE_MMS | TYPE_SUPL | TYPE_DUN | TYPE_HIPRI
+ | TYPE_FOTA | TYPE_IMS | TYPE_CBS | TYPE_IA | TYPE_EMERGENCY | TYPE_MCX
+ | TYPE_XCAP)) == 0
|| TextUtils.isEmpty(mApnName) || TextUtils.isEmpty(mEntryName)) {
return null;
}
diff --git a/telephony/java/com/android/internal/telephony/PhoneConstants.java b/telephony/java/com/android/internal/telephony/PhoneConstants.java
index aad7f3e..fde2c5a 100644
--- a/telephony/java/com/android/internal/telephony/PhoneConstants.java
+++ b/telephony/java/com/android/internal/telephony/PhoneConstants.java
@@ -154,6 +154,8 @@
public static final String APN_TYPE_EMERGENCY = "emergency";
/** APN type for Mission Critical Services */
public static final String APN_TYPE_MCX = "mcx";
+ /** APN type for XCAP */
+ public static final String APN_TYPE_XCAP = "xcap";
/** Array of all APN types */
public static final String[] APN_TYPES = {APN_TYPE_DEFAULT,
APN_TYPE_MMS,
@@ -165,7 +167,8 @@
APN_TYPE_CBS,
APN_TYPE_IA,
APN_TYPE_EMERGENCY,
- APN_TYPE_MCX
+ APN_TYPE_MCX,
+ APN_TYPE_XCAP,
};
public static final int RIL_CARD_MAX_APPS = 8;
diff --git a/tests/ApkVerityTest/Android.bp b/tests/ApkVerityTest/Android.bp
index 9bb9983..c8d1ce1 100644
--- a/tests/ApkVerityTest/Android.bp
+++ b/tests/ApkVerityTest/Android.bp
@@ -19,14 +19,14 @@
test_suites: ["general-tests"],
target_required: [
"block_device_writer_module",
- "ApkVerityTestApp",
- "ApkVerityTestAppSplit",
],
data: [
":ApkVerityTestCertDer",
+ ":ApkVerityTestApp",
":ApkVerityTestAppFsvSig",
":ApkVerityTestAppDm",
":ApkVerityTestAppDmFsvSig",
+ ":ApkVerityTestAppSplit",
":ApkVerityTestAppSplitFsvSig",
":ApkVerityTestAppSplitDm",
":ApkVerityTestAppSplitDmFsvSig",