Merge "Import translations. DO NOT MERGE" into qt-r1-dev
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 475dccb..f66448f 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -8101,8 +8101,7 @@
*/
@Override
public RemoteViews makeHeadsUpContentView(boolean increasedHeight) {
- RemoteViews expanded = makeMediaBigContentView();
- return expanded != null ? expanded : makeMediaContentView();
+ return makeMediaContentView();
}
/** @hide */
diff --git a/core/java/android/widget/ArrayAdapter.java b/core/java/android/widget/ArrayAdapter.java
index c3c2c0d..2bf1ba5 100644
--- a/core/java/android/widget/ArrayAdapter.java
+++ b/core/java/android/widget/ArrayAdapter.java
@@ -50,7 +50,7 @@
* override {@link #getView(int, View, ViewGroup)}
* and inflate a view resource.
* For a code example, see
- * the <a href="https://developer.android.com/samples/CustomChoiceList/index.html">
+ * the <a href="https://github.com/googlesamples/android-CustomChoiceList/#readme">
* CustomChoiceList</a> sample.
* </p>
* <p>
diff --git a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
index 55e21a4..e91a0ea 100644
--- a/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
+++ b/core/java/com/android/internal/config/sysui/SystemUiDeviceConfigFlags.java
@@ -191,6 +191,89 @@
*/
public static final String BRIGHTLINE_FALSING_MANAGER_ENABLED =
"brightline_falsing_manager_enabled";
+ /**
+ * (float) Maximum fraction of the screen required to qualify as a real swipe.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE =
+ "brightline_falsing_distance_screen_fraction_max_distance";
+
+ /**
+ * (float) Multiplier for swipe velocity to convert it to pixels for a fling.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE =
+ "brightline_falsing_distance_velcoity_to_distance";
+
+ /**
+ * (float) How far, in inches, must a fling travel horizontally to qualify as intentional.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN =
+ "brightline_falsing_distance_horizontal_fling_threshold_in";
+
+ /**
+ * (float) Maximum fraction of the screen required to qualify as a real swipe.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN =
+ "brightline_falsing_distance_vertical_fling_threshold_in";
+
+ /**
+ * (float) How far, in inches, must a continuous swipe travel horizontally to be intentional.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN =
+ "brightline_falsing_distance_horizontal_swipe_threshold_in";
+
+ /**
+ * (float) How far, in inches, must a continuous swipe travel vertically to be intentional.
+ */
+ public static final String BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN =
+ "brightline_falsing_distance_horizontal_swipe_threshold_in";
+
+ /**
+ * (float) Percentage of swipe with the proximity sensor covered that triggers a higher
+ * swipe distance requirement.
+ */
+ public static final String BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD =
+ "brightline_falsing_proximity_percent_covered_threshold";
+
+ /**
+ * (float) Angle, in radians, that a swipe can vary from horizontal and sill be intentional.
+ */
+ public static final String BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE =
+ "brightline_falsing_diagonal_horizontal_angle_range";
+
+ /**
+ * (float) Angle, in radians, that a swipe can vary from vertical and sill be intentional.
+ */
+ public static final String BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE =
+ "brightline_falsing_diagonal_horizontal_angle_range";
+
+ /**
+ * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for
+ * horizontal swipes.
+ */
+ public static final String BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE =
+ "brightline_falsing_zigzag_x_primary_deviance";
+
+ /**
+ * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for
+ * vertical swipes.
+ */
+ public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE =
+ "brightline_falsing_zigzag_y_primary_deviance";
+
+ /**
+ * (float) Distance, in inches, that a swipe is allowed to vary in the horizontal direction for
+ * horizontal swipes.
+ */
+ public static final String BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE =
+ "brightline_falsing_zigzag_x_secondary_deviance";
+
+ /**
+ * (float) Distance, in inches, that a swipe is allowed to vary in the vertical direction for
+ * vertical swipes.
+ */
+ public static final String BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE =
+ "brightline_falsing_zigzag_y_secondary_deviance";
+
private SystemUiDeviceConfigFlags() { }
}
diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml
index 13fef67..575295b 100644
--- a/core/res/res/layout/notification_template_material_media.xml
+++ b/core/res/res/layout/notification_template_material_media.xml
@@ -15,7 +15,7 @@
~ limitations under the License
-->
-<FrameLayout
+<com.android.internal.widget.MediaNotificationView
android:id="@+id/status_bar_latest_event_content"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
@@ -24,8 +24,8 @@
android:tag="media"
>
<ImageView android:id="@+id/right_icon"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
android:adjustViewBounds="true"
android:layout_gravity="top|end"
android:scaleType="centerCrop"
@@ -91,4 +91,4 @@
android:layout_alignParentBottom="true"
/>
</LinearLayout>
-</FrameLayout>
+</com.android.internal.widget.MediaNotificationView>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index 039bc4d..6653879 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -279,7 +279,7 @@
<dimen name="notification_expand_button_padding_top">1dp</dimen>
<!-- Height of a small notification in the status bar -->
- <dimen name="notification_min_height">92dp</dimen>
+ <dimen name="notification_min_height">106dp</dimen>
<!-- The width of the big icons in notifications. -->
<dimen name="notification_large_icon_width">64dp</dimen>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index d13c715..1f5a010 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -3797,6 +3797,7 @@
<java-symbol type="string" name="config_displayLightSensorType" />
<java-symbol type="drawable" name="iconfactory_adaptive_icon_drawable_wrapper"/>
+ <java-symbol type="dimen" name="notification_min_height" />
<java-symbol type="dimen" name="resolver_icon_size"/>
<java-symbol type="dimen" name="resolver_badge_size"/>
<java-symbol type="dimen" name="resolver_button_bar_spacing"/>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index aa25cf9..bef1fc2 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -112,7 +112,7 @@
<dimen name="status_bar_connected_device_bt_indicator_size">17dp</dimen>
<!-- Height of a small notification in the status bar-->
- <dimen name="notification_min_height">106dp</dimen>
+ <dimen name="notification_min_height">@*android:dimen/notification_min_height</dimen>
<!-- Increased height of a small notification in the status bar -->
<dimen name="notification_min_height_increased">146dp</dimen>
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index 8210951..bdcf0b3 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -93,6 +93,10 @@
public void setupFalsingManager(Context context) {
boolean brightlineEnabled = DeviceConfig.getBoolean(
DeviceConfig.NAMESPACE_SYSTEMUI, BRIGHTLINE_FALSING_MANAGER_ENABLED, false);
+
+ if (mInternalFalsingManager != null) {
+ mInternalFalsingManager.cleanup();
+ }
if (!brightlineEnabled) {
mInternalFalsingManager = new FalsingManagerImpl(context);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
index 730907e..cc66454 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DiagonalClassifier.java
@@ -16,9 +16,13 @@
package com.android.systemui.classifier.brightline;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE;
import static com.android.systemui.classifier.Classifier.LEFT_AFFORDANCE;
import static com.android.systemui.classifier.Classifier.RIGHT_AFFORDANCE;
+import android.provider.DeviceConfig;
+
/**
* False on swipes that are too close to 45 degrees.
*
@@ -35,8 +39,20 @@
private static final float ONE_HUNDRED_EIGHTY_DEG = (float) (Math.PI);
private static final float THREE_HUNDRED_SIXTY_DEG = (float) (2 * Math.PI);
+ private final float mHorizontalAngleRange;
+ private final float mVerticalAngleRange;
+
DiagonalClassifier(FalsingDataProvider dataProvider) {
super(dataProvider);
+
+ mHorizontalAngleRange = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DIAGONAL_HORIZONTAL_ANGLE_RANGE,
+ HORIZONTAL_ANGLE_RANGE);
+ mVerticalAngleRange = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DIAGONAL_VERTICAL_ANGLE_RANGE,
+ VERTICAL_ANGLE_RANGE);
}
@Override
@@ -52,11 +68,11 @@
return false;
}
- float minAngle = DIAGONAL - HORIZONTAL_ANGLE_RANGE;
- float maxAngle = DIAGONAL + HORIZONTAL_ANGLE_RANGE;
+ float minAngle = DIAGONAL - mHorizontalAngleRange;
+ float maxAngle = DIAGONAL + mHorizontalAngleRange;
if (isVertical()) {
- minAngle = DIAGONAL - VERTICAL_ANGLE_RANGE;
- maxAngle = DIAGONAL + VERTICAL_ANGLE_RANGE;
+ minAngle = DIAGONAL - mVerticalAngleRange;
+ maxAngle = DIAGONAL + mVerticalAngleRange;
}
return angleBetween(angle, minAngle, maxAngle)
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
index 005ee12..a6a617d 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/DistanceClassifier.java
@@ -16,6 +16,14 @@
package com.android.systemui.classifier.brightline;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN;
+
+import android.provider.DeviceConfig;
import android.view.MotionEvent;
import android.view.VelocityTracker;
@@ -31,12 +39,13 @@
private static final float HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN = 3;
private static final float VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN = 3;
private static final float VELOCITY_TO_DISTANCE = 80f;
- private static final float SCREEN_FRACTION_MIN_DISTANCE = 0.8f;
+ private static final float SCREEN_FRACTION_MAX_DISTANCE = 0.8f;
private final float mVerticalFlingThresholdPx;
private final float mHorizontalFlingThresholdPx;
private final float mVerticalSwipeThresholdPx;
private final float mHorizontalSwipeThresholdPx;
+ private final float mVelocityToDistanceMultiplier;
private boolean mDistanceDirty;
private DistanceVectors mCachedDistance;
@@ -44,18 +53,48 @@
DistanceClassifier(FalsingDataProvider dataProvider) {
super(dataProvider);
+ mVelocityToDistanceMultiplier = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_VELOCITY_TO_DISTANCE,
+ VELOCITY_TO_DISTANCE);
+
+ float horizontalFlingThresholdIn = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_FLING_THRESHOLD_IN,
+ HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN);
+
+ float verticalFlingThresholdIn = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_VERTICAL_FLING_THRESHOLD_IN,
+ VERTICAL_FLING_THRESHOLD_DISTANCE_IN);
+
+ float horizontalSwipeThresholdIn = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_HORIZONTAL_SWIPE_THRESHOLD_IN,
+ HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN);
+
+ float verticalSwipeThresholdIn = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_VERTICAL_SWIPE_THRESHOLD_IN,
+ VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN);
+
+ float screenFractionMaxDistance = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_DISTANCE_SCREEN_FRACTION_MAX_DISTANCE,
+ SCREEN_FRACTION_MAX_DISTANCE);
+
mHorizontalFlingThresholdPx = Math
- .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE,
- HORIZONTAL_FLING_THRESHOLD_DISTANCE_IN * getXdpi());
+ .min(getWidthPixels() * screenFractionMaxDistance,
+ horizontalFlingThresholdIn * getXdpi());
mVerticalFlingThresholdPx = Math
- .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE,
- VERTICAL_FLING_THRESHOLD_DISTANCE_IN * getYdpi());
+ .min(getHeightPixels() * screenFractionMaxDistance,
+ verticalFlingThresholdIn * getYdpi());
mHorizontalSwipeThresholdPx = Math
- .min(getWidthPixels() * SCREEN_FRACTION_MIN_DISTANCE,
- HORIZONTAL_SWIPE_THRESHOLD_DISTANCE_IN * getXdpi());
+ .min(getWidthPixels() * screenFractionMaxDistance,
+ horizontalSwipeThresholdIn * getXdpi());
mVerticalSwipeThresholdPx = Math
- .min(getHeightPixels() * SCREEN_FRACTION_MIN_DISTANCE,
- VERTICAL_SWIPE_THRESHOLD_DISTANCE_IN * getYdpi());
+ .min(getHeightPixels() * screenFractionMaxDistance,
+ verticalSwipeThresholdIn * getYdpi());
mDistanceDirty = true;
}
@@ -139,18 +178,18 @@
}
boolean getPassedFlingThreshold() {
- float dX = this.mDx + this.mVx * VELOCITY_TO_DISTANCE;
- float dY = this.mDy + this.mVy * VELOCITY_TO_DISTANCE;
+ float dX = this.mDx + this.mVx * mVelocityToDistanceMultiplier;
+ float dY = this.mDy + this.mVy * mVelocityToDistanceMultiplier;
if (isHorizontal()) {
logDebug("Horizontal swipe and fling distance: " + this.mDx + ", "
- + this.mVx * VELOCITY_TO_DISTANCE);
+ + this.mVx * mVelocityToDistanceMultiplier);
logDebug("Threshold: " + mHorizontalFlingThresholdPx);
return Math.abs(dX) >= mHorizontalFlingThresholdPx;
}
logDebug("Vertical swipe and fling distance: " + this.mDy + ", "
- + this.mVy * VELOCITY_TO_DISTANCE);
+ + this.mVy * mVelocityToDistanceMultiplier);
logDebug("Threshold: " + mVerticalFlingThresholdPx);
return Math.abs(dY) >= mVerticalFlingThresholdPx;
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
index 94a8ac85..2644bf9 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ProximityClassifier.java
@@ -16,10 +16,12 @@
package com.android.systemui.classifier.brightline;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD;
import static com.android.systemui.classifier.Classifier.QUICK_SETTINGS;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
+import android.provider.DeviceConfig;
import android.view.MotionEvent;
@@ -31,8 +33,9 @@
*/
class ProximityClassifier extends FalsingClassifier {
- private static final double PERCENT_COVERED_THRESHOLD = 0.1;
+ private static final float PERCENT_COVERED_THRESHOLD = 0.1f;
private final DistanceClassifier mDistanceClassifier;
+ private final float mPercentCoveredThreshold;
private boolean mNear;
private long mGestureStartTimeNs;
@@ -44,6 +47,11 @@
FalsingDataProvider dataProvider) {
super(dataProvider);
this.mDistanceClassifier = distanceClassifier;
+
+ mPercentCoveredThreshold = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_PROXIMITY_PERCENT_COVERED_THRESHOLD,
+ PERCENT_COVERED_THRESHOLD);
}
@Override
@@ -107,7 +115,7 @@
logInfo("Percent of gesture in proximity: " + mPercentNear);
- if (mPercentNear > PERCENT_COVERED_THRESHOLD) {
+ if (mPercentNear > mPercentCoveredThreshold) {
return !mDistanceClassifier.isLongSwipe();
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
index a62574f..c58b7db 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/ZigZagClassifier.java
@@ -16,7 +16,13 @@
package com.android.systemui.classifier.brightline;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE;
+import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE;
+
import android.graphics.Point;
+import android.provider.DeviceConfig;
import android.view.MotionEvent;
import java.util.ArrayList;
@@ -37,8 +43,34 @@
private static final float MAX_X_SECONDARY_DEVIANCE = .3f;
private static final float MAX_Y_SECONDARY_DEVIANCE = .3f;
+ private final float mMaxXPrimaryDeviance;
+ private final float mMaxYPrimaryDeviance;
+ private final float mMaxXSecondaryDeviance;
+ private final float mMaxYSecondaryDeviance;
+
ZigZagClassifier(FalsingDataProvider dataProvider) {
super(dataProvider);
+
+ mMaxXPrimaryDeviance = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_ZIGZAG_X_PRIMARY_DEVIANCE,
+ MAX_X_PRIMARY_DEVIANCE);
+
+ mMaxYPrimaryDeviance = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_ZIGZAG_Y_PRIMARY_DEVIANCE,
+ MAX_Y_PRIMARY_DEVIANCE);
+
+ mMaxXSecondaryDeviance = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_ZIGZAG_X_SECONDARY_DEVIANCE,
+ MAX_X_SECONDARY_DEVIANCE);
+
+ mMaxYSecondaryDeviance = DeviceConfig.getFloat(
+ DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_ZIGZAG_Y_SECONDARY_DEVIANCE,
+ MAX_Y_SECONDARY_DEVIANCE);
+
}
@Override
@@ -98,11 +130,11 @@
float maxXDeviance;
float maxYDeviance;
if (actualDx > actualDy) {
- maxXDeviance = MAX_X_PRIMARY_DEVIANCE * totalDistanceIn * getXdpi();
- maxYDeviance = MAX_Y_SECONDARY_DEVIANCE * totalDistanceIn * getYdpi();
+ maxXDeviance = mMaxXPrimaryDeviance * totalDistanceIn * getXdpi();
+ maxYDeviance = mMaxYSecondaryDeviance * totalDistanceIn * getYdpi();
} else {
- maxXDeviance = MAX_X_SECONDARY_DEVIANCE * totalDistanceIn * getXdpi();
- maxYDeviance = MAX_Y_PRIMARY_DEVIANCE * totalDistanceIn * getYdpi();
+ maxXDeviance = mMaxXSecondaryDeviance * totalDistanceIn * getXdpi();
+ maxYDeviance = mMaxYPrimaryDeviance * totalDistanceIn * getYdpi();
}
logDebug("Straightness Deviance: (" + devianceX + "," + devianceY + ") vs "
diff --git a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
index 329ef1c..7ea6493 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/classifier/FalsingManagerProxyTest.java
@@ -56,6 +56,9 @@
mHandler = new Handler(mTestableLooper.getLooper());
mDefaultConfigValue = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI,
BRIGHTLINE_FALSING_MANAGER_ENABLED, false);
+ // In case it runs on a device where it's been set to true, set it to false by hand.
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI,
+ BRIGHTLINE_FALSING_MANAGER_ENABLED, "false", false);
}
@After
diff --git a/services/core/java/com/android/server/om/IdmapDaemon.java b/services/core/java/com/android/server/om/IdmapDaemon.java
deleted file mode 100644
index 55fbcb4..0000000
--- a/services/core/java/com/android/server/om/IdmapDaemon.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * 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.server.om;
-
-import static android.content.Context.IDMAP_SERVICE;
-
-import static com.android.server.om.OverlayManagerService.DEBUG;
-import static com.android.server.om.OverlayManagerService.TAG;
-
-import android.os.IBinder;
-import android.os.IIdmap2;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemProperties;
-import android.util.Slog;
-
-import com.android.server.IoThread;
-
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-/**
- * To prevent idmap2d from continuously running, the idmap daemon will terminate after 10
- * seconds without a transaction.
- **/
-class IdmapDaemon {
- // The amount of time in milliseconds to wait after a transaction to the idmap service is made
- // before stopping the service.
- private static final int SERVICE_TIMEOUT_MS = 10000;
-
- // The amount of time in milliseconds to wait when attempting to connect to idmap service.
- private static final int SERVICE_CONNECT_TIMEOUT_MS = 5000;
-
- private static final Object IDMAP_TOKEN = new Object();
- private static final String IDMAP_DAEMON = "idmap2d";
-
- private static IdmapDaemon sInstance;
- private volatile IIdmap2 mService;
- private final AtomicInteger mOpenedCount = new AtomicInteger();
-
- /**
- * An {@link AutoCloseable} connection to the idmap service. When the connection is closed or
- * finalized, the idmap service will be stopped after a period of time unless another connection
- * to the service is open.
- **/
- private class Connection implements AutoCloseable {
- private boolean mOpened = true;
-
- private Connection() {
- synchronized (IDMAP_TOKEN) {
- mOpenedCount.incrementAndGet();
- }
- }
-
- @Override
- public void close() {
- synchronized (IDMAP_TOKEN) {
- if (!mOpened) {
- return;
- }
-
- mOpened = false;
- if (mOpenedCount.decrementAndGet() != 0) {
- // Only post the callback to stop the service if the service does not have an
- // open connection.
- return;
- }
-
- IoThread.getHandler().postDelayed(() -> {
- synchronized (IDMAP_TOKEN) {
- // Only stop the service if the service does not have an open connection.
- if (mService == null || mOpenedCount.get() != 0) {
- return;
- }
-
- stopIdmapService();
- mService = null;
- }
- }, IDMAP_TOKEN, SERVICE_TIMEOUT_MS);
- }
- }
- }
-
- static IdmapDaemon getInstance() {
- if (sInstance == null) {
- sInstance = new IdmapDaemon();
- }
- return sInstance;
- }
-
- String createIdmap(String targetPath, String overlayPath, int policies, boolean enforce,
- int userId) throws Exception {
- try (Connection connection = connect()) {
- return mService.createIdmap(targetPath, overlayPath, policies, enforce, userId);
- }
- }
-
- boolean removeIdmap(String overlayPath, int userId) throws Exception {
- try (Connection connection = connect()) {
- return mService.removeIdmap(overlayPath, userId);
- }
- }
-
- boolean verifyIdmap(String overlayPath, int policies, boolean enforce, int userId)
- throws Exception {
- try (Connection connection = connect()) {
- return mService.verifyIdmap(overlayPath, policies, enforce, userId);
- }
- }
-
- String getIdmapPath(String overlayPath, int userId) throws Exception {
- try (Connection connection = connect()) {
- return mService.getIdmapPath(overlayPath, userId);
- }
- }
-
- static void startIdmapService() {
- SystemProperties.set("ctl.start", IDMAP_DAEMON);
- }
-
- static void stopIdmapService() {
- SystemProperties.set("ctl.stop", IDMAP_DAEMON);
- }
-
- private Connection connect() throws Exception {
- synchronized (IDMAP_TOKEN) {
- IoThread.getHandler().removeCallbacksAndMessages(IDMAP_TOKEN);
- if (mService != null) {
- // Not enough time has passed to stop the idmap service. Reuse the existing
- // interface.
- return new Connection();
- }
-
- // Start the idmap service if it is not currently running.
- startIdmapService();
-
- // Block until the service is found.
- FutureTask<IBinder> bindIdmap = new FutureTask<>(() -> {
- IBinder binder = null;
- while (binder == null) {
- try {
- binder = ServiceManager.getService(IDMAP_SERVICE);
- Thread.sleep(100);
- } catch (Exception e) {
- Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not retrieved; "
- + e.getMessage());
- }
- }
- return binder;
- });
-
- IBinder binder;
- try {
- IoThread.getHandler().postAtFrontOfQueue(bindIdmap);
- binder = bindIdmap.get(SERVICE_CONNECT_TIMEOUT_MS, TimeUnit.MILLISECONDS);
- } catch (Exception rethrow) {
- Slog.e(TAG, "service '" + IDMAP_SERVICE + "' not found;");
- throw rethrow;
- }
-
- try {
- binder.linkToDeath(() -> {
- Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died");
- }, 0);
- } catch (RemoteException rethrow) {
- Slog.e(TAG, "service '" + IDMAP_SERVICE + "' failed to be bound");
- throw rethrow;
- }
-
- mService = IIdmap2.Stub.asInterface(binder);
- if (DEBUG) {
- Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected");
- }
-
- return new Connection();
- }
- }
-}
diff --git a/services/core/java/com/android/server/om/IdmapManager.java b/services/core/java/com/android/server/om/IdmapManager.java
index 9b6d986..b604aa8 100644
--- a/services/core/java/com/android/server/om/IdmapManager.java
+++ b/services/core/java/com/android/server/om/IdmapManager.java
@@ -16,6 +16,9 @@
package com.android.server.om;
+import static android.content.Context.IDMAP_SERVICE;
+import static android.text.format.DateUtils.SECOND_IN_MILLIS;
+
import static com.android.server.om.OverlayManagerService.DEBUG;
import static com.android.server.om.OverlayManagerService.TAG;
@@ -24,11 +27,15 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Build.VERSION_CODES;
+import android.os.IBinder;
import android.os.IIdmap2;
+import android.os.RemoteException;
+import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.util.Slog;
+import com.android.internal.os.BackgroundThread;
import com.android.server.om.OverlayManagerServiceImpl.PackageManagerHelper;
import com.android.server.pm.Installer;
@@ -44,6 +51,11 @@
*/
class IdmapManager {
private static final boolean FEATURE_FLAG_IDMAP2 = true;
+
+ private final Installer mInstaller;
+ private final PackageManagerHelper mPackageManager;
+ private IIdmap2 mIdmap2Service;
+
private static final boolean VENDOR_IS_Q_OR_LATER;
static {
final String value = SystemProperties.get("ro.vndk.version", "29");
@@ -58,14 +70,12 @@
VENDOR_IS_Q_OR_LATER = isQOrLater;
}
- private final Installer mInstaller;
- private final PackageManagerHelper mPackageManager;
- private final IdmapDaemon mIdmapDaemon;
-
IdmapManager(final Installer installer, final PackageManagerHelper packageManager) {
mInstaller = installer;
mPackageManager = packageManager;
- mIdmapDaemon = IdmapDaemon.getInstance();
+ if (FEATURE_FLAG_IDMAP2) {
+ connectToIdmap2d();
+ }
}
boolean createIdmap(@NonNull final PackageInfo targetPackage,
@@ -81,11 +91,11 @@
if (FEATURE_FLAG_IDMAP2) {
int policies = calculateFulfilledPolicies(targetPackage, overlayPackage, userId);
boolean enforce = enforceOverlayable(overlayPackage);
- if (mIdmapDaemon.verifyIdmap(overlayPath, policies, enforce, userId)) {
+ if (mIdmap2Service.verifyIdmap(overlayPath, policies, enforce, userId)) {
return true;
}
- return mIdmapDaemon.createIdmap(targetPath, overlayPath, policies,
- enforce, userId) != null;
+ return mIdmap2Service.createIdmap(targetPath, overlayPath, policies, enforce,
+ userId) != null;
} else {
mInstaller.idmap(targetPath, overlayPath, sharedGid);
return true;
@@ -103,7 +113,7 @@
}
try {
if (FEATURE_FLAG_IDMAP2) {
- return mIdmapDaemon.removeIdmap(oi.baseCodePath, userId);
+ return mIdmap2Service.removeIdmap(oi.baseCodePath, userId);
} else {
mInstaller.removeIdmap(oi.baseCodePath);
return true;
@@ -127,7 +137,7 @@
final int userId) {
if (FEATURE_FLAG_IDMAP2) {
try {
- return mIdmapDaemon.getIdmapPath(overlayPackagePath, userId);
+ return mIdmap2Service.getIdmapPath(overlayPackagePath, userId);
} catch (Exception e) {
Slog.w(TAG, "failed to get idmap path for " + overlayPackagePath + ": "
+ e.getMessage());
@@ -141,6 +151,35 @@
}
}
+ private void connectToIdmap2d() {
+ IBinder binder = ServiceManager.getService(IDMAP_SERVICE);
+ if (binder != null) {
+ try {
+ binder.linkToDeath(new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ Slog.w(TAG, "service '" + IDMAP_SERVICE + "' died; reconnecting...");
+ connectToIdmap2d();
+ }
+
+ }, 0);
+ } catch (RemoteException e) {
+ binder = null;
+ }
+ }
+ if (binder != null) {
+ mIdmap2Service = IIdmap2.Stub.asInterface(binder);
+ if (DEBUG) {
+ Slog.d(TAG, "service '" + IDMAP_SERVICE + "' connected");
+ }
+ } else {
+ Slog.w(TAG, "service '" + IDMAP_SERVICE + "' not found; trying again...");
+ BackgroundThread.getHandler().postDelayed(() -> {
+ connectToIdmap2d();
+ }, SECOND_IN_MILLIS);
+ }
+ }
+
/**
* Checks if overlayable and policies should be enforced on the specified overlay for backwards
* compatibility with pre-Q overlays.
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index ce95181..da69986 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -262,7 +262,6 @@
initIfNeeded();
onSwitchUser(UserHandle.USER_SYSTEM);
- IdmapDaemon.stopIdmapService();
publishBinderService(Context.OVERLAY_SERVICE, mService);
publishLocalService(OverlayManagerService.class, this);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 9f5fc92..7fce445 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -16590,13 +16590,13 @@
&& compareSignatures(sharedUserSignatures,
pkg.mSigningDetails.signatures)
!= PackageManager.SIGNATURE_MATCH) {
- if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 28) {
+ if (SystemProperties.getInt("ro.product.first_api_level", 0) <= 29) {
// Mismatched signatures is an error and silently skipping system
// packages will likely break the device in unforeseen ways.
- // However,
- // we allow the device to boot anyway because, prior to P,
- // vendors were
- // not expecting the platform to crash in this situation.
+ // However, we allow the device to boot anyway because, prior to Q,
+ // vendors were not expecting the platform to crash in this
+ // situation.
+ // This WILL be a hard failure on any new API levels after Q.
throw new ReconcileFailure(
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
"Signature mismatch for shared user: "