Merge "Fix ArrayIndexOutOfBoundsException in A11yCache"
diff --git a/api/removed.txt b/api/removed.txt
index 7a06803..93d06928 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -335,11 +335,17 @@
package android.net {
public class ConnectivityManager {
+ method @Deprecated public void getLatestTetheringEntitlementValue(int, boolean, @NonNull android.net.ConnectivityManager.TetheringEntitlementValueListener, @Nullable android.os.Handler);
method @Deprecated public boolean requestRouteToHost(int, int);
method @Deprecated public int startUsingNetworkFeature(int, String);
method @Deprecated public int stopUsingNetworkFeature(int, String);
}
+ @Deprecated public abstract static class ConnectivityManager.TetheringEntitlementValueListener {
+ ctor public ConnectivityManager.TetheringEntitlementValueListener();
+ method public void onEntitlementResult(int);
+ }
+
@Deprecated public class NetworkBadging {
method @NonNull public static android.graphics.drawable.Drawable getWifiIcon(@IntRange(from=0, to=4) int, int, @Nullable android.content.res.Resources.Theme);
field public static final int BADGING_4K = 30; // 0x1e
diff --git a/api/system-current.txt b/api/system-current.txt
index 42486b8..ced5259 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4034,7 +4034,7 @@
method @RequiresPermission(android.Manifest.permission.PACKET_KEEPALIVE_OFFLOAD) public android.net.SocketKeepalive createSocketKeepalive(@NonNull android.net.Network, @NonNull java.net.Socket, @NonNull java.util.concurrent.Executor, @NonNull android.net.SocketKeepalive.Callback);
method public boolean getAvoidBadWifi();
method @RequiresPermission(android.Manifest.permission.LOCAL_MAC_ADDRESS) public String getCaptivePortalServerUrl();
- method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementValue(int, boolean, @NonNull android.net.ConnectivityManager.TetheringEntitlementValueListener, @Nullable android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED) public void getLatestTetheringEntitlementResult(int, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.net.ConnectivityManager.OnTetheringEntitlementResultListener);
method @RequiresPermission(anyOf={android.Manifest.permission.TETHER_PRIVILEGED, android.Manifest.permission.WRITE_SETTINGS}) public boolean isTetheringSupported();
method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void setAirplaneMode(boolean);
method @RequiresPermission(android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK) public void startCaptivePortalApp(android.net.Network, android.os.Bundle);
@@ -4057,8 +4057,7 @@
method public void onTetheringStarted();
}
- public abstract static class ConnectivityManager.TetheringEntitlementValueListener {
- ctor public ConnectivityManager.TetheringEntitlementValueListener();
+ public static interface ConnectivityManager.OnTetheringEntitlementResultListener {
method public void onEntitlementResult(int);
}
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 1312f18..0497f8c 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -2681,12 +2681,39 @@
}
}
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {
+ TETHER_ERROR_NO_ERROR,
+ TETHER_ERROR_PROVISION_FAILED,
+ TETHER_ERROR_ENTITLEMENT_UNKONWN,
+ })
+ public @interface EntitlementResultCode {
+ }
+
/**
- * Callback for use with {@link #getLatestTetheringEntitlementValue} to find out whether
+ * Callback for use with {@link #getLatestTetheringEntitlementResult} to find out whether
* entitlement succeeded.
* @hide
*/
@SystemApi
+ public interface OnTetheringEntitlementResultListener {
+ /**
+ * Called to notify entitlement result.
+ *
+ * @param resultCode an int value of entitlement result. It may be one of
+ * {@link #TETHER_ERROR_NO_ERROR},
+ * {@link #TETHER_ERROR_PROVISION_FAILED}, or
+ * {@link #TETHER_ERROR_ENTITLEMENT_UNKONWN}.
+ */
+ void onEntitlementResult(@EntitlementResultCode int resultCode);
+ }
+
+ /**
+ * @removed
+ * @deprecated This API would be removed when all of caller has been updated.
+ * */
+ @Deprecated
public abstract static class TetheringEntitlementValueListener {
/**
* Called to notify entitlement result.
@@ -2712,14 +2739,43 @@
* {@link #TETHERING_USB}, or
* {@link #TETHERING_BLUETOOTH}.
* @param showEntitlementUi a boolean indicating whether to run UI-based entitlement check.
- * @param listener an {@link TetheringEntitlementValueListener} which will be called to notify
- * the caller of the result of entitlement check. The listener may be called zero or
- * one time.
- * @param handler {@link Handler} to specify the thread upon which the listener will be invoked.
+ * @param executor the executor on which callback will be invoked.
+ * @param listener an {@link OnTetheringEntitlementResultListener} which will be called to
+ * notify the caller of the result of entitlement check. The listener may be called zero
+ * or one time.
* {@hide}
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.TETHER_PRIVILEGED)
+ public void getLatestTetheringEntitlementResult(int type, boolean showEntitlementUi,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull final OnTetheringEntitlementResultListener listener) {
+ Preconditions.checkNotNull(listener, "TetheringEntitlementResultListener cannot be null.");
+ ResultReceiver wrappedListener = new ResultReceiver(null) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ Binder.withCleanCallingIdentity(() ->
+ executor.execute(() -> {
+ listener.onEntitlementResult(resultCode);
+ }));
+ }
+ };
+
+ try {
+ String pkgName = mContext.getOpPackageName();
+ Log.i(TAG, "getLatestTetheringEntitlementResult:" + pkgName);
+ mService.getLatestTetheringEntitlementResult(type, wrappedListener,
+ showEntitlementUi, pkgName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @removed
+ * @deprecated This API would be removed when all of caller has been updated.
+ * */
+ @Deprecated
public void getLatestTetheringEntitlementValue(int type, boolean showEntitlementUi,
@NonNull final TetheringEntitlementValueListener listener, @Nullable Handler handler) {
Preconditions.checkNotNull(listener, "TetheringEntitlementValueListener cannot be null.");
@@ -2733,7 +2789,7 @@
try {
String pkgName = mContext.getOpPackageName();
Log.i(TAG, "getLatestTetheringEntitlementValue:" + pkgName);
- mService.getLatestTetheringEntitlementValue(type, wrappedListener,
+ mService.getLatestTetheringEntitlementResult(type, wrappedListener,
showEntitlementUi, pkgName);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index 6728712..fd44fc8 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -212,6 +212,6 @@
boolean isCallerCurrentAlwaysOnVpnApp();
boolean isCallerCurrentAlwaysOnVpnLockdownApp();
- void getLatestTetheringEntitlementValue(int type, in ResultReceiver receiver,
+ void getLatestTetheringEntitlementResult(int type, in ResultReceiver receiver,
boolean showEntitlementUi, String callerPkg);
}
diff --git a/core/java/android/view/NotificationHeaderView.java b/core/java/android/view/NotificationHeaderView.java
index f8d5014..b2f3f5e 100644
--- a/core/java/android/view/NotificationHeaderView.java
+++ b/core/java/android/view/NotificationHeaderView.java
@@ -67,6 +67,7 @@
private boolean mExpanded;
private boolean mShowExpandButtonAtEnd;
private boolean mShowWorkBadgeAtEnd;
+ private int mHeaderTextMarginEnd;
private Drawable mBackground;
private boolean mEntireHeaderClickable;
private boolean mExpandOnlyOnButton;
@@ -133,7 +134,8 @@
MeasureSpec.AT_MOST);
int wrapContentHeightSpec = MeasureSpec.makeMeasureSpec(givenHeight,
MeasureSpec.AT_MOST);
- int totalWidth = getPaddingStart() + getPaddingEnd();
+ int totalWidth = getPaddingStart();
+ int iconWidth = getPaddingEnd();
for (int i = 0; i < getChildCount(); i++) {
final View child = getChildAt(i);
if (child.getVisibility() == GONE) {
@@ -146,10 +148,19 @@
int childHeightSpec = getChildMeasureSpec(wrapContentHeightSpec,
lp.topMargin + lp.bottomMargin, lp.height);
child.measure(childWidthSpec, childHeightSpec);
- totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
+ if ((child == mExpandButton && mShowExpandButtonAtEnd)
+ || child == mProfileBadge
+ || child == mAppOps) {
+ iconWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
+ } else {
+ totalWidth += lp.leftMargin + lp.rightMargin + child.getMeasuredWidth();
+ }
}
- if (totalWidth > givenWidth) {
- int overFlow = totalWidth - givenWidth;
+
+ // Ensure that there is at least enough space for the icons
+ int endMargin = Math.max(mHeaderTextMarginEnd, iconWidth);
+ if (totalWidth > givenWidth - endMargin) {
+ int overFlow = totalWidth - givenWidth + endMargin;
// We are overflowing, lets shrink the app name first
overFlow = shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mAppName,
mChildMinWidth);
@@ -161,6 +172,7 @@
shrinkViewForOverflow(wrapContentHeightSpec, overFlow, mSecondaryHeaderText,
0);
}
+ totalWidth += getPaddingEnd();
mTotalWidth = Math.min(totalWidth, givenWidth);
setMeasuredDimension(givenWidth, givenHeight);
}
@@ -383,6 +395,26 @@
return mIcon;
}
+ /**
+ * Sets the margin end for the text portion of the header, excluding right-aligned elements
+ * @param headerTextMarginEnd margin size
+ */
+ @RemotableViewMethod
+ public void setHeaderTextMarginEnd(int headerTextMarginEnd) {
+ if (mHeaderTextMarginEnd != headerTextMarginEnd) {
+ mHeaderTextMarginEnd = headerTextMarginEnd;
+ requestLayout();
+ }
+ }
+
+ /**
+ * Get the current margin end value for the header text
+ * @return margin size
+ */
+ public int getHeaderTextMarginEnd() {
+ return mHeaderTextMarginEnd;
+ }
+
public class HeaderTouchListener implements View.OnTouchListener {
private final ArrayList<Rect> mTouchRects = new ArrayList<>();
diff --git a/core/java/com/android/internal/widget/MediaNotificationView.java b/core/java/com/android/internal/widget/MediaNotificationView.java
index 498bc5a..de86d92 100644
--- a/core/java/com/android/internal/widget/MediaNotificationView.java
+++ b/core/java/com/android/internal/widget/MediaNotificationView.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import android.content.Context;
import android.util.AttributeSet;
+import android.view.NotificationHeaderView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
@@ -37,7 +38,7 @@
private final int mNotificationContentImageMarginEnd;
private ImageView mRightIcon;
private View mActions;
- private View mHeader;
+ private NotificationHeaderView mHeader;
private View mMainColumn;
private View mMediaContent;
private int mImagePushIn;
@@ -94,7 +95,14 @@
mMainColumn.setLayoutParams(params);
reMeasure = true;
}
- int headerMarginEnd = size + imageEndMargin;
+ // margin for the entire header line
+ int headerMarginEnd = imageEndMargin;
+ // margin for the header text (not including the expand button and other icons)
+ int headerTextMarginEnd = size + imageEndMargin;
+ if (headerTextMarginEnd != mHeader.getHeaderTextMarginEnd()) {
+ mHeader.setHeaderTextMarginEnd(headerTextMarginEnd);
+ reMeasure = true;
+ }
params = (MarginLayoutParams) mHeader.getLayoutParams();
if (params.getMarginEnd() != headerMarginEnd) {
params.setMarginEnd(headerMarginEnd);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
index 4690aeb..7850035 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentView.java
@@ -328,22 +328,10 @@
if (mExpandedChild != null
&& mExpandedWrapper.getNotificationHeader() != null) {
NotificationHeaderView expandedHeader = mExpandedWrapper.getNotificationHeader();
- int expandedSize = expandedHeader.getMeasuredWidth()
- - expandedHeader.getPaddingEnd();
- int collapsedSize = contractedHeader.getMeasuredWidth()
- - expandedHeader.getPaddingEnd();
- if (expandedSize != collapsedSize) {
- int paddingEnd = contractedHeader.getMeasuredWidth() - expandedSize;
- contractedHeader.setPadding(
- contractedHeader.isLayoutRtl()
- ? paddingEnd
- : contractedHeader.getPaddingLeft(),
- contractedHeader.getPaddingTop(),
- contractedHeader.isLayoutRtl()
- ? contractedHeader.getPaddingLeft()
- : paddingEnd,
- contractedHeader.getPaddingBottom());
- contractedHeader.setShowWorkBadgeAtEnd(true);
+
+ int headerTextMargin = expandedHeader.getHeaderTextMarginEnd();
+ if (headerTextMargin != contractedHeader.getHeaderTextMarginEnd()) {
+ contractedHeader.setHeaderTextMarginEnd(headerTextMargin);
return true;
}
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
index b561ac1..db2be0e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java
@@ -93,14 +93,28 @@
return null;
}
+ /**
+ * Adds {@code callback} to the controller. The controller will update the callback on state
+ * changes. It will immediately trigger the callback added to notify current state.
+ * @param callback
+ */
@Override
public void addCallback(Callback callback) {
synchronized (mCallbacks) {
if (callback == null || mCallbacks.contains(callback)) return;
if (DEBUG) Log.d(TAG, "addCallback " + callback);
mCallbacks.add(callback);
-
- updateWifiStateListeners(!mCallbacks.isEmpty());
+ if (mWifiManager != null) {
+ if (mCallbacks.size() == 1) {
+ mWifiManager.registerSoftApCallback(this, mMainHandler);
+ } else {
+ // mWifiManager#registerSoftApCallback triggers a call to onNumClientsChanged
+ // on the Main Handler. In order to always update the callback on added, we
+ // make this call when adding callbacks after the first.
+ mMainHandler.post(() ->
+ callback.onHotspotChanged(isHotspotEnabled(), mNumConnectedDevices));
+ }
+ }
}
}
@@ -110,27 +124,9 @@
if (DEBUG) Log.d(TAG, "removeCallback " + callback);
synchronized (mCallbacks) {
mCallbacks.remove(callback);
- updateWifiStateListeners(!mCallbacks.isEmpty());
- }
- }
-
- /**
- * Updates the wifi state receiver to either start or stop listening to get updates to the
- * hotspot status. Additionally starts listening to wifi manager state to track the number of
- * connected devices.
- *
- * @param shouldListen whether we should start listening to various wifi statuses
- */
- private void updateWifiStateListeners(boolean shouldListen) {
- if (mWifiManager == null) {
- return;
- }
- if (shouldListen) {
- mWifiManager.registerSoftApCallback(
- this,
- mMainHandler);
- } else {
- mWifiManager.unregisterSoftApCallback(this);
+ if (mCallbacks.isEmpty() && mWifiManager != null) {
+ mWifiManager.unregisterSoftApCallback(this);
+ }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
index 943d927..cf25a9d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/bubbles/animation/StackAnimationControllerTest.java
@@ -177,6 +177,7 @@
}
@Test
+ @Ignore("Occasionally flakes, ignoring pending investigation.")
public void testChildRemoved() throws InterruptedException {
assertEquals(0, mLayout.getTransientViewCount());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java
new file mode 100644
index 0000000..3e4c4d6
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.policy;
+
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiManager;
+import android.os.Handler;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@TestableLooper.RunWithLooper
+public class HotspotControllerImplTest extends SysuiTestCase {
+
+ @Mock
+ private ConnectivityManager mConnectivityManager;
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private HotspotController.Callback mCallback1;
+ @Mock
+ private HotspotController.Callback mCallback2;
+ private HotspotControllerImpl mController;
+ private TestableLooper mLooper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mLooper = TestableLooper.get(this);
+
+ mContext.addMockSystemService(ConnectivityManager.class, mConnectivityManager);
+ mContext.addMockSystemService(WifiManager.class, mWifiManager);
+
+ doAnswer((InvocationOnMock invocation) -> {
+ ((WifiManager.SoftApCallback) invocation.getArgument(0)).onNumClientsChanged(1);
+ return null;
+ }).when(mWifiManager).registerSoftApCallback(any(WifiManager.SoftApCallback.class),
+ any(Handler.class));
+
+ mController = new HotspotControllerImpl(mContext, new Handler(mLooper.getLooper()));
+ }
+
+ @Test
+ public void testAddingTwoCallbacksRegistersToWifiManagerOnce() {
+ mController.addCallback(mCallback1);
+ mController.addCallback(mCallback2);
+
+ verify(mWifiManager, times(1)).registerSoftApCallback(eq(mController), any());
+ }
+
+ @Test
+ public void testAddingCallbacksDoesntUpdateAll() {
+ mController.addCallback(mCallback1);
+ mController.addCallback(mCallback2);
+
+ mLooper.processAllMessages();
+ // Each callback should be updated only once
+ verify(mCallback1, times(1)).onHotspotChanged(anyBoolean(), anyInt());
+ verify(mCallback2, times(1)).onHotspotChanged(anyBoolean(), anyInt());
+ }
+
+ @Test
+ public void testRemovingTwoCallbacksUnegistersToWifiManagerOnce() {
+ mController.addCallback(mCallback1);
+ mController.addCallback(mCallback2);
+
+ mController.removeCallback(mCallback1);
+ mController.removeCallback(mCallback2);
+
+ verify(mWifiManager, times(1)).unregisterSoftApCallback(mController);
+ }
+
+ @Test
+ public void testDoNotUnregisterIfRemainingCallbacks() {
+ mController.addCallback(mCallback1);
+ mController.addCallback(mCallback2);
+
+ verify(mWifiManager, never()).unregisterSoftApCallback(any());
+ }
+
+}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index da89116..219e046 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -3792,10 +3792,10 @@
* if it's really needed.
*/
@Override
- public void getLatestTetheringEntitlementValue(int type, ResultReceiver receiver,
+ public void getLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
boolean showEntitlementUi, String callerPkg) {
ConnectivityManager.enforceTetherChangePermission(mContext, callerPkg);
- mTethering.getLatestTetheringEntitlementValue(type, receiver, showEntitlementUi);
+ mTethering.getLatestTetheringEntitlementResult(type, receiver, showEntitlementUi);
}
// Called when we lose the default network and have no replacement yet.
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 13ff30d..3b4b6f8 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -1677,10 +1677,10 @@
}
/** Get the latest value of the tethering entitlement check. */
- public void getLatestTetheringEntitlementValue(int type, ResultReceiver receiver,
+ public void getLatestTetheringEntitlementResult(int type, ResultReceiver receiver,
boolean showEntitlementUi) {
if (receiver != null) {
- mEntitlementMgr.getLatestTetheringEntitlementValue(type, receiver, showEntitlementUi);
+ mEntitlementMgr.getLatestTetheringEntitlementResult(type, receiver, showEntitlementUi);
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
index 75aac10..65cc516 100644
--- a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
+++ b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
@@ -291,7 +291,7 @@
}
/** Get the last value of the tethering entitlement check. */
- public void getLatestTetheringEntitlementValue(int downstream, ResultReceiver receiver,
+ public void getLatestTetheringEntitlementResult(int downstream, ResultReceiver receiver,
boolean showEntitlementUi) {
if (!isTetherProvisioningRequired()) {
receiver.send(TETHER_ERROR_NO_ERROR, null);
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
index e241ba6..d3e1a05 100644
--- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
+++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java
@@ -531,17 +531,10 @@
}
private void updateRollbackLifetimeDurationInMillis() {
- String strRollbackLifetimeInMillis = DeviceConfig.getProperty(
+ mRollbackLifetimeDurationInMillis = DeviceConfig.getLong(
DeviceConfig.Rollback.BOOT_NAMESPACE,
- DeviceConfig.Rollback.ROLLBACK_LIFETIME_IN_MILLIS);
-
- try {
- mRollbackLifetimeDurationInMillis = (strRollbackLifetimeInMillis == null)
- ? DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS
- : Long.parseLong(strRollbackLifetimeInMillis);
- } catch (NumberFormatException e) {
- mRollbackLifetimeDurationInMillis = DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS;
- }
+ DeviceConfig.Rollback.ROLLBACK_LIFETIME_IN_MILLIS,
+ DEFAULT_ROLLBACK_LIFETIME_DURATION_MILLIS);
}
void onBootCompleted() {
diff --git a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
index d685e8c..3944fad 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
@@ -226,7 +226,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
callbackTimeoutHelper(mCallbacklatch);
assertFalse(mEnMgr.everRunUiEntitlement);
@@ -242,7 +242,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, false);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
callbackTimeoutHelper(mCallbacklatch);
assertFalse(mEnMgr.everRunUiEntitlement);
// 3. No cache value and ui entitlement check is needed.
@@ -255,7 +255,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
mLooper.dispatchAll();
callbackTimeoutHelper(mCallbacklatch);
assertTrue(mEnMgr.everRunUiEntitlement);
@@ -269,7 +269,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, false);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, false);
callbackTimeoutHelper(mCallbacklatch);
assertFalse(mEnMgr.everRunUiEntitlement);
// 5. Cache value is TETHER_ERROR_PROVISION_FAILED and ui entitlement check is needed.
@@ -282,7 +282,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
mLooper.dispatchAll();
callbackTimeoutHelper(mCallbacklatch);
assertTrue(mEnMgr.everRunUiEntitlement);
@@ -296,7 +296,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_WIFI, receiver, true);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_WIFI, receiver, true);
callbackTimeoutHelper(mCallbacklatch);
assertFalse(mEnMgr.everRunUiEntitlement);
// 7. Test get value for other downstream type.
@@ -308,7 +308,7 @@
mCallbacklatch.countDown();
}
};
- mEnMgr.getLatestTetheringEntitlementValue(TETHERING_USB, receiver, false);
+ mEnMgr.getLatestTetheringEntitlementResult(TETHERING_USB, receiver, false);
callbackTimeoutHelper(mCallbacklatch);
assertFalse(mEnMgr.everRunUiEntitlement);
}
diff --git a/tools/aapt2/java/ProguardRules.cpp b/tools/aapt2/java/ProguardRules.cpp
index 52e168e..05ba8f0 100644
--- a/tools/aapt2/java/ProguardRules.cpp
+++ b/tools/aapt2/java/ProguardRules.cpp
@@ -281,6 +281,15 @@
AddClass(node->line_number, result.value(), "");
}
}
+
+ attr = node->FindAttribute(xml::kSchemaAndroid, "zygotePreloadName");
+ if (attr) {
+ Maybe<std::string> result = util::GetFullyQualifiedClassName(package_, attr->value);
+ if (result) {
+ AddClass(node->line_number, result.value(), "");
+ }
+ }
+
if (main_dex_only_) {
xml::Attribute* default_process = node->FindAttribute(xml::kSchemaAndroid, "process");
if (default_process) {
diff --git a/tools/aapt2/java/ProguardRules_test.cpp b/tools/aapt2/java/ProguardRules_test.cpp
index da24907..559b07a 100644
--- a/tools/aapt2/java/ProguardRules_test.cpp
+++ b/tools/aapt2/java/ProguardRules_test.cpp
@@ -42,6 +42,7 @@
android:appComponentFactory="com.foo.BarAppComponentFactory"
android:backupAgent="com.foo.BarBackupAgent"
android:name="com.foo.BarApplication"
+ android:zygotePreloadName="com.foo.BarZygotePreload"
>
<activity android:name="com.foo.BarActivity"/>
<service android:name="com.foo.BarService"/>
@@ -63,6 +64,7 @@
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { <init>(); }"));
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { <init>(); }"));
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarZygotePreload { <init>(); }"));
actual = GetKeepSetString(set, /** minimal_rules */ true);
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarAppComponentFactory { <init>(); }"));
@@ -73,6 +75,7 @@
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarReceiver { <init>(); }"));
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarProvider { <init>(); }"));
EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarInstrumentation { <init>(); }"));
+ EXPECT_THAT(actual, HasSubstr("-keep class com.foo.BarZygotePreload { <init>(); }"));
}
TEST(ProguardRulesTest, FragmentNameRuleIsEmitted) {