Merge "Fix for the missing focus in WebView form fields."
diff --git a/api/current.txt b/api/current.txt
index 5d4a3f9..1deb3ad 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -36341,6 +36341,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -36435,7 +36436,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -49722,6 +49725,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 403d5c1..48d2aba 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -39292,6 +39292,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -39386,7 +39387,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -53345,6 +53348,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
diff --git a/api/test-current.txt b/api/test-current.txt
index 8ce51f9..5dab3d11 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -36424,6 +36424,7 @@
field public static final int FD_CLOEXEC;
field public static final int FIONREAD;
field public static final int F_DUPFD;
+ field public static final int F_DUPFD_CLOEXEC;
field public static final int F_GETFD;
field public static final int F_GETFL;
field public static final int F_GETLK;
@@ -36518,7 +36519,9 @@
field public static final int NI_NUMERICSERV;
field public static final int O_ACCMODE;
field public static final int O_APPEND;
+ field public static final int O_CLOEXEC;
field public static final int O_CREAT;
+ field public static final int O_DSYNC;
field public static final int O_EXCL;
field public static final int O_NOCTTY;
field public static final int O_NOFOLLOW;
@@ -49831,6 +49834,7 @@
}
public final class InMemoryDexClassLoader extends dalvik.system.BaseDexClassLoader {
+ ctor public InMemoryDexClassLoader(java.nio.ByteBuffer[], java.lang.ClassLoader);
ctor public InMemoryDexClassLoader(java.nio.ByteBuffer, java.lang.ClassLoader);
}
diff --git a/core/java/android/database/ContentObserver.java b/core/java/android/database/ContentObserver.java
index 5f01e30..4795e97 100644
--- a/core/java/android/database/ContentObserver.java
+++ b/core/java/android/database/ContentObserver.java
@@ -193,6 +193,11 @@
*/
private void dispatchChange(boolean selfChange, Uri uri, int userId) {
if (mHandler == null) {
+ synchronized (mLock) {
+ if (mTransport == null) {
+ return;
+ }
+ }
onChange(selfChange, uri, userId);
} else {
mHandler.post(new NotificationRunnable(selfChange, uri, userId));
@@ -213,6 +218,11 @@
@Override
public void run() {
+ synchronized (mLock) {
+ if (mTransport == null) {
+ return;
+ }
+ }
ContentObserver.this.onChange(mSelfChange, mUri, mUserId);
}
}
diff --git a/core/java/android/nfc/cardemulation/ApduServiceInfo.java b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
index 7678678..218e4f2 100644
--- a/core/java/android/nfc/cardemulation/ApduServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/ApduServiceInfo.java
@@ -253,6 +253,20 @@
Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid);
}
a.recycle();
+ } else if (eventType == XmlPullParser.START_TAG &&
+ tagName.equals("aid-suffix-filter") && currentGroup != null) {
+ final TypedArray a = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.AidFilter);
+ String aid = a.getString(com.android.internal.R.styleable.AidFilter_name).
+ toUpperCase();
+ // Add wildcard char to indicate suffix
+ aid = aid.concat("#");
+ if (CardEmulation.isValidAid(aid) && !currentGroup.aids.contains(aid)) {
+ currentGroup.aids.add(aid);
+ } else {
+ Log.e(TAG, "Ignoring invalid or duplicate aid: " + aid);
+ }
+ a.recycle();
}
}
} catch (NameNotFoundException e) {
@@ -297,6 +311,17 @@
return prefixAids;
}
+ public List<String> getSubsetAids() {
+ final ArrayList<String> subsetAids = new ArrayList<String>();
+ for (AidGroup group : getAidGroups()) {
+ for (String aid : group.aids) {
+ if (aid.endsWith("#")) {
+ subsetAids.add(aid);
+ }
+ }
+ }
+ return subsetAids;
+ }
/**
* Returns the registered AID group for this category.
*/
diff --git a/core/java/android/nfc/cardemulation/CardEmulation.java b/core/java/android/nfc/cardemulation/CardEmulation.java
index b49288e..6dd7993 100644
--- a/core/java/android/nfc/cardemulation/CardEmulation.java
+++ b/core/java/android/nfc/cardemulation/CardEmulation.java
@@ -606,6 +606,8 @@
* <li>Consist of only hex characters
* <li>Additionally, we allow an asterisk at the end, to indicate
* a prefix
+ * <li>Additinally we allow an (#) at symbol at the end, to indicate
+ * a subset
* </ul>
*
* @hide
@@ -614,20 +616,20 @@
if (aid == null)
return false;
- // If a prefix AID, the total length must be odd (even # of AID chars + '*')
- if (aid.endsWith("*") && ((aid.length() % 2) == 0)) {
+ // If a prefix/subset AID, the total length must be odd (even # of AID chars + '*')
+ if ((aid.endsWith("*") || aid.endsWith("#")) && ((aid.length() % 2) == 0)) {
Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false;
}
- // If not a prefix AID, the total length must be even (even # of AID chars)
- if (!aid.endsWith("*") && ((aid.length() % 2) != 0)) {
+ // If not a prefix/subset AID, the total length must be even (even # of AID chars)
+ if ((!(aid.endsWith("*") || aid.endsWith("#"))) && ((aid.length() % 2) != 0)) {
Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false;
}
// Verify hex characters
- if (!aid.matches("[0-9A-Fa-f]{10,32}\\*?")) {
+ if (!aid.matches("[0-9A-Fa-f]{10,32}\\*?\\#?")) {
Log.e(TAG, "AID " + aid + " is not a valid AID.");
return false;
}
diff --git a/core/java/android/nfc/cardemulation/HostNfcFService.java b/core/java/android/nfc/cardemulation/HostNfcFService.java
index 27c4976..fd0d8ad 100644
--- a/core/java/android/nfc/cardemulation/HostNfcFService.java
+++ b/core/java/android/nfc/cardemulation/HostNfcFService.java
@@ -64,6 +64,7 @@
* android:description="@string/servicedesc">
* <system-code-filter android:name="4000"/>
* <nfcid2-filter android:name="02FE000000000000"/>
+ <t3tPmm-filter android:name="FFFFFFFFFFFFFFFF"/>
* </host-nfcf-service>
* </pre>
*
@@ -76,6 +77,7 @@
* <ul>
* <li>Exactly one {@link android.R.styleable#SystemCodeFilter <system-code-filter>} tag.</li>
* <li>Exactly one {@link android.R.styleable#Nfcid2Filter <nfcid2-filter>} tag.</li>
+ * <li>Zero or one {@link android.R.styleable#T3tPmmFilter <t3tPmm-filter>} tag.</li>
* </ul>
* </p>
*
diff --git a/core/java/android/nfc/cardemulation/NfcFServiceInfo.java b/core/java/android/nfc/cardemulation/NfcFServiceInfo.java
index b93eec1..4201935 100644
--- a/core/java/android/nfc/cardemulation/NfcFServiceInfo.java
+++ b/core/java/android/nfc/cardemulation/NfcFServiceInfo.java
@@ -18,9 +18,9 @@
import android.content.ComponentName;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
@@ -80,11 +80,16 @@
final int mUid;
/**
+ * LF_T3T_PMM of the service
+ */
+ final String mT3tPmm;
+
+ /**
* @hide
*/
public NfcFServiceInfo(ResolveInfo info, String description,
String systemCode, String dynamicSystemCode, String nfcid2, String dynamicNfcid2,
- int uid) {
+ int uid, String t3tPmm) {
this.mService = info;
this.mDescription = description;
this.mSystemCode = systemCode;
@@ -92,6 +97,7 @@
this.mNfcid2 = nfcid2;
this.mDynamicNfcid2 = dynamicNfcid2;
this.mUid = uid;
+ this.mT3tPmm = t3tPmm;
}
public NfcFServiceInfo(PackageManager pm, ResolveInfo info)
@@ -130,6 +136,7 @@
String systemCode = null;
String nfcid2 = null;
+ String t3tPmm = null;
final int depth = parser.getDepth();
while (((eventType = parser.next()) != XmlPullParser.END_TAG ||
@@ -160,10 +167,22 @@
nfcid2 = null;
}
a.recycle();
+ } else if (eventType == XmlPullParser.START_TAG && tagName.equals("t3tPmm-filter")
+ && t3tPmm == null) {
+ final TypedArray a = res.obtainAttributes(attrs,
+ com.android.internal.R.styleable.T3tPmmFilter);
+ t3tPmm = a.getString(
+ com.android.internal.R.styleable.T3tPmmFilter_name).toUpperCase();
+ if (t3tPmm == null) {
+ String defaultT3tPmm = "FFFFFFFFFFFFFFFF";
+ t3tPmm = defaultT3tPmm;
+ }
+ a.recycle();
}
}
mSystemCode = (systemCode == null ? "NULL" : systemCode);
mNfcid2 = (nfcid2 == null ? "NULL" : nfcid2);
+ mT3tPmm = (t3tPmm == null ? "NULL" : t3tPmm);
} catch (NameNotFoundException e) {
throw new XmlPullParserException("Unable to create context for: " + si.packageName);
} finally {
@@ -202,6 +221,10 @@
return mUid;
}
+ public String getT3tPmm() {
+ return mT3tPmm;
+ }
+
public CharSequence loadLabel(PackageManager pm) {
return mService.loadLabel(pm);
}
@@ -223,6 +246,7 @@
if (mDynamicNfcid2 != null) {
out.append(", dynamic NFCID2: " + mDynamicNfcid2);
}
+ out.append(", T3T PMM:" + mT3tPmm);
return out.toString();
}
@@ -235,7 +259,7 @@
if (!thatService.getComponent().equals(this.getComponent())) return false;
if (!thatService.mSystemCode.equalsIgnoreCase(this.mSystemCode)) return false;
if (!thatService.mNfcid2.equalsIgnoreCase(this.mNfcid2)) return false;
-
+ if (!thatService.mT3tPmm.equalsIgnoreCase(this.mT3tPmm)) return false;
return true;
}
@@ -264,6 +288,7 @@
dest.writeString(mDynamicNfcid2);
}
dest.writeInt(mUid);
+ dest.writeString(mT3tPmm);
};
public static final Parcelable.Creator<NfcFServiceInfo> CREATOR =
@@ -283,8 +308,9 @@
dynamicNfcid2 = source.readString();
}
int uid = source.readInt();
+ String t3tPmm = source.readString();
NfcFServiceInfo service = new NfcFServiceInfo(info, description,
- systemCode, dynamicSystemCode, nfcid2, dynamicNfcid2, uid);
+ systemCode, dynamicSystemCode, nfcid2, dynamicNfcid2, uid, t3tPmm);
return service;
}
@@ -299,6 +325,7 @@
" (Description: " + getDescription() + ")");
pw.println(" System Code: " + getSystemCode());
pw.println(" NFCID2: " + getNfcid2());
+ pw.println(" T3tPmm: " + getT3tPmm());
}
}
diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp
index fa9379e..8b4cc91 100644
--- a/core/jni/android_os_VintfObject.cpp
+++ b/core/jni/android_os_VintfObject.cpp
@@ -102,7 +102,10 @@
cPackageInfo[i] = cString;
env->ReleaseStringUTFChars(element, cString);
}
- int32_t status = VintfObject::CheckCompatibility(cPackageInfo);
+ std::string error;
+ int32_t status = VintfObject::CheckCompatibility(cPackageInfo, &error);
+ if (status)
+ LOG(WARNING) << "VintfObject.verify() returns " << status << ": " << error;
return status;
}
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 066a538..d51a304 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -3462,6 +3462,13 @@
<attr name="name" />
</declare-styleable>
+ <!-- Specify one or more <code>t3tPmm-filter</code> elements inside a
+ <code>host-nfcf-service</code> element to specify a LF_T3T_PMM -->
+ <declare-styleable name="T3tPmmFilter">
+ <attr name="name" />
+
+ </declare-styleable>
+
<declare-styleable name="ActionMenuItemView">
<attr name="minWidth" />
</declare-styleable>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index cac5d92..c783caa 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1317,7 +1317,7 @@
permission.
[This is only used if config_enableUpdateableTimeZoneRules and
config_timeZoneRulesUpdateTrackingEnabled are true.] -->
- <string name="config_timeZoneRulesUpdaterPackage" translateable="false"></string>
+ <string name="config_timeZoneRulesUpdaterPackage" translateable="false">com.android.timezone.updater</string>
<!-- The package of the time zone rules data application. Expected to be configured
by OEMs to reference their own priv-app APK package.
diff --git a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
index ec130e0..11d066b 100644
--- a/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
+++ b/core/tests/coretests/src/android/net/SSLSessionCacheTest.java
@@ -44,12 +44,9 @@
try {
SSLSessionCache.install(new SSLSessionCache(mock), ctx);
- clientCtx.getSession("www.foogle.com", 443);
- Mockito.verify(mock).getSessionData(Mockito.anyString(), Mockito.anyInt());
} finally {
// Restore cacheless behaviour.
SSLSessionCache.install(null, ctx);
- clientCtx.getSession("www.foogle.com", 443);
Mockito.verifyNoMoreInteractions(mock);
}
}
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index a9eb6c7..5b3b984 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -31,6 +31,7 @@
import android.net.Proxy;
import android.net.Uri;
import android.net.http.SslError;
+import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.ArrayMap;
@@ -57,6 +58,7 @@
import java.lang.InterruptedException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.util.Objects;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -286,6 +288,18 @@
return null;
}
+ private static String host(URL url) {
+ if (url == null) {
+ return null;
+ }
+ return url.getHost();
+ }
+
+ private static String sanitizeURL(URL url) {
+ // In non-Debug build, only show host to avoid leaking private info.
+ return Build.IS_DEBUGGABLE ? Objects.toString(url) : host(url);
+ }
+
private void testForCaptivePortal() {
// TODO: reuse NetworkMonitor facilities for consistent captive portal detection.
new Thread(new Runnable() {
@@ -339,6 +353,8 @@
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1,
getResources().getDisplayMetrics());
private int mPagesLoaded;
+ // the host of the page that this webview is currently loading. Can be null when undefined.
+ private String mHostname;
// If we haven't finished cleaning up the history, don't allow going back.
public boolean allowBack() {
@@ -346,8 +362,8 @@
}
@Override
- public void onPageStarted(WebView view, String url, Bitmap favicon) {
- if (url.contains(mBrowserBailOutToken)) {
+ public void onPageStarted(WebView view, String urlString, Bitmap favicon) {
+ if (urlString.contains(mBrowserBailOutToken)) {
mLaunchBrowser = true;
done(Result.WANTED_AS_IS);
return;
@@ -355,11 +371,17 @@
// The first page load is used only to cause the WebView to
// fetch the proxy settings. Don't update the URL bar, and
// don't check if the captive portal is still there.
- if (mPagesLoaded == 0) return;
+ if (mPagesLoaded == 0) {
+ return;
+ }
+ final URL url = makeURL(urlString);
+ Log.d(TAG, "onPageSarted: " + sanitizeURL(url));
+ mHostname = host(url);
// For internally generated pages, leave URL bar listing prior URL as this is the URL
// the page refers to.
- if (!url.startsWith(INTERNAL_ASSETS)) {
- getActionBar().setSubtitle(getHeaderSubtitle(url));
+ if (!urlString.startsWith(INTERNAL_ASSETS)) {
+ String subtitle = (url != null) ? getHeaderSubtitle(url) : urlString;
+ getActionBar().setSubtitle(subtitle);
}
getProgressBar().setVisibility(View.VISIBLE);
testForCaptivePortal();
@@ -401,15 +423,18 @@
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
- logMetricsEvent(MetricsEvent.CAPTIVE_PORTAL_LOGIN_ACTIVITY_SSL_ERROR);
- Log.w(TAG, "SSL error (error: " + error.getPrimaryError() + " host: " +
- // Only show host to avoid leaking private info.
- Uri.parse(error.getUrl()).getHost() + " certificate: " +
- error.getCertificate() + "); displaying SSL warning.");
- final String sslErrorPage = makeSslErrorPage();
- if (VDBG) {
- Log.d(TAG, sslErrorPage);
+ final URL url = makeURL(error.getUrl());
+ final String host = host(url);
+ Log.d(TAG, String.format("SSL error: %s, url: %s, certificate: %s",
+ error.getPrimaryError(), sanitizeURL(url), error.getCertificate()));
+ if (url == null || !Objects.equals(host, mHostname)) {
+ // Ignore ssl errors for resources coming from a different hostname than the page
+ // that we are currently loading, and only cancel the request.
+ handler.cancel();
+ return;
}
+ logMetricsEvent(MetricsEvent.CAPTIVE_PORTAL_LOGIN_ACTIVITY_SSL_ERROR);
+ final String sslErrorPage = makeSslErrorPage();
view.loadDataWithBaseURL(INTERNAL_ASSETS, sslErrorPage, "text/HTML", "UTF-8", null);
}
@@ -502,16 +527,13 @@
return getString(R.string.action_bar_title, info.getExtraInfo().replaceAll("^\"|\"$", ""));
}
- private String getHeaderSubtitle(String urlString) {
- URL url = makeURL(urlString);
- if (url == null) {
- return urlString;
- }
+ private String getHeaderSubtitle(URL url) {
+ String host = host(url);
final String https = "https";
if (https.equals(url.getProtocol())) {
- return https + "://" + url.getHost();
+ return https + "://" + host;
}
- return url.getHost();
+ return host;
}
private void logMetricsEvent(int event) {
diff --git a/services/core/Android.mk b/services/core/Android.mk
index bc97330..4e48afc 100644
--- a/services/core/Android.mk
+++ b/services/core/Android.mk
@@ -41,4 +41,16 @@
-D jack.transformations.boost-locked-region-priority.request=com.android.server.am.ActivityManagerService\#boostPriorityForLockedSection \
-D jack.transformations.boost-locked-region-priority.reset=com.android.server.am.ActivityManagerService\#resetPriorityAfterLockedSection
+LOCAL_JAR_PROCESSOR := lockedregioncodeinjection
+# Use = instead of := to delay evaluation of ${in} and ${out}
+LOCAL_JAR_PROCESSOR_ARGS = \
+ --targets \
+ "Lcom/android/server/am/ActivityManagerService;,Lcom/android/server/wm/WindowHashMap;" \
+ --pre \
+ "com/android/server/am/ActivityManagerService.boostPriorityForLockedSection,com/android/server/wm/WindowManagerService.boostPriorityForLockedSection" \
+ --post \
+ "com/android/server/am/ActivityManagerService.resetPriorityAfterLockedSection,com/android/server/wm/WindowManagerService.resetPriorityAfterLockedSection" \
+ -o ${out} \
+ -i ${in}
+
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 0a63385..ae385c1 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -1077,11 +1077,8 @@
return list.toArray(new String[list.size()]);
}
- private void maybeLogMessage(State state, int what) {
- if (DBG) {
- Log.d(TAG, state.getName() + " got " +
- sMagicDecoderRing.get(what, Integer.toString(what)));
- }
+ private void logMessage(State state, int what) {
+ mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what)));
}
private boolean upstreamWanted() {
@@ -1205,7 +1202,7 @@
class InitialState extends State {
@Override
public boolean processMessage(Message message) {
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
switch (message.what) {
case EVENT_IFACE_SERVING_STATE_ACTIVE:
TetherInterfaceStateMachine who = (TetherInterfaceStateMachine)message.obj;
@@ -1297,21 +1294,21 @@
// Find the interface with the default IPv4 route. It may be the
// interface described by linkProperties, or one of the interfaces
// stacked on top of it.
- Log.i(TAG, "Finding IPv4 upstream interface on: " + ns.linkProperties);
+ mLog.i("Finding IPv4 upstream interface on: " + ns.linkProperties);
RouteInfo ipv4Default = RouteInfo.selectBestRoute(
ns.linkProperties.getAllRoutes(), Inet4Address.ANY);
if (ipv4Default != null) {
iface = ipv4Default.getInterface();
- Log.i(TAG, "Found interface " + ipv4Default.getInterface());
+ mLog.i("Found interface " + ipv4Default.getInterface());
} else {
- Log.i(TAG, "No IPv4 upstream interface, giving up.");
+ mLog.i("No IPv4 upstream interface, giving up.");
}
}
if (iface != null) {
setDnsForwarders(ns.network, ns.linkProperties);
}
- notifyTetheredOfNewUpstreamIface(iface);
+ notifyDownstreamsOfNewUpstreamIface(iface);
if (ns != null && pertainsToCurrentUpstream(ns)) {
// If we already have NetworkState for this network examine
// it immediately, because there likely will be no second
@@ -1346,8 +1343,8 @@
}
}
- protected void notifyTetheredOfNewUpstreamIface(String ifaceName) {
- if (DBG) Log.d(TAG, "Notifying tethered with upstream=" + ifaceName);
+ protected void notifyDownstreamsOfNewUpstreamIface(String ifaceName) {
+ mLog.log("Notifying downstreams of upstream=" + ifaceName);
mCurrentUpstreamIface = ifaceName;
for (TetherInterfaceStateMachine sm : mNotifyList) {
sm.sendMessage(TetherInterfaceStateMachine.CMD_TETHER_CONNECTION_CHANGED,
@@ -1489,7 +1486,7 @@
mOffloadController.stop();
mUpstreamNetworkMonitor.stop();
mSimChange.stopListening();
- notifyTetheredOfNewUpstreamIface(null);
+ notifyDownstreamsOfNewUpstreamIface(null);
handleNewUpstreamNetworkState(null);
}
@@ -1508,7 +1505,7 @@
@Override
public boolean processMessage(Message message) {
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
boolean retValue = true;
switch (message.what) {
case EVENT_IFACE_SERVING_STATE_ACTIVE: {
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index 78487b7..20ec206 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -58,7 +58,12 @@
}
public void start() {
- if (isOffloadDisabled() || started()) return;
+ if (started()) return;
+
+ if (isOffloadDisabled()) {
+ mLog.i("tethering offload disabled");
+ return;
+ }
if (!mConfigInitialized) {
mConfigInitialized = mHwInterface.initOffloadConfig();
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index 86b2551..4bac69c 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -441,12 +441,8 @@
mLastRaParams = newParams;
}
- private void maybeLogMessage(State state, int what) {
- if (DBG) {
- Log.d(TAG, state.getName() + " got " +
- sMagicDecoderRing.get(what, Integer.toString(what)) + ", Iface = " +
- mIfaceName);
- }
+ private void logMessage(State state, int what) {
+ mLog.log(state.getName() + " got " + sMagicDecoderRing.get(what, Integer.toString(what)));
}
private void sendInterfaceState(int newInterfaceState) {
@@ -473,7 +469,7 @@
@Override
public boolean processMessage(Message message) {
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_REQUESTED:
mLastError = ConnectivityManager.TETHER_ERROR_NO_ERROR;
@@ -545,7 +541,7 @@
@Override
public boolean processMessage(Message message) {
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_UNREQUESTED:
transitionTo(mInitialState);
@@ -595,7 +591,7 @@
public boolean processMessage(Message message) {
if (super.processMessage(message)) return true;
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_REQUESTED:
mLog.e("CMD_TETHER_REQUESTED while in local-only hotspot mode.");
@@ -667,7 +663,7 @@
public boolean processMessage(Message message) {
if (super.processMessage(message)) return true;
- maybeLogMessage(this, message.what);
+ logMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_REQUESTED:
mLog.e("CMD_TETHER_REQUESTED while already tethering.");
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index 34c5283..4265741 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -40,6 +40,7 @@
import org.json.JSONObject;
import java.io.PrintWriter;
+import java.lang.Math;
import java.util.ArrayDeque;
import java.util.Calendar;
import java.util.GregorianCalendar;
@@ -718,8 +719,8 @@
}
void increment(int imp) {
- imp = imp < 0 ? 0 : imp > NUM_IMPORTANCES ? NUM_IMPORTANCES : imp;
- mCount[imp] ++;
+ imp = Math.max(0, Math.min(imp, mCount.length - 1));
+ mCount[imp]++;
}
void maybeCount(ImportanceHistogram prev) {
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index 3d60dcf6..d97ba2d 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -424,8 +424,7 @@
if (stagedDistroRulesVersion == null) {
pw.println("<None>");
} else {
- pw.println("Staged install version: "
- + stagedDistroRulesVersion.toDumpString());
+ pw.println(stagedDistroRulesVersion.toDumpString());
}
break;
case 'a':
diff --git a/services/net/java/android/net/ip/IpManager.java b/services/net/java/android/net/ip/IpManager.java
index 9de4ba4..b2930a4 100644
--- a/services/net/java/android/net/ip/IpManager.java
+++ b/services/net/java/android/net/ip/IpManager.java
@@ -1064,7 +1064,7 @@
mNwService.setIPv6AddrGenMode(mInterfaceName, mConfiguration.mIPv6AddrGenMode);
} catch (ServiceSpecificException e) {
if (e.errorCode != OsConstants.EOPNOTSUPP) {
- throw e;
+ logError("Unable to set IPv6 addrgen mode: %s", e);
}
}
}
diff --git a/telephony/java/android/telephony/MbmsStreamingManager.java b/telephony/java/android/telephony/MbmsStreamingManager.java
index fb3d502..8cc447e 100644
--- a/telephony/java/android/telephony/MbmsStreamingManager.java
+++ b/telephony/java/android/telephony/MbmsStreamingManager.java
@@ -142,7 +142,8 @@
* Starts streaming a requested service, reporting status to the indicated listener.
* Returns an object used to control that stream. The stream may not be ready for consumption
* immediately upon return from this method -- wait until the streaming state has been
- * reported via {@link android.telephony.mbms.StreamingServiceCallback#streamStateUpdated(int)}
+ * reported via
+ * {@link android.telephony.mbms.StreamingServiceCallback#streamStateUpdated(int, int)}
*
* May throw an {@link MbmsException} containing any of the following error codes:
* {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}
diff --git a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
index 94c80f4..0952fbe 100755
--- a/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IStreamingServiceCallback.aidl
@@ -21,7 +21,7 @@
*/
oneway interface IStreamingServiceCallback {
void error(int errorCode, String message);
- void streamStateUpdated(int state);
+ void streamStateUpdated(int state, int reason);
void mediaDescriptionUpdated();
void broadcastSignalStrengthUpdated(int signalStrength);
void streamMethodUpdated(int methodType);
diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java
index 85731a1..475c93a 100644
--- a/telephony/java/android/telephony/mbms/StreamingService.java
+++ b/telephony/java/android/telephony/mbms/StreamingService.java
@@ -16,12 +16,16 @@
package android.telephony.mbms;
+import android.annotation.IntDef;
import android.net.Uri;
import android.os.DeadObjectException;
import android.os.RemoteException;
import android.telephony.mbms.vendor.IMbmsStreamingService;
import android.util.Log;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* @hide
*/
@@ -30,12 +34,31 @@
/**
* The state of a stream, reported via {@link StreamingServiceCallback#streamStateUpdated}
+ * @hide
*/
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({STATE_STOPPED, STATE_STARTED, STATE_STALLED})
+ public @interface StreamingState {}
public final static int STATE_STOPPED = 1;
public final static int STATE_STARTED = 2;
public final static int STATE_STALLED = 3;
/**
+ * The reason for a stream state change, reported via
+ * {@link StreamingServiceCallback#streamStateUpdated}
+ * @hide
+ */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT,
+ REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE})
+ public @interface StreamingStateChangeReason {}
+ public static final int REASON_BY_USER_REQUEST = 1;
+ public static final int REASON_END_OF_SESSION = 2;
+ public static final int REASON_FREQUENCY_CONFLICT = 3;
+ public static final int REASON_OUT_OF_MEMORY = 4;
+ public static final int REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE = 5;
+
+ /**
* The method of transmission currently used for a stream,
* reported via {@link StreamingServiceCallback#streamMethodUpdated}
*/
diff --git a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
index fdfb188..cab9c23 100644
--- a/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/StreamingServiceCallback.java
@@ -31,6 +31,7 @@
*/
public static final int SIGNAL_STRENGTH_UNAVAILABLE = -1;
+ @Override
public void error(int errorCode, String message) {
// default implementation empty
}
@@ -41,7 +42,9 @@
* See {@link StreamingService#STATE_STOPPED}, {@link StreamingService#STATE_STARTED}
* and {@link StreamingService#STATE_STALLED}.
*/
- public void streamStateUpdated(int state) {
+ @Override
+ public void streamStateUpdated(@StreamingService.StreamingState int state,
+ @StreamingService.StreamingStateChangeReason int reason) {
// default implementation empty
}
@@ -55,6 +58,7 @@
* This may be called when a looping stream hits the end or
* when parameters have changed to account for time drift.
*/
+ @Override
public void mediaDescriptionUpdated() {
// default implementation empty
}
@@ -69,6 +73,7 @@
* {@link #SIGNAL_STRENGTH_UNAVAILABLE} if broadcast is not available
* for this service due to timing, geography or popularity.
*/
+ @Override
public void broadcastSignalStrengthUpdated(int signalStrength) {
// default implementation empty
}
@@ -89,6 +94,7 @@
* See {@link StreamingService#BROADCAST_METHOD} and
* {@link StreamingService#UNICAST_METHOD}
*/
+ @Override
public void streamMethodUpdated(int methodType) {
// default implementation empty
}
diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
index b6cf628..c97e754 100644
--- a/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
+++ b/telephony/java/android/telephony/mbms/vendor/MbmsStreamingServiceBase.java
@@ -72,7 +72,7 @@
/**
* Starts streaming on a particular service. This method may perform asynchronous work. When
* the middleware is ready to send bits to the frontend, it should inform the app via
- * {@link IStreamingServiceCallback#streamStateUpdated(int)}.
+ * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*
@@ -107,7 +107,7 @@
/**
* Stop streaming the stream identified by {@code serviceId}. Notification of the resulting
* stream state change should be reported to the app via
- * {@link IStreamingServiceCallback#streamStateUpdated(int)}.
+ * {@link IStreamingServiceCallback#streamStateUpdated(int, int)}.
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*