Merge "Update mobile data type icons." into pi-dev
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index a1a10a5..3696eae 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -657,13 +657,13 @@
* <a name="ProcessLifecycle"></a>
* <h3>Process Lifecycle</h3>
*
- * <p>The Android system attempts to keep application process around for as
+ * <p>The Android system attempts to keep an application process around for as
* long as possible, but eventually will need to remove old processes when
- * memory runs low. As described in <a href="#ActivityLifecycle">Activity
+ * memory runs low. As described in <a href="#ActivityLifecycle">Activity
* Lifecycle</a>, the decision about which process to remove is intimately
- * tied to the state of the user's interaction with it. In general, there
+ * tied to the state of the user's interaction with it. In general, there
* are four states a process can be in based on the activities running in it,
- * listed here in order of importance. The system will kill less important
+ * listed here in order of importance. The system will kill less important
* processes (the last ones) before it resorts to killing more important
* processes (the first ones).
*
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index e736f34..f67ec4a 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -35,7 +35,6 @@
import android.content.pm.ShortcutInfo;
import android.os.Bundle;
import android.os.Handler;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.DisplayMetrics;
@@ -1186,6 +1185,11 @@
* calls this API multiple times in a row. It may ignore the previous requests,
* for example.
*
+ * <p>Launcher will not show the configuration activity associated with the provider in this
+ * case. The app could either show the configuration activity as a response to the callback,
+ * or show if before calling the API (various configurations can be encapsulated in
+ * {@code successCallback} to avoid persisting them before the widgetId is known).
+ *
* @param provider The {@link ComponentName} for the {@link
* android.content.BroadcastReceiver BroadcastReceiver} provider for your AppWidget.
* @param extras In not null, this is passed to the launcher app. For eg {@link
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index b4a7eec..21ede16 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -1429,6 +1429,10 @@
* Always non-null for a {@link #REQUEST_TYPE_APPWIDGET} request, and always null for a
* different request type.
*
+ * <p>Launcher should not show any configuration activity associated with the provider, and
+ * assume that the widget is already fully configured. Upon accepting the widget, it should
+ * pass the widgetId in {@link #accept(Bundle)}.
+ *
* @return requested {@link AppWidgetProviderInfo} when a request is of the
* {@link #REQUEST_TYPE_APPWIDGET} type. Null otherwise.
*/
diff --git a/core/java/android/os/SystemProperties.java b/core/java/android/os/SystemProperties.java
index a9b8675..8eb39c0 100644
--- a/core/java/android/os/SystemProperties.java
+++ b/core/java/android/os/SystemProperties.java
@@ -205,7 +205,12 @@
}
ArrayList<Runnable> callbacks = new ArrayList<Runnable>(sChangeCallbacks);
for (int i=0; i<callbacks.size(); i++) {
- callbacks.get(i).run();
+ try {
+ callbacks.get(i).run();
+ } catch (Throwable t) {
+ Log.wtf(TAG, "Exception in SystemProperties change callback", t);
+ // Ignore and try to go on.
+ }
}
}
}
diff --git a/core/jni/android_os_SystemProperties.cpp b/core/jni/android_os_SystemProperties.cpp
index a94cac0..9ec7517 100644
--- a/core/jni/android_os_SystemProperties.cpp
+++ b/core/jni/android_os_SystemProperties.cpp
@@ -124,6 +124,12 @@
if (sVM->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0) {
//ALOGI("Java SystemProperties: calling %p", sCallChangeCallbacks);
env->CallStaticVoidMethod(sClazz, sCallChangeCallbacks);
+ // There should not be any exceptions. But we must guarantee
+ // there are none on return.
+ if (env->ExceptionCheck()) {
+ env->ExceptionClear();
+ LOG(ERROR) << "Exception pending after sysprop_change!";
+ }
}
}
}
diff --git a/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java b/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
index 282b001..933e54e 100644
--- a/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
+++ b/core/tests/systemproperties/src/android/os/SystemPropertiesTest.java
@@ -16,6 +16,9 @@
package android.os;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
import junit.framework.TestCase;
import android.os.SystemProperties;
@@ -141,4 +144,48 @@
} catch (NullPointerException npe) {
}
}
+
+ @SmallTest
+ public void testCallbacks() {
+ // Latches are not really necessary, but are easy to use.
+ final CountDownLatch wait1 = new CountDownLatch(1);
+ final CountDownLatch wait2 = new CountDownLatch(1);
+
+ Runnable r1 = new Runnable() {
+ boolean done = false;
+ @Override
+ public void run() {
+ if (done) {
+ return;
+ }
+ done = true;
+
+ wait1.countDown();
+ throw new RuntimeException("test");
+ }
+ };
+
+ Runnable r2 = new Runnable() {
+ @Override
+ public void run() {
+ wait2.countDown();
+ }
+ };
+
+ SystemProperties.addChangeCallback(r1);
+ SystemProperties.addChangeCallback(r2);
+
+ SystemProperties.reportSyspropChanged();
+
+ try {
+ assertTrue(wait1.await(5, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ fail("InterruptedException");
+ }
+ try {
+ assertTrue(wait2.await(5, TimeUnit.SECONDS));
+ } catch (InterruptedException e) {
+ fail("InterruptedException");
+ }
+ }
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/AppTransitionAnimationSpecsFuture.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/AppTransitionAnimationSpecsFuture.java
index 85d362a..c227fee 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/AppTransitionAnimationSpecsFuture.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/view/AppTransitionAnimationSpecsFuture.java
@@ -49,6 +49,10 @@
mHandler.post(mComposeTask);
}
List<AppTransitionAnimationSpecCompat> specs = mComposeTask.get();
+ // Clear reference to the compose task this future holds onto the reference to it's
+ // implementation (which can leak references to the bitmap it creates for the
+ // transition)
+ mComposeTask = null;
if (specs == null) {
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index ac26f68..19da3db 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -276,6 +276,9 @@
}
};
+ // Used to reset the dummy stack view
+ private final TaskStack mEmptyTaskStack = new TaskStack();
+
public RecentsImpl(Context context) {
mContext = context;
mHandler = new Handler();
@@ -1108,6 +1111,10 @@
}
});
EventBus.getDefault().send(hideMenuEvent);
+
+ // Once we have launched the activity, reset the dummy stack view tasks so we don't hold
+ // onto references to the same tasks consumed by the activity
+ mDummyStackView.setTasks(mEmptyTaskStack, false /* notifyStackChanges */);
}
/**** OnAnimationFinishedListener Implementation ****/
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index c348187..75bc9558 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -96,6 +96,9 @@
public void onTaskStackChanged() {
ActivityManager.RunningTaskInfo info = ActivityManagerWrapper.getInstance()
.getRunningTask(ACTIVITY_TYPE_UNDEFINED /* ignoreActivityType */);
+ if (info == null) {
+ return;
+ }
if (mBlacklistedPackages.contains(info.baseActivity.getPackageName())) {
hide(true);
return;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 1bd5e33..19e8295 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -193,7 +193,8 @@
float clockYTarget = mCurrentlySecure ? mMinTopMargin : -mKeyguardStatusHeight;
// Move clock up while collapsing the shade
- final float shadeExpansion = mExpandedHeight / mMaxPanelHeight;
+ float shadeExpansion = mExpandedHeight / mMaxPanelHeight;
+ shadeExpansion = Interpolators.FAST_OUT_LINEAR_IN.getInterpolation(shadeExpansion);
final float clockY = MathUtils.lerp(clockYTarget, clockYRegular, shadeExpansion);
return (int) MathUtils.lerp(clockY, clockYDark, mDarkAmount);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
index cd000fe..a0df558 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
@@ -73,6 +73,7 @@
private int mTouchDownY;
private boolean mDownOnRecents;
private VelocityTracker mVelocityTracker;
+ private boolean mIsInScreenPinning;
private boolean mDockWindowEnabled;
private boolean mDockWindowTouchSlopExceeded;
@@ -105,6 +106,9 @@
}
public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
+ mIsInScreenPinning = mNavigationBarView.inScreenPinning();
+ }
if (!canHandleGestures()) {
return false;
}
@@ -269,7 +273,7 @@
}
private boolean canHandleGestures() {
- return !mNavigationBarView.inScreenPinning() && !mStatusBar.isKeyguardShowing()
+ return !mIsInScreenPinning && !mStatusBar.isKeyguardShowing()
&& mStatusBar.isPresenterFullyCollapsed();
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java
index e023e87..c3defa4 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/car/CarQsFragmentTest.java
@@ -32,6 +32,7 @@
import com.android.systemui.statusbar.policy.Clock;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -41,6 +42,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
@SmallTest
+@Ignore("Flaky")
public class CarQsFragmentTest extends SysuiBaseFragmentTest {
public CarQsFragmentTest() {
super(CarQSFragment.class);
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index 62d941a..0cc60e3 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -5511,6 +5511,36 @@
// OS: P
SETTINGS_PREVENT_RINGING = 1360;
+ // ACTION: Settings > Battery settings > Battery tip > Open app restriction page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_APP_RESTRICTION_PAGE = 1361;
+
+ // ACTION: Settings > Battery settings > Battery tip > Restrict app
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_RESTRICT_APP = 1362;
+
+ // ACTION: Settings > Battery settings > Battery tip > Unrestrict app
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_UNRESTRICT_APP = 1363;
+
+ // ACTION: Settings > Battery settings > Battery tip > Open smart battery page
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_OPEN_SMART_BATTERY = 1364;
+
+ // ACTION: Settings > Battery settings > Battery tip > Turn on battery saver
+ // CATEGORY: SETTINGS
+ // OS: P
+ ACTION_TIP_TURN_ON_BATTERY_SAVER = 1365;
+
+ // FIELD: type of anomaly in settings app
+ // CATEGORY: SETTINGS
+ // OS: P
+ FIELD_ANOMALY_TYPE = 1366;
+
// ---- End P Constants, all P constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 795cb70..1f5320a 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1356,17 +1356,7 @@
if (DEBUG_USER_LEAVING) Slog.v(TAG_USER_LEAVING,
"Sleep => pause with userLeaving=false");
- // If we are in the middle of resuming the top activity in
- // {@link #resumeTopActivityUncheckedLocked}, mResumedActivity will be set but not
- // resumed yet. We must not proceed pausing the activity here. This method will be
- // called again if necessary as part of {@link #checkReadyForSleep} or
- // {@link ActivityStackSupervisor#checkReadyForSleepLocked}.
- if (mStackSupervisor.inResumeTopActivity) {
- if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "In the middle of resuming top activity "
- + mResumedActivity);
- } else {
- startPausingLocked(false, true, null, false);
- }
+ startPausingLocked(false, true, null, false);
shouldSleep = false ;
} else if (mPausingActivity != null) {
// Still waiting for something to pause; can't sleep yet.
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index ea90db3..9a7634e 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -1457,10 +1457,17 @@
return;
}
- Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r. receiver
+ // If the receiver app is being debugged we quietly ignore unresponsiveness, just
+ // tidying up and moving on to the next broadcast without crashing or ANRing this
+ // app just because it's stopped at a breakpoint.
+ final boolean debugging = (r.curApp != null && r.curApp.debugging);
+
+ Slog.w(TAG, "Timeout of broadcast " + r + " - receiver=" + r.receiver
+ ", started " + (now - r.receiverTime) + "ms ago");
r.receiverTime = now;
- r.anrCount++;
+ if (!debugging) {
+ r.anrCount++;
+ }
ProcessRecord app = null;
String anrMessage = null;
@@ -1500,7 +1507,7 @@
r.resultExtras, r.resultAbort, false);
scheduleBroadcastsLocked();
- if (anrMessage != null) {
+ if (!debugging && anrMessage != null) {
// Post the ANR to the handler since we do not want to process ANRs while
// potentially holding our lock.
mHandler.post(new AppNotResponding(app, anrMessage));
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index 1a95fdd..08158ec 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -98,24 +98,6 @@
}
@Test
- public void testNoPauseDuringResumeTopActivity() throws Exception {
- final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
-
- // Simulate the a resumed activity set during
- // {@link ActivityStack#resumeTopActivityUncheckedLocked}.
- mSupervisor.inResumeTopActivity = true;
- r.setState(RESUMED, "testNoPauseDuringResumeTopActivity");
-
- final boolean waiting = mStack.goToSleepIfPossible(false);
-
- // Ensure we report not being ready for sleep.
- assertFalse(waiting);
-
- // Make sure the resumed activity is untouched.
- assertEquals(mStack.getResumedActivity(), r);
- }
-
- @Test
public void testResumedActivity() throws Exception {
final ActivityRecord r = new ActivityBuilder(mService).setTask(mTask).build();
assertEquals(mStack.getResumedActivity(), null);
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index 8a3f138..38bc640 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -17,6 +17,7 @@
package android.telephony;
import android.annotation.RequiresPermission;
+import android.annotation.SuppressAutoDoc;
import android.annotation.SystemApi;
import android.app.ActivityThread;
import android.app.PendingIntent;
@@ -343,15 +344,16 @@
* applications. Intended for internal carrier use only.
* </p>
*
- * <p>Requires Permission:
- * {@link android.Manifest.permission#SEND_SMS} and
- * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier
- * privileges.
- * </p>
+ * <p>Requires Permission: Both {@link android.Manifest.permission#SEND_SMS} and
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE}, or that the calling app has carrier
+ * privileges (see {@link TelephonyManager#hasCarrierPrivileges}), or that the calling app is
+ * the default IMS app (see
+ * {@link CarrierConfigManager#KEY_CONFIG_IMS_PACKAGE_OVERRIDE_STRING}).
*
* @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent)
*/
@SystemApi
+ @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@RequiresPermission(allOf = {
android.Manifest.permission.MODIFY_PHONE_STATE,
android.Manifest.permission.SEND_SMS
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index a4f7768..7dff667 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1787,11 +1787,17 @@
* invalid subscription ID is pinned to the TelephonyManager, the returned config will contain
* default values.
*
+ * <p>This method may take several seconds to complete, so it should only be called from a
+ * worker thread.
+ *
+ * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ *
* @see CarrierConfigManager#getConfigForSubId(int)
* @see #createForSubscriptionId(int)
* @see #createForPhoneAccountHandle(PhoneAccountHandle)
*/
- // TODO(b/73136824, b/70041899): Permit carrier-privileged callers as well.
+ @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
@WorkerThread
@RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
public PersistableBundle getCarrierConfig() {