Merge "Revert "Revert "Frameworks/base: Update to preloaded-classes""" into lmp-dev
diff --git a/core/java/android/app/backup/WallpaperBackupHelper.java b/core/java/android/app/backup/WallpaperBackupHelper.java
index 0567500..b8575d7 100644
--- a/core/java/android/app/backup/WallpaperBackupHelper.java
+++ b/core/java/android/app/backup/WallpaperBackupHelper.java
@@ -80,17 +80,17 @@
mFiles = files;
mKeys = keys;
- WallpaperManager wpm;
- wpm = (WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE);
- mDesiredMinWidth = (double) wpm.getDesiredMinimumWidth();
+ final WindowManager wm =
+ (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ final WallpaperManager wpm =
+ (WallpaperManager) context.getSystemService(Context.WALLPAPER_SERVICE);
+ final Display d = wm.getDefaultDisplay();
+ final Point size = new Point();
+ d.getSize(size);
+ mDesiredMinWidth = size.x;
mDesiredMinHeight = (double) wpm.getDesiredMinimumHeight();
- if (mDesiredMinWidth <= 0 || mDesiredMinHeight <= 0) {
- WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
- Display d = wm.getDefaultDisplay();
- Point size = new Point();
- d.getSize(size);
- mDesiredMinWidth = size.x;
+ if (mDesiredMinHeight <= 0) {
mDesiredMinHeight = size.y;
}
@@ -130,15 +130,12 @@
if (DEBUG) Slog.d(TAG, "Restoring wallpaper image w=" + options.outWidth
+ " h=" + options.outHeight);
- // How much does the image differ from our preference? The threshold
- // here is set to accept any image larger than our target, because
- // scaling down is acceptable; but to reject images that are deemed
- // "too small" to scale up attractively. The value 1.33 is just barely
- // too low to pass Nexus 1 or Droid wallpapers for use on a Xoom, but
- // will pass anything relatively larger.
- double widthRatio = mDesiredMinWidth / options.outWidth;
- double heightRatio = mDesiredMinHeight / options.outHeight;
- if (widthRatio > 0 && widthRatio < 1.33
+ // We accept any wallpaper that is at least as wide as our preference
+ // (i.e. wide enough to fill the screen), and is within a comfortable
+ // factor of the target height, to avoid significant clipping/scaling/
+ // letterboxing.
+ final double heightRatio = mDesiredMinHeight / options.outHeight;
+ if (options.outWidth >= mDesiredMinWidth
&& heightRatio > 0 && heightRatio < 1.33) {
// sufficiently close to our resolution; go ahead and use it
Slog.d(TAG, "Applying restored wallpaper image.");
@@ -147,8 +144,11 @@
// since it does not exist anywhere other than the private wallpaper
// file.
} else {
- Slog.i(TAG, "Dimensions too far off; using default wallpaper. wr=" + widthRatio
- + " hr=" + heightRatio);
+ Slog.i(TAG, "Restored image dimensions (w="
+ + options.outWidth + ", h=" + options.outHeight
+ + ") too far off target (tw="
+ + mDesiredMinWidth + ", th=" + mDesiredMinHeight
+ + "); falling back to default wallpaper.");
f.delete();
}
}
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 2315c74..37294e7 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -430,10 +430,14 @@
}
}
- /**
+ /**
* Used to determine whether the user making this call is subject to
* teleportations.
- * @return whether the user making this call is a goat
+ *
+ * <p>As of {@link android.os.Build.VERSION_CODES#L}, this method can
+ * now automatically identify goats using advanced goat recognition technology.</p>
+ *
+ * @return Returns true if the user making this call is a goat.
*/
public boolean isUserAGoat() {
return mContext.getPackageManager()
diff --git a/core/java/android/speech/RecognitionService.java b/core/java/android/speech/RecognitionService.java
index 45eb0bf..dcdbba78 100644
--- a/core/java/android/speech/RecognitionService.java
+++ b/core/java/android/speech/RecognitionService.java
@@ -28,6 +28,8 @@
import android.os.RemoteException;
import android.util.Log;
+import java.lang.ref.WeakReference;
+
/**
* This class provides a base class for recognition service implementations. This class should be
* extended only in case you wish to implement a new speech recognizer. Please note that the
@@ -315,40 +317,46 @@
}
/** Binder of the recognition service */
- private static class RecognitionServiceBinder extends IRecognitionService.Stub {
- private RecognitionService mInternalService;
+ private static final class RecognitionServiceBinder extends IRecognitionService.Stub {
+ private final WeakReference<RecognitionService> mServiceRef;
public RecognitionServiceBinder(RecognitionService service) {
- mInternalService = service;
+ mServiceRef = new WeakReference<RecognitionService>(service);
}
+ @Override
public void startListening(Intent recognizerIntent, IRecognitionListener listener) {
if (DBG) Log.d(TAG, "startListening called by:" + listener.asBinder());
- if (mInternalService != null && mInternalService.checkPermissions(listener)) {
- mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
- MSG_START_LISTENING, mInternalService.new StartListeningArgs(
+ final RecognitionService service = mServiceRef.get();
+ if (service != null && service.checkPermissions(listener)) {
+ service.mHandler.sendMessage(Message.obtain(service.mHandler,
+ MSG_START_LISTENING, service.new StartListeningArgs(
recognizerIntent, listener)));
}
}
+ @Override
public void stopListening(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "stopListening called by:" + listener.asBinder());
- if (mInternalService != null && mInternalService.checkPermissions(listener)) {
- mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
+ final RecognitionService service = mServiceRef.get();
+ if (service != null && service.checkPermissions(listener)) {
+ service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_STOP_LISTENING, listener));
}
}
+ @Override
public void cancel(IRecognitionListener listener) {
if (DBG) Log.d(TAG, "cancel called by:" + listener.asBinder());
- if (mInternalService != null && mInternalService.checkPermissions(listener)) {
- mInternalService.mHandler.sendMessage(Message.obtain(mInternalService.mHandler,
+ final RecognitionService service = mServiceRef.get();
+ if (service != null && service.checkPermissions(listener)) {
+ service.mHandler.sendMessage(Message.obtain(service.mHandler,
MSG_CANCEL, listener));
}
}
public void clearReference() {
- mInternalService = null;
+ mServiceRef.clear();
}
}
}
diff --git a/docs/html/sdk/installing/index.jd b/docs/html/sdk/installing/index.jd
index 304b53d..e98446b 100644
--- a/docs/html/sdk/installing/index.jd
+++ b/docs/html/sdk/installing/index.jd
@@ -112,7 +112,7 @@
your JDK folder, for example <code>C:\Program Files\Java\jdk1.7.0_21</code>.</p>
</p>
</li>
-
+
</ol>
@@ -416,6 +416,9 @@
}
}
-
-
+/* direct link to ubuntu troubleshooting */
+if ( document.location.href.indexOf('#ubuntu-trouble') > -1 ) {
+ $(".linux.docs").show();
+ toggleExpandable(this,'#ubuntu-trouble');
+}
</script>
diff --git a/docs/html/sdk/installing/installing-adt.jd b/docs/html/sdk/installing/installing-adt.jd
index 5a433d4..c8200aa 100644
--- a/docs/html/sdk/installing/installing-adt.jd
+++ b/docs/html/sdk/installing/installing-adt.jd
@@ -1,8 +1,8 @@
page.title=Installing the Eclipse Plugin
-adt.zip.version=23.0.3
-adt.zip.download=ADT-23.0.3.zip
-adt.zip.bytes=103321934
-adt.zip.checksum=ab2f5e2fbbdddeeb7dfd02cd4046538a
+adt.zip.version=23.0.4
+adt.zip.download=ADT-23.0.4.zip
+adt.zip.bytes=103336810
+adt.zip.checksum=91a43dcf686ab73dec2c08b77243492b
@jd:body
diff --git a/docs/html/tools/sdk/eclipse-adt.jd b/docs/html/tools/sdk/eclipse-adt.jd
index cf33200..469d11f 100644
--- a/docs/html/tools/sdk/eclipse-adt.jd
+++ b/docs/html/tools/sdk/eclipse-adt.jd
@@ -53,9 +53,44 @@
<p>For a summary of all known issues in ADT, see <a
href="http://tools.android.com/knownissues">http://tools.android.com/knownissues</a>.</p>
+
<div class="toggle-content opened">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+ alt=""/>ADT 23.0.4</a> <em>(October 2014)</em>
+ </p>
+
+ <div class="toggle-content-toggleme">
+<dl>
+ <dt>Dependencies:</dt>
+
+ <dd>
+ <ul>
+ <li>Java 7 or higher is required if you are targeting the L Developer Preview.</li>
+ <li>Java 1.6 or higher is required if you are targeting other releases.</li>
+ <li>Eclipse Indigo (Version 3.7.2) or higher is required.</li>
+ <li>This version of ADT is designed for use with
+ <a href="{@docRoot}tools/sdk/tools-notes.html">SDK Tools r23.0.4</a>.
+ If you haven't already installed SDK Tools r23.0.4 into your SDK, use the
+ Android SDK Manager to do so.</li>
+ </ul>
+ </dd>
+
+ <dt>General Notes:</dt>
+ <dd>
+ <ul>
+ <li>Fixed duplicate devices in AVD for Wear and TV.</li>
+ </ul>
+ </dd>
+</dl>
+</div>
+</div>
+
+
+
+<div class="toggle-content closed">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
alt=""/>ADT 23.0.3</a> <em>(August 2014)</em>
</p>
diff --git a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
index 4c8b4f1..9fb3fb4 100644
--- a/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedRotateDrawable.java
@@ -257,7 +257,7 @@
public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
throws XmlPullParserException, IOException {
- final TypedArray a = r.obtainAttributes(attrs, R.styleable.AnimatedRotateDrawable);
+ final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.AnimatedRotateDrawable);
super.inflateWithAttributes(r, parser, a, R.styleable.AnimatedRotateDrawable_visible);
diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
index d78138bc..cb09bbf 100644
--- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java
@@ -357,7 +357,8 @@
public void inflate(@NonNull Resources r, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Theme theme)
throws XmlPullParserException, IOException {
- final TypedArray a = r.obtainAttributes(attrs, R.styleable.AnimatedStateListDrawable);
+ final TypedArray a = obtainAttributes(
+ r, theme, attrs, R.styleable.AnimatedStateListDrawable);
super.inflateWithAttributes(r, parser, a, R.styleable.AnimatedStateListDrawable_visible);
diff --git a/graphics/java/android/graphics/drawable/AnimationDrawable.java b/graphics/java/android/graphics/drawable/AnimationDrawable.java
index d87e8e4..9a9fd82 100644
--- a/graphics/java/android/graphics/drawable/AnimationDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimationDrawable.java
@@ -272,7 +272,7 @@
public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
throws XmlPullParserException, IOException {
- TypedArray a = r.obtainAttributes(attrs,
+ TypedArray a = obtainAttributes(r, theme, attrs,
com.android.internal.R.styleable.AnimationDrawable);
super.inflateWithAttributes(r, parser, a,
@@ -300,7 +300,8 @@
continue;
}
- a = r.obtainAttributes(attrs, com.android.internal.R.styleable.AnimationDrawableItem);
+ a = obtainAttributes(
+ r, theme, attrs, com.android.internal.R.styleable.AnimationDrawableItem);
int duration = a.getInt(
com.android.internal.R.styleable.AnimationDrawableItem_duration, -1);
if (duration < 0) {
diff --git a/graphics/java/android/graphics/drawable/ClipDrawable.java b/graphics/java/android/graphics/drawable/ClipDrawable.java
index 61ef81b..40711cf 100644
--- a/graphics/java/android/graphics/drawable/ClipDrawable.java
+++ b/graphics/java/android/graphics/drawable/ClipDrawable.java
@@ -81,7 +81,8 @@
int type;
- TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.ClipDrawable);
+ TypedArray a = obtainAttributes(
+ r, theme, attrs, com.android.internal.R.styleable.ClipDrawable);
int orientation = a.getInt(
com.android.internal.R.styleable.ClipDrawable_clipOrientation,
diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java
index 384226f..961d1607 100644
--- a/graphics/java/android/graphics/drawable/InsetDrawable.java
+++ b/graphics/java/android/graphics/drawable/InsetDrawable.java
@@ -84,7 +84,7 @@
@Override
public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
throws XmlPullParserException, IOException {
- final TypedArray a = r.obtainAttributes(attrs, R.styleable.InsetDrawable);
+ final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.InsetDrawable);
super.inflateWithAttributes(r, parser, a, R.styleable.InsetDrawable_visible);
mInsetState.mDrawable = null;
diff --git a/graphics/java/android/graphics/drawable/LevelListDrawable.java b/graphics/java/android/graphics/drawable/LevelListDrawable.java
index 7271b0e..bc1c61d 100644
--- a/graphics/java/android/graphics/drawable/LevelListDrawable.java
+++ b/graphics/java/android/graphics/drawable/LevelListDrawable.java
@@ -105,7 +105,7 @@
continue;
}
- TypedArray a = r.obtainAttributes(attrs,
+ TypedArray a = obtainAttributes(r, theme, attrs,
com.android.internal.R.styleable.LevelListDrawableItem);
low = a.getInt(
diff --git a/graphics/java/android/graphics/drawable/RotateDrawable.java b/graphics/java/android/graphics/drawable/RotateDrawable.java
index 70482a6..55c9637 100644
--- a/graphics/java/android/graphics/drawable/RotateDrawable.java
+++ b/graphics/java/android/graphics/drawable/RotateDrawable.java
@@ -399,7 +399,7 @@
@Override
public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
throws XmlPullParserException, IOException {
- final TypedArray a = r.obtainAttributes(attrs,
+ final TypedArray a = obtainAttributes(r, theme, attrs,
com.android.internal.R.styleable.RotateDrawable);
super.inflateWithAttributes(r, parser, a,
diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java
index b40038a..b990249 100644
--- a/graphics/java/android/graphics/drawable/ScaleDrawable.java
+++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java
@@ -93,7 +93,8 @@
int type;
- TypedArray a = r.obtainAttributes(attrs, com.android.internal.R.styleable.ScaleDrawable);
+ TypedArray a = obtainAttributes(
+ r, theme, attrs, com.android.internal.R.styleable.ScaleDrawable);
float sw = getPercent(a, com.android.internal.R.styleable.ScaleDrawable_scaleWidth);
float sh = getPercent(a, com.android.internal.R.styleable.ScaleDrawable_scaleHeight);
diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java
index 4c513e9..2eb8a80 100644
--- a/graphics/java/android/graphics/drawable/StateListDrawable.java
+++ b/graphics/java/android/graphics/drawable/StateListDrawable.java
@@ -118,7 +118,7 @@
public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs, Theme theme)
throws XmlPullParserException, IOException {
- final TypedArray a = r.obtainAttributes(attrs, R.styleable.StateListDrawable);
+ final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.StateListDrawable);
super.inflateWithAttributes(r, parser, a,
R.styleable.StateListDrawable_visible);
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index a9cff22..39e5540 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -403,7 +403,7 @@
private ArrayList mInetLog;
// track the current default http proxy - tell the world if we get a new one (real change)
- private ProxyInfo mDefaultProxy = null;
+ private volatile ProxyInfo mDefaultProxy = null;
private Object mProxyLock = new Object();
private boolean mDefaultProxyDisabled = false;
@@ -1792,6 +1792,10 @@
return false;
}
+ private boolean isRequest(NetworkRequest request) {
+ return mNetworkRequests.get(request).isRequest;
+ }
+
// must be stateless - things change under us.
private class NetworkStateTrackerHandler extends Handler {
public NetworkStateTrackerHandler(Looper looper) {
@@ -1895,6 +1899,9 @@
loge("EVENT_SET_EXPLICITLY_SELECTED from unknown NetworkAgent");
break;
}
+ if (nai.created && !nai.networkMisc.explicitlySelected) {
+ loge("ERROR: created network explicitly selected.");
+ }
nai.networkMisc.explicitlySelected = true;
break;
}
@@ -1904,8 +1911,14 @@
boolean valid = (msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID);
if (valid) {
if (DBG) log("Validated " + nai.name());
+ final boolean previouslyValidated = nai.validated;
+ final int previousScore = nai.getCurrentScore();
nai.validated = true;
- rematchNetworkAndRequests(nai);
+ rematchNetworkAndRequests(nai, !previouslyValidated);
+ // If score has changed, rebroadcast to NetworkFactories. b/17726566
+ if (nai.getCurrentScore() != previousScore) {
+ sendUpdatedScoreToFactories(nai);
+ }
}
updateInetCondition(nai, valid);
// Let the NetworkAgent know the state of its network
@@ -2078,6 +2091,7 @@
}
// Since we've lost the network, go through all the requests that
// it was satisfying and see if any other factory can satisfy them.
+ // TODO: This logic may be better replaced with a call to rematchAllNetworksAndRequests
final ArrayList<NetworkAgentInfo> toActivate = new ArrayList<NetworkAgentInfo>();
for (int i = 0; i < nai.networkRequests.size(); i++) {
NetworkRequest request = nai.networkRequests.valueAt(i);
@@ -2113,7 +2127,9 @@
requestNetworkTransitionWakelock(nai.name());
}
for (NetworkAgentInfo networkToActivate : toActivate) {
+ networkToActivate.networkLingered.clear();
networkToActivate.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
+ rematchNetworkAndRequests(networkToActivate, false);
}
}
}
@@ -2151,6 +2167,7 @@
bestNetwork.networkLingered.clear();
bestNetwork.networkMonitor.sendMessage(NetworkMonitor.CMD_NETWORK_CONNECTED);
}
+ // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests
bestNetwork.addRequest(nri.request);
mNetworkForRequestId.put(nri.request.requestId, bestNetwork);
notifyNetworkCallback(bestNetwork, nri);
@@ -2195,7 +2212,7 @@
boolean keep = nai.isVPN();
for (int i = 0; i < nai.networkRequests.size() && !keep; i++) {
NetworkRequest r = nai.networkRequests.valueAt(i);
- if (mNetworkRequests.get(r).isRequest) keep = true;
+ if (isRequest(r)) keep = true;
}
if (!keep) {
if (DBG) log("no live requests for " + nai.name() + "; disconnecting");
@@ -2479,6 +2496,10 @@
if (nai == null) return;
if (DBG) log("reportBadNetwork(" + nai.name() + ") by " + uid);
synchronized (nai) {
+ // Validating an uncreated network could result in a call to rematchNetworkAndRequests()
+ // which isn't meant to work on uncreated networks.
+ if (!nai.created) return;
+
if (isNetworkBlocked(nai, uid)) return;
nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
@@ -2537,12 +2558,12 @@
} finally {
Binder.restoreCallingIdentity(token);
}
- }
- if (mGlobalProxy == null) {
- proxyProperties = mDefaultProxy;
+ if (mGlobalProxy == null) {
+ proxyProperties = mDefaultProxy;
+ }
+ sendProxyBroadcast(proxyProperties);
}
- sendProxyBroadcast(proxyProperties);
}
private void loadGlobalProxy() {
@@ -3684,6 +3705,15 @@
}
}
+ private void sendUpdatedScoreToFactories(NetworkAgentInfo nai) {
+ for (int i = 0; i < nai.networkRequests.size(); i++) {
+ NetworkRequest nr = nai.networkRequests.valueAt(i);
+ // Don't send listening requests to factories. b/17393458
+ if (!isRequest(nr)) continue;
+ sendUpdatedScoreToFactories(nr, nai.getCurrentScore());
+ }
+ }
+
private void sendUpdatedScoreToFactories(NetworkRequest networkRequest, int score) {
if (VDBG) log("sending new Min Network Score(" + score + "): " + networkRequest.toString());
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
@@ -3738,22 +3768,24 @@
}
}
+ private void teardownUnneededNetwork(NetworkAgentInfo nai) {
+ for (int i = 0; i < nai.networkRequests.size(); i++) {
+ NetworkRequest nr = nai.networkRequests.valueAt(i);
+ // Ignore listening requests.
+ if (!isRequest(nr)) continue;
+ loge("Dead network still had at least " + nr);
+ break;
+ }
+ nai.asyncChannel.disconnect();
+ }
+
private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
if (oldNetwork == null) {
loge("Unknown NetworkAgentInfo in handleLingerComplete");
return;
}
- if (DBG) {
- log("handleLingerComplete for " + oldNetwork.name());
- for (int i = 0; i < oldNetwork.networkRequests.size(); i++) {
- NetworkRequest nr = oldNetwork.networkRequests.valueAt(i);
- // Ignore listening requests.
- if (mNetworkRequests.get(nr).isRequest == false) continue;
- loge("Dead network still had at least " + nr);
- break;
- }
- }
- oldNetwork.asyncChannel.disconnect();
+ if (DBG) log("handleLingerComplete for " + oldNetwork.name());
+ teardownUnneededNetwork(oldNetwork);
}
private void makeDefault(NetworkAgentInfo newNetwork) {
@@ -3775,21 +3807,32 @@
// satisfied by newNetwork, and reassigns to newNetwork
// any such requests for which newNetwork is the best.
//
- // - Tears down any Networks that as a result are no longer
+ // - Lingers any Networks that as a result are no longer
// needed. A network is needed if it is the best network for
// one or more NetworkRequests, or if it is a VPN.
//
- // - Tears down newNetwork if it is validated but turns out to be
- // unneeded. Does not tear down newNetwork if it is
- // unvalidated, because future validation may improve
- // newNetwork's score enough that it is needed.
+ // - Tears down newNetwork if it just became validated
+ // (i.e. nascent==true) but turns out to be unneeded.
+ // Does not tear down newNetwork if it is unvalidated,
+ // because future validation may improve newNetwork's
+ // score enough that it is needed.
//
// NOTE: This function only adds NetworkRequests that "newNetwork" could satisfy,
// it does not remove NetworkRequests that other Networks could better satisfy.
// If you need to handle decreases in score, use {@link rematchAllNetworksAndRequests}.
// This function should be used when possible instead of {@code rematchAllNetworksAndRequests}
// as it performs better by a factor of the number of Networks.
- private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork) {
+ //
+ // @param nascent indicates if newNetwork just became validated, in which case it should be
+ // torn down if unneeded. If nascent is false, no action is taken if newNetwork
+ // is found to be unneeded by this call. Presumably, in this case, either:
+ // - newNetwork is unvalidated (and left alive), or
+ // - the NetworkRequests keeping newNetwork alive have been transitioned to
+ // another higher scoring network by another call to rematchNetworkAndRequests()
+ // and this other call also lingered newNetwork.
+ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, boolean nascent) {
+ if (!newNetwork.created) loge("ERROR: uncreated network being rematched.");
+ if (nascent && !newNetwork.validated) loge("ERROR: nascent network not validated.");
boolean keep = newNetwork.isVPN();
boolean isNewDefault = false;
if (DBG) log("rematching " + newNetwork.name());
@@ -3875,11 +3918,11 @@
}
// Linger any networks that are no longer needed.
for (NetworkAgentInfo nai : affectedNetworks) {
- boolean teardown = !nai.isVPN();
+ boolean teardown = !nai.isVPN() && nai.validated;
for (int i = 0; i < nai.networkRequests.size() && teardown; i++) {
NetworkRequest nr = nai.networkRequests.valueAt(i);
try {
- if (mNetworkRequests.get(nr).isRequest) {
+ if (isRequest(nr)) {
teardown = false;
}
} catch (Exception e) {
@@ -3934,20 +3977,16 @@
}
notifyNetworkCallbacks(newNetwork, ConnectivityManager.CALLBACK_AVAILABLE);
- } else if (newNetwork.validated) {
- // Only tear down validated networks here. Leave unvalidated to either become
+ } else if (nascent) {
+ // Only tear down newly validated networks here. Leave unvalidated to either become
// validated (and get evaluated against peers, one losing here) or
// NetworkMonitor reports a bad network and we tear it down then.
+ // Networks that have been up for a while and are validated should be torn down via
+ // the lingering process so communication on that network is given time to wrap up.
// TODO: Could teardown unvalidated networks when their NetworkCapabilities
// satisfy no NetworkRequests.
- if (DBG && newNetwork.networkRequests.size() != 0) {
- loge("tearing down network with live requests:");
- for (int i=0; i < newNetwork.networkRequests.size(); i++) {
- loge(" " + newNetwork.networkRequests.valueAt(i));
- }
- }
if (DBG) log("Validated network turns out to be unwanted. Tear it down.");
- newNetwork.asyncChannel.disconnect();
+ teardownUnneededNetwork(newNetwork);
}
}
@@ -3969,10 +4008,10 @@
// can only add more NetworkRequests satisfied by "changed", and this is exactly what
// rematchNetworkAndRequests() handles.
if (changed != null && oldScore < changed.getCurrentScore()) {
- rematchNetworkAndRequests(changed);
+ rematchNetworkAndRequests(changed, false);
} else {
for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) {
- rematchNetworkAndRequests(nai);
+ rematchNetworkAndRequests(nai, false);
}
}
}
@@ -4046,14 +4085,7 @@
// TODO: support proxy per network.
}
// Consider network even though it is not yet validated.
- // TODO: All the if-statement conditions can be removed now that validation only confers
- // a score increase.
- if (mNetworkForRequestId.get(mDefaultRequest.requestId) == null &&
- networkAgent.isVPN() == false &&
- mDefaultRequest.networkCapabilities.satisfiedByNetworkCapabilities(
- networkAgent.networkCapabilities)) {
- rematchNetworkAndRequests(networkAgent);
- }
+ rematchNetworkAndRequests(networkAgent, false);
} else if (state == NetworkInfo.State.DISCONNECTED ||
state == NetworkInfo.State.SUSPENDED) {
networkAgent.asyncChannel.disconnect();
@@ -4083,12 +4115,7 @@
if (nai.created) rematchAllNetworksAndRequests(nai, oldScore);
- for (int i = 0; i < nai.networkRequests.size(); i++) {
- NetworkRequest nr = nai.networkRequests.valueAt(i);
- // Don't send listening requests to factories. b/17393458
- if (mNetworkRequests.get(nr).isRequest == false) continue;
- sendUpdatedScoreToFactories(nr, score);
- }
+ sendUpdatedScoreToFactories(nai);
}
// notify only this one new request of the current state
diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java
index 5022b28..0ea66b9 100644
--- a/services/core/java/com/android/server/am/ProcessList.java
+++ b/services/core/java/com/android/server/am/ProcessList.java
@@ -166,14 +166,14 @@
// These are the low-end OOM level limits. This is appropriate for an
// HVGA or smaller phone with less than 512MB. Values are in KB.
private final int[] mOomMinFreeLow = new int[] {
- 8192, 12288, 16384,
- 24576, 28672, 32768
+ 12288, 18432, 24576,
+ 36864, 43008, 49152
};
// These are the high-end OOM level limits. This is appropriate for a
// 1280x800 or larger screen with around 1GB RAM. Values are in KB.
private final int[] mOomMinFreeHigh = new int[] {
- 49152, 61440, 73728,
- 86016, 98304, 122880
+ 73728, 92160, 110592,
+ 129024, 147456, 184320
};
// The actual OOM killer memory levels we are using.
private final int[] mOomMinFree = new int[mOomAdj.length];
@@ -231,7 +231,11 @@
Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs);
}
- final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0;
+ // We've now baked in the increase to the basic oom values above, since
+ // they seem to be useful more generally for devices that are tight on
+ // memory than just for 64 bit. This should probably have some more
+ // tuning done, so not deleting it quite yet...
+ final boolean is64bit = false; //Build.SUPPORTED_64_BIT_ABIS.length > 0;
for (int i=0; i<mOomAdj.length; i++) {
int low = mOomMinFreeLow[i];
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index adc96f7..6dcbc42 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -16,7 +16,6 @@
package com.android.server.content;
-import android.Manifest;
import android.accounts.Account;
import android.accounts.AccountAndUser;
import android.accounts.AccountManager;
@@ -481,7 +480,7 @@
mContext.registerReceiverAsUser(mAccountsUpdatedReceiver,
UserHandle.ALL,
new IntentFilter(AccountManager.LOGIN_ACCOUNTS_CHANGED_ACTION),
- Manifest.permission.ACCOUNT_MANAGER, null);
+ null, null);
}
// Pick a random second in a day to seed all periodic syncs
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index e3a25c0..2d5b99e 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -563,6 +563,12 @@
state = Display.STATE_OFF;
}
+ // Animate the screen state change unless already animating.
+ // The transition may be deferred, so after this point we will use the
+ // actual state instead of the desired one.
+ animateScreenStateChange(state, performScreenOffTransition);
+ state = mPowerState.getScreenState();
+
// Use zero brightness when screen is off.
if (state == Display.STATE_OFF) {
brightness = PowerManager.BRIGHTNESS_OFF;
@@ -636,13 +642,9 @@
mAppliedLowPower = true;
}
- // Animate the screen state change unless already animating.
- animateScreenStateChange(state, performScreenOffTransition);
-
// Animate the screen brightness when the screen is on or dozing.
// Skip the animation when the screen is off or suspended.
- final int actualState = mPowerState.getScreenState();
- if (actualState == Display.STATE_ON || actualState == Display.STATE_DOZE) {
+ if (state == Display.STATE_ON || state == Display.STATE_DOZE) {
animateScreenBrightness(brightness,
slowChange ? BRIGHTNESS_RAMP_RATE_SLOW : BRIGHTNESS_RAMP_RATE_FAST);
} else {
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 851cf17..50cb5fc 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -5960,11 +5960,19 @@
if (bp != null && !Objects.equals(bp.sourcePackage, p.info.packageName)) {
final boolean currentOwnerIsSystem = (bp.perm != null
&& isSystemApp(bp.perm.owner));
- if (isSystemApp(p.owner) && !currentOwnerIsSystem) {
- String msg = "New decl " + p.owner + " of permission "
- + p.info.name + " is system; overriding " + bp.sourcePackage;
- reportSettingsProblem(Log.WARN, msg);
- bp = null;
+ if (isSystemApp(p.owner)) {
+ if (bp.type == BasePermission.TYPE_BUILTIN && bp.perm == null) {
+ // It's a built-in permission and no owner, take ownership now
+ bp.packageSetting = pkgSetting;
+ bp.perm = p;
+ bp.uid = pkg.applicationInfo.uid;
+ bp.sourcePackage = p.info.packageName;
+ } else if (!currentOwnerIsSystem) {
+ String msg = "New decl " + p.owner + " of permission "
+ + p.info.name + " is system; overriding " + bp.sourcePackage;
+ reportSettingsProblem(Log.WARN, msg);
+ bp = null;
+ }
}
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 0c51160..30589b1 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -162,7 +162,7 @@
}
TaskStack getHomeStack() {
- if (mHomeStack == null) {
+ if (mHomeStack == null && mDisplayId == Display.DEFAULT_DISPLAY) {
Slog.e(TAG, "getHomeStack: Returning null from this=" + this);
}
return mHomeStack;
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index 89d2dc0..b4d429a 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -584,6 +584,7 @@
* @param account The complete {@link PhoneAccount}.
* @hide
*/
+ @SystemApi
public void registerPhoneAccount(PhoneAccount account) {
try {
if (isServiceConnected()) {
@@ -600,6 +601,7 @@
* @param accountHandle A {@link PhoneAccountHandle} for the {@link PhoneAccount} to unregister.
* @hide
*/
+ @SystemApi
public void unregisterPhoneAccount(PhoneAccountHandle accountHandle) {
try {
if (isServiceConnected()) {
@@ -800,6 +802,7 @@
* {@link ConnectionService#onCreateIncomingConnection}.
* @hide
*/
+ @SystemApi
public void addNewIncomingCall(PhoneAccountHandle phoneAccount, Bundle extras) {
try {
if (isServiceConnected()) {
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index 1ee390f..8e43772 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -146,6 +146,8 @@
* @hide
*/
public static final int RIL_RADIO_TECHNOLOGY_GSM = 16;
+ /** @hide */
+ public static final int RIL_RADIO_TECHNOLOGY_TD_SCDMA = 17;
/**
* Available registration states for GSM, UMTS and CDMA.
@@ -859,6 +861,7 @@
|| radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_0
|| radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_A
|| radioTechnology == RIL_RADIO_TECHNOLOGY_EVDO_B
- || radioTechnology == RIL_RADIO_TECHNOLOGY_EHRPD;
+ || radioTechnology == RIL_RADIO_TECHNOLOGY_EHRPD
+ || radioTechnology == RIL_RADIO_TECHNOLOGY_TD_SCDMA;
}
}