Merge "Provide a public API for View#computeFitSystemWindows" into lmp-dev
diff --git a/api/current.txt b/api/current.txt
index db80bc4..69f55fb 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -8905,7 +8905,7 @@
field public static final java.lang.String FEATURE_LOCATION = "android.hardware.location";
field public static final java.lang.String FEATURE_LOCATION_GPS = "android.hardware.location.gps";
field public static final java.lang.String FEATURE_LOCATION_NETWORK = "android.hardware.location.network";
- field public static final java.lang.String FEATURE_MANAGED_PROFILES = "android.software.managed_profiles";
+ field public static final java.lang.String FEATURE_MANAGED_USERS = "android.software.managed_users";
field public static final java.lang.String FEATURE_MICROPHONE = "android.hardware.microphone";
field public static final java.lang.String FEATURE_NFC = "android.hardware.nfc";
field public static final java.lang.String FEATURE_NFC_HOST_CARD_EMULATION = "android.hardware.nfc.hce";
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 3a39900..b4877de 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -122,6 +122,7 @@
import libcore.io.DropBox;
import libcore.io.EventLogger;
import libcore.io.IoUtils;
+import libcore.net.event.NetworkEventDispatcher;
import dalvik.system.CloseGuard;
import dalvik.system.VMDebug;
@@ -827,6 +828,9 @@
public void clearDnsCache() {
// a non-standard API to get this to libcore
InetAddress.clearDnsCache();
+ // Allow libcore to perform the necessary actions as it sees fit upon a network
+ // configuration change.
+ NetworkEventDispatcher.getInstance().onNetworkConfigurationChanged();
}
public void setHttpProxy(String host, String port, String exclList, Uri pacFileUrl) {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 8f3d90f..3fc9b67 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -23,6 +23,7 @@
import android.annotation.SystemApi;
import android.app.PackageDeleteObserver;
import android.app.PackageInstallObserver;
+import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -1518,10 +1519,17 @@
/**
* Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
- * The device supports managed profiles for enterprise users.
+ * The device supports creating secondary users and managed profiles via
+ * {@link DevicePolicyManager}.
*/
@SdkConstant(SdkConstantType.FEATURE)
- public static final String FEATURE_MANAGED_PROFILES = "android.software.managed_profiles";
+ public static final String FEATURE_MANAGED_USERS = "android.software.managed_users";
+
+ /**
+ * @hide
+ * TODO: Remove after dependencies updated b/17392243
+ */
+ public static final String FEATURE_MANAGED_PROFILES = "android.software.managed_users";
/**
* Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}:
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 7390e2b..746ead2 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -873,7 +873,7 @@
int capturePreambleMs = in.readInt();
boolean triggerInData = in.readByte() == 1;
AudioFormat captureFormat = null;
- if (triggerInData) {
+ if (in.readByte() == 1) {
int sampleRate = in.readInt();
int encoding = in.readInt();
int channelMask = in.readInt();
@@ -899,7 +899,8 @@
dest.writeInt(captureSession);
dest.writeInt(captureDelayMs);
dest.writeInt(capturePreambleMs);
- if (triggerInData && (captureFormat != null)) {
+ dest.writeByte((byte) (triggerInData ? 1 : 0));
+ if (captureFormat != null) {
dest.writeByte((byte)1);
dest.writeInt(captureFormat.getSampleRate());
dest.writeInt(captureFormat.getEncoding());
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index 40bb6ec..b677888 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -690,11 +690,18 @@
for (int i = 0; i < startValuesListCount; ++i) {
TransitionValues start = startValuesList.get(i);
TransitionValues end = endValuesList.get(i);
- // Only bother trying to animate with valid values that differ between start/end
- boolean isInvalidStart = start != null && !isValidTarget(start.view);
- boolean isInvalidEnd = end != null && !isValidTarget(end.view);
- boolean isChanged = start != end && (start == null || !start.equals(end));
- if (isChanged && !isInvalidStart && !isInvalidEnd) {
+ if (start != null && !start.targetedTransitions.contains(this)) {
+ start = null;
+ }
+ if (end != null && !end.targetedTransitions.contains(this)) {
+ end = null;
+ }
+ if (start == null && end == null) {
+ continue;
+ }
+ // Only bother trying to animate with values that differ between start/end
+ boolean isChanged = start == null || end == null || areValuesChanged(start, end);
+ if (isChanged) {
if (DBG) {
View view = (end != null) ? end.view : start.view;
Log.d(LOG_TAG, " differing start/end values for view " + view);
@@ -1415,11 +1422,12 @@
} else {
captureEndValues(values);
}
+ values.targetedTransitions.add(this);
capturePropagationValues(values);
if (start) {
- addViewValues(mStartValues, view, values, true);
+ addViewValues(mStartValues, view, values);
} else {
- addViewValues(mEndValues, view, values, true);
+ addViewValues(mEndValues, view, values);
}
}
}
@@ -1432,6 +1440,7 @@
} else {
captureEndValues(values);
}
+ values.targetedTransitions.add(this);
capturePropagationValues(values);
if (start) {
mStartValues.viewValues.put(view, values);
@@ -1460,7 +1469,7 @@
}
static void addViewValues(TransitionValuesMaps transitionValuesMaps,
- View view, TransitionValues transitionValues, boolean setTransientState) {
+ View view, TransitionValues transitionValues) {
transitionValuesMaps.viewValues.put(view, transitionValues);
int id = view.getId();
if (id >= 0) {
@@ -1489,15 +1498,11 @@
// Duplicate item IDs: cannot match by item ID.
View alreadyMatched = transitionValuesMaps.itemIdValues.get(itemId);
if (alreadyMatched != null) {
- if (setTransientState) {
- alreadyMatched.setHasTransientState(false);
- }
+ alreadyMatched.setHasTransientState(false);
transitionValuesMaps.itemIdValues.put(itemId, null);
}
} else {
- if (setTransientState) {
- view.setHasTransientState(true);
- }
+ view.setHasTransientState(true);
transitionValuesMaps.itemIdValues.put(itemId, view);
}
}
@@ -1562,11 +1567,12 @@
} else {
captureEndValues(values);
}
+ values.targetedTransitions.add(this);
capturePropagationValues(values);
if (start) {
- addViewValues(mStartValues, view, values, true);
+ addViewValues(mStartValues, view, values);
} else {
- addViewValues(mEndValues, view, values, true);
+ addViewValues(mEndValues, view, values);
}
}
if (view instanceof ViewGroup) {
@@ -1731,8 +1737,10 @@
if (oldInfo != null && oldInfo.view != null && oldInfo.windowId == windowId) {
TransitionValues oldValues = oldInfo.values;
View oldView = oldInfo.view;
- TransitionValues newValues = getMatchedTransitionValues(oldView, true);
- boolean cancel = oldInfo.transition.areValuesChanged(oldValues, newValues);
+ TransitionValues startValues = getTransitionValues(oldView, true);
+ TransitionValues endValues = getMatchedTransitionValues(oldView, true);
+ boolean cancel = (startValues != null || endValues != null) &&
+ oldInfo.transition.areValuesChanged(oldValues, endValues);
if (cancel) {
if (anim.isRunning() || anim.isStarted()) {
if (DBG) {
@@ -1784,7 +1792,17 @@
String key) {
Object oldValue = oldValues.values.get(key);
Object newValue = newValues.values.get(key);
- boolean changed = (oldValue != null && newValue != null && !oldValue.equals(newValue));
+ boolean changed;
+ if (oldValue == null && newValue == null) {
+ // both are null
+ changed = false;
+ } else if (oldValue == null || newValue == null) {
+ // one is null
+ changed = true;
+ } else {
+ // neither is null
+ changed = !oldValue.equals(newValue);
+ }
if (DBG && changed) {
Log.d(LOG_TAG, "Transition.playTransition: " +
"oldValue != newValue for " + key +
diff --git a/core/java/android/transition/TransitionSet.java b/core/java/android/transition/TransitionSet.java
index 669621eb3..09d2c69 100644
--- a/core/java/android/transition/TransitionSet.java
+++ b/core/java/android/transition/TransitionSet.java
@@ -388,8 +388,6 @@
protected void createAnimators(ViewGroup sceneRoot, TransitionValuesMaps startValues,
TransitionValuesMaps endValues, ArrayList<TransitionValues> startValuesList,
ArrayList<TransitionValues> endValuesList) {
- startValues = removeExcludes(startValues);
- endValues = removeExcludes(endValues);
long startDelay = getStartDelay();
int numTransitions = mTransitions.size();
for (int i = 0; i < numTransitions; i++) {
@@ -409,24 +407,6 @@
}
}
- private TransitionValuesMaps removeExcludes(TransitionValuesMaps values) {
- if (mTargetIds.isEmpty() && mTargetIdExcludes == null && mTargetTypeExcludes == null
- && mTargetNames == null && mTargetTypes == null
- && mTargetExcludes == null && mTargetNameExcludes == null
- && mTargets.isEmpty()) {
- return values;
- }
- TransitionValuesMaps included = new TransitionValuesMaps();
- int numValues = values.viewValues.size();
- for (int i = 0; i < numValues; i++) {
- View view = values.viewValues.keyAt(i);
- if (isValidTarget(view)) {
- addViewValues(included, view, values.viewValues.valueAt(i), false);
- }
- }
- return included;
- }
-
/**
* @hide
*/
@@ -470,6 +450,7 @@
for (Transition childTransition : mTransitions) {
if (childTransition.isValidTarget(transitionValues.view)) {
childTransition.captureStartValues(transitionValues);
+ transitionValues.targetedTransitions.add(childTransition);
}
}
}
@@ -481,6 +462,7 @@
for (Transition childTransition : mTransitions) {
if (childTransition.isValidTarget(transitionValues.view)) {
childTransition.captureEndValues(transitionValues);
+ transitionValues.targetedTransitions.add(childTransition);
}
}
}
diff --git a/core/java/android/transition/TransitionValues.java b/core/java/android/transition/TransitionValues.java
index 8989f89..11f2962 100644
--- a/core/java/android/transition/TransitionValues.java
+++ b/core/java/android/transition/TransitionValues.java
@@ -20,6 +20,7 @@
import android.view.View;
import android.view.ViewGroup;
+import java.util.ArrayList;
import java.util.Map;
/**
@@ -52,6 +53,11 @@
*/
public final Map<String, Object> values = new ArrayMap<String, Object>();
+ /**
+ * The Transitions that targeted this view.
+ */
+ final ArrayList<Transition> targetedTransitions = new ArrayList<Transition>();
+
@Override
public boolean equals(Object other) {
if (other instanceof TransitionValues) {
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 3907fc5..7599bf4 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -339,6 +339,22 @@
capability can provide power savings when wifi needs to be always kept on. -->
<bool translatable="false" name="config_wifi_background_scan_support">false</bool>
+ <!-- Boolean indicating we re-try re-associating once upon disconnection and RSSI is high failure -->
+ <bool translatable="true" name="config_wifi_enable_disconnection_debounce">true</bool>
+
+ <!-- Boolean indicating autojoin will prefer 5GHz and choose 5GHz BSSIDs -->
+ <bool translatable="true" name="config_wifi_enable_5GHz_preference">true</bool>
+
+ <!-- Integer specifying the basic autojoin parameters -->
+ <integer translatable="false" name="config_wifi_framework_5GHz_preference_boost_threshold">-65</integer>
+ <integer translatable="false" name="config_wifi_framework_5GHz_preference_boost_factor">5</integer>
+ <integer translatable="false" name="config_wifi_framework_current_association_hysteresis_high">16</integer>
+ <integer translatable="false" name="config_wifi_framework_current_association_hysteresis_low">10</integer>
+ <integer translatable="false" name="config_wifi_framework_5GHz_preference_penalty_threshold">-75</integer>
+ <integer translatable="false" name="config_wifi_framework_5GHz_preference_penalty_factor">2</integer>
+
+
+
<!-- Integer indicating wpa_supplicant scan interval in milliseconds -->
<integer translatable="false" name="config_wifi_supplicant_scan_interval">15000</integer>
@@ -351,9 +367,24 @@
point on the move. A value of 0 means no periodic scans will be used in the framework. -->
<integer translatable="false" name="config_wifi_framework_scan_interval">300000</integer>
- <!-- Integer indicating associated scan interval in milliseconds -->
+ <!-- Integer indicating associated partial scan interval in milliseconds -->
<integer translatable="false" name="config_wifi_framework_associated_scan_interval">10000</integer>
+ <!-- Integer indicating associated full scan backoff, representing a fraction: xx/8 -->
+ <integer translatable="false" name="config_wifi_framework_associated_full_scan_backoff">12</integer>
+
+ <!-- Integer indicating associated full scan max interval in milliseconds -->
+ <integer translatable="false" name="config_wifi_framework_associated_full_scan_max_interval">300000</integer>
+
+ <!-- Integer indicating associated full scan max total dwell time in milliseconds -->
+ <integer translatable="false" name="config_wifi_framework_associated_full_scan_max_total_dwell_time">500</integer>
+
+ <!-- Integer indicating associated full scan max num active channels -->
+ <integer translatable="false" name="config_wifi_framework_associated_partial_scan_max_num_active_channels">6</integer>
+
+ <!-- Integer indicating associated full scan max num passive channels -->
+ <integer translatable="false" name="config_wifi_framework_associated_partial_scan_max_num_passive_channels">3</integer>
+
<!-- Boolean indicating associated scan are allowed -->
<bool translatable="false" name="config_wifi_framework_enable_associated_autojoin_scan">true</bool>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 117e235..d69a0f2 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -297,6 +297,21 @@
<java-symbol type="bool" name="config_wifi_framework_enable_associated_autojoin_scan" />
<java-symbol type="bool" name="config_wifi_framework_enable_associated_network_selection" />
<java-symbol type="bool" name="config_wifi_only_link_same_credential_configurations" />
+ <java-symbol type="bool" name="config_wifi_enable_disconnection_debounce" />
+ <java-symbol type="bool" name="config_wifi_enable_5GHz_preference" />
+ <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_boost_threshold" />
+ <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_boost_factor" />
+ <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_penalty_threshold" />
+ <java-symbol type="integer" name="config_wifi_framework_current_association_hysteresis_high" />
+ <java-symbol type="integer" name="config_wifi_framework_current_association_hysteresis_low" />
+ <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_penalty_threshold" />
+ <java-symbol type="integer" name="config_wifi_framework_5GHz_preference_penalty_factor" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_scan_interval" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_full_scan_backoff" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_full_scan_max_interval" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_full_scan_max_total_dwell_time" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_partial_scan_max_num_active_channels" />
+ <java-symbol type="integer" name="config_wifi_framework_associated_partial_scan_max_num_passive_channels" />
<java-symbol type="integer" name="config_bluetooth_max_advertisers" />
<java-symbol type="integer" name="config_bluetooth_max_scan_filters" />
<java-symbol type="integer" name="config_cursorWindowSize" />
@@ -315,7 +330,6 @@
<java-symbol type="integer" name="config_shortPressOnPowerBehavior" />
<java-symbol type="integer" name="config_toastDefaultGravity" />
<java-symbol type="integer" name="config_wifi_framework_scan_interval" />
- <java-symbol type="integer" name="config_wifi_framework_associated_scan_interval" />
<java-symbol type="integer" name="config_wifi_supplicant_scan_interval" />
<java-symbol type="integer" name="config_wifi_scan_interval_p2p_connected" />
<java-symbol type="integer" name="db_connection_pool_size" />
diff --git a/docs/html/preview/tv/ui/recommendations.jd b/docs/html/preview/tv/ui/recommendations.jd
index 2c78064..a2ff55c 100644
--- a/docs/html/preview/tv/ui/recommendations.jd
+++ b/docs/html/preview/tv/ui/recommendations.jd
@@ -9,7 +9,6 @@
<li><a href="#service">Create a Recommendations Service</a></li>
<li><a href="#build">Build Recommendations</a></li>
<li><a href="#run-service">Run Recommendations Service</a></li>
- <li><a href="#DesignLandscapeLayouts">Design Landscape Layouts</a></li>
</ol>
</div>
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 2916d6c..cd6297b 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -825,7 +825,7 @@
@Override
public int getOpacity() {
- return (mAlpha == 255 && mGradientState.mOpaqueOverBounds) ?
+ return (mAlpha == 255 && mGradientState.mOpaqueOverBounds && isOpaqueForState()) ?
PixelFormat.OPAQUE : PixelFormat.TRANSLUCENT;
}
@@ -1414,12 +1414,25 @@
return mGradientState;
}
+ private boolean isOpaqueForState() {
+ if (mGradientState.mStrokeWidth >= 0 && mStrokePaint != null
+ && !isOpaque(mStrokePaint.getColor())) {
+ return false;
+ }
+
+ if (!isOpaque(mFillPaint.getColor())) {
+ return false;
+ }
+
+ return true;
+ }
+
@Override
public void getOutline(Outline outline) {
final GradientState st = mGradientState;
final Rect bounds = getBounds();
// only report non-zero alpha if shape being drawn is opaque
- outline.setAlpha(st.mOpaqueOverShape ? (mAlpha / 255.0f) : 0.0f);
+ outline.setAlpha(st.mOpaqueOverShape && isOpaqueForState() ? (mAlpha / 255.0f) : 0.0f);
switch (st.mShape) {
case RECTANGLE:
@@ -1617,19 +1630,6 @@
mOpaqueOverBounds = false;
mOpaqueOverShape = false;
- // First test opacity of all colors
- if (mStrokeWidth > 0) {
- if (mStrokeColorStateList != null) {
- if (!mStrokeColorStateList.isOpaque()) {
- return;
- }
- }
- }
-
- if (mColorStateList != null && !mColorStateList.isOpaque()) {
- return;
- }
-
if (mColors != null) {
for (int i = 0; i < mColors.length; i++) {
if (!isOpaque(mColors[i])) {
@@ -1651,10 +1651,6 @@
&& mRadiusArray == null;
}
- private static boolean isOpaque(int color) {
- return ((color >> 24) & 0xff) == 0xff;
- }
-
public void setStroke(
int width, ColorStateList colorStateList, float dashWidth, float dashGap) {
mStrokeWidth = width;
@@ -1690,6 +1686,10 @@
}
}
+ static boolean isOpaque(int color) {
+ return ((color >> 24) & 0xff) == 0xff;
+ }
+
/**
* Creates a new themed GradientDrawable based on the specified constant state.
* <p>
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index dd87699..bb6b1c9 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -42,7 +42,6 @@
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.util.ArrayList;
@@ -195,6 +194,7 @@
private VectorDrawableState mVectorState;
private PorterDuffColorFilter mTintFilter;
+ private ColorFilter mColorFilter;
private boolean mMutated;
@@ -216,7 +216,6 @@
}
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
- state.setColorFilter(mTintFilter);
}
@Override
@@ -255,14 +254,18 @@
canvas.scale(-1.0f, 1.0f);
}
+ // Color filters always override tint filters.
+ final ColorFilter colorFilter = mColorFilter == null ? mTintFilter : mColorFilter;
+
if (!mAllowCaching) {
// AnimatedVectorDrawable
if (!mVectorState.hasTranslucentRoot()) {
- mVectorState.mVPathRenderer.draw(canvas, bounds.width(), bounds.height());
+ mVectorState.mVPathRenderer.draw(
+ canvas, bounds.width(), bounds.height(), colorFilter);
} else {
mVectorState.createCachedBitmapIfNeeded(bounds);
mVectorState.updateCachedBitmap(bounds);
- mVectorState.drawCachedBitmapWithRootAlpha(canvas);
+ mVectorState.drawCachedBitmapWithRootAlpha(canvas, colorFilter);
}
} else {
// Static Vector Drawable case.
@@ -271,7 +274,7 @@
mVectorState.updateCachedBitmap(bounds);
mVectorState.updateCacheStates();
}
- mVectorState.drawCachedBitmapWithRootAlpha(canvas);
+ mVectorState.drawCachedBitmapWithRootAlpha(canvas, colorFilter);
}
canvas.restoreToCount(saveCount);
@@ -292,18 +295,7 @@
@Override
public void setColorFilter(ColorFilter colorFilter) {
- final VectorDrawableState state = mVectorState;
- if (colorFilter != null) {
- // Color filter overrides tint.
- mTintFilter = null;
- } else if (state.mTint != null && state.mTintMode != null) {
- // Restore the tint filter, if we need one.
- final int color = state.mTint.getColorForState(getState(), Color.TRANSPARENT);
- mTintFilter = new PorterDuffColorFilter(color, state.mTintMode);
- colorFilter = mTintFilter;
- }
-
- state.setColorFilter(colorFilter);
+ mColorFilter = colorFilter;
invalidateSelf();
}
@@ -313,7 +305,6 @@
if (state.mTint != tint) {
state.mTint = tint;
mTintFilter = updateTintFilter(mTintFilter, tint, state.mTintMode);
- state.setColorFilter(mTintFilter);
invalidateSelf();
}
}
@@ -324,7 +315,6 @@
if (state.mTintMode != tintMode) {
state.mTintMode = tintMode;
mTintFilter = updateTintFilter(mTintFilter, state.mTint, tintMode);
- state.setColorFilter(mTintFilter);
invalidateSelf();
}
}
@@ -340,7 +330,6 @@
final VectorDrawableState state = mVectorState;
if (state.mTint != null && state.mTintMode != null) {
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
- state.setColorFilter(mTintFilter);
invalidateSelf();
return true;
}
@@ -384,7 +373,6 @@
}
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
- state.setColorFilter(mTintFilter);
}
final VPathRenderer path = state.mVPathRenderer;
@@ -464,7 +452,6 @@
inflateInternal(res, parser, attrs, theme);
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
- state.setColorFilter(mTintFilter);
}
private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
@@ -657,6 +644,9 @@
boolean mCachedAutoMirrored;
boolean mCacheDirty;
+ /** Temporary paint object used to draw cached bitmaps. */
+ Paint mTempPaint;
+
// Deep copy for mutate() or implicitly mutate.
public VectorDrawableState(VectorDrawableState copy) {
if (copy != null) {
@@ -669,20 +659,16 @@
if (copy.mVPathRenderer.mStrokePaint != null) {
mVPathRenderer.mStrokePaint = new Paint(copy.mVPathRenderer.mStrokePaint);
}
- if (copy.mVPathRenderer.mColorFilter != null) {
- mVPathRenderer.mColorFilter = copy.mVPathRenderer.mColorFilter;
- }
mTint = copy.mTint;
mTintMode = copy.mTintMode;
mAutoMirrored = copy.mAutoMirrored;
}
}
- // TODO: Support colorFilter here.
- public void drawCachedBitmapWithRootAlpha(Canvas canvas) {
- Paint alphaPaint = getRootAlphaPaint();
+ public void drawCachedBitmapWithRootAlpha(Canvas canvas, ColorFilter filter) {
// The bitmap's size is the same as the bounds.
- canvas.drawBitmap(mCachedBitmap, 0, 0, alphaPaint);
+ final Paint p = getPaint(filter);
+ canvas.drawBitmap(mCachedBitmap, 0, 0, p);
}
public boolean hasTranslucentRoot() {
@@ -692,20 +678,23 @@
/**
* @return null when there is no need for alpha paint.
*/
- public Paint getRootAlphaPaint() {
- Paint paint = null;
- boolean needsAlphaPaint = hasTranslucentRoot();
- if (needsAlphaPaint) {
- paint = new Paint();
- paint.setAlpha(mVPathRenderer.getRootAlpha());
+ public Paint getPaint(ColorFilter filter) {
+ if (!hasTranslucentRoot() && filter == null) {
+ return null;
}
- return paint;
+
+ if (mTempPaint == null) {
+ mTempPaint = new Paint();
+ }
+ mTempPaint.setAlpha(mVPathRenderer.getRootAlpha());
+ mTempPaint.setColorFilter(filter);
+ return mTempPaint;
}
public void updateCachedBitmap(Rect bounds) {
mCachedBitmap.eraseColor(Color.TRANSPARENT);
Canvas tmpCanvas = new Canvas(mCachedBitmap);
- mVPathRenderer.draw(tmpCanvas, bounds.width(), bounds.height());
+ mVPathRenderer.draw(tmpCanvas, bounds.width(), bounds.height(), null);
}
public void createCachedBitmapIfNeeded(Rect bounds) {
@@ -754,12 +743,6 @@
|| (mVPathRenderer != null && mVPathRenderer.canApplyTheme());
}
- public void setColorFilter(ColorFilter colorFilter) {
- if (mVPathRenderer != null && mVPathRenderer.setColorFilter(colorFilter)) {
- mCacheDirty = true;
- }
- }
-
public VectorDrawableState() {
mVPathRenderer = new VPathRenderer();
}
@@ -807,7 +790,6 @@
private Paint mStrokePaint;
private Paint mFillPaint;
- private ColorFilter mColorFilter;
private PathMeasure mPathMeasure;
/////////////////////////////////////////////////////
@@ -918,25 +900,8 @@
}
}
- public boolean setColorFilter(ColorFilter colorFilter) {
- if (colorFilter != mColorFilter
- || (colorFilter != null && !colorFilter.equals(mColorFilter))) {
- mColorFilter = colorFilter;
-
- if (mFillPaint != null) {
- mFillPaint.setColorFilter(colorFilter);
- }
-
- if (mStrokePaint != null) {
- mStrokePaint.setColorFilter(colorFilter);
- }
- return true;
- }
- return false;
- }
-
private void drawGroupTree(VGroup currentGroup, Matrix currentMatrix,
- Canvas canvas, int w, int h) {
+ Canvas canvas, int w, int h, ColorFilter filter) {
// Calculate current group's matrix by preConcat the parent's and
// and the current one on the top of the stack.
// Basically the Mfinal = Mviewport * M0 * M1 * M2;
@@ -951,20 +916,21 @@
if (child instanceof VGroup) {
VGroup childGroup = (VGroup) child;
drawGroupTree(childGroup, currentGroup.mStackedMatrix,
- canvas, w, h);
+ canvas, w, h, filter);
} else if (child instanceof VPath) {
VPath childPath = (VPath) child;
- drawPath(currentGroup, childPath, canvas, w, h);
+ drawPath(currentGroup, childPath, canvas, w, h, filter);
}
}
}
- public void draw(Canvas canvas, int w, int h) {
+ public void draw(Canvas canvas, int w, int h, ColorFilter filter) {
// Travese the tree in pre-order to draw.
- drawGroupTree(mRootGroup, IDENTITY_MATRIX, canvas, w, h);
+ drawGroupTree(mRootGroup, IDENTITY_MATRIX, canvas, w, h, filter);
}
- private void drawPath(VGroup vGroup, VPath vPath, Canvas canvas, int w, int h) {
+ private void drawPath(VGroup vGroup, VPath vPath, Canvas canvas, int w, int h,
+ ColorFilter filter) {
final float scaleX = w / mViewportWidth;
final float scaleY = h / mViewportHeight;
final float minScale = Math.min(scaleX, scaleY);
@@ -1008,19 +974,19 @@
if (fullPath.mFillColor != Color.TRANSPARENT) {
if (mFillPaint == null) {
mFillPaint = new Paint();
- mFillPaint.setColorFilter(mColorFilter);
mFillPaint.setStyle(Paint.Style.FILL);
mFillPaint.setAntiAlias(true);
}
- mFillPaint.setColor(applyAlpha(fullPath.mFillColor,
- fullPath.mFillAlpha));
- canvas.drawPath(mRenderPath, mFillPaint);
+
+ final Paint fillPaint = mFillPaint;
+ fillPaint.setColor(applyAlpha(fullPath.mFillColor, fullPath.mFillAlpha));
+ fillPaint.setColorFilter(filter);
+ canvas.drawPath(mRenderPath, fillPaint);
}
if (fullPath.mStrokeColor != Color.TRANSPARENT) {
if (mStrokePaint == null) {
mStrokePaint = new Paint();
- mStrokePaint.setColorFilter(mColorFilter);
mStrokePaint.setStyle(Paint.Style.STROKE);
mStrokePaint.setAntiAlias(true);
}
@@ -1035,9 +1001,8 @@
}
strokePaint.setStrokeMiter(fullPath.mStrokeMiterlimit);
-
- strokePaint.setColor(applyAlpha(fullPath.mStrokeColor,
- fullPath.mStrokeAlpha));
+ strokePaint.setColor(applyAlpha(fullPath.mStrokeColor, fullPath.mStrokeAlpha));
+ strokePaint.setColorFilter(filter);
strokePaint.setStrokeWidth(fullPath.mStrokeWidth * minScale);
canvas.drawPath(mRenderPath, strokePaint);
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index d7ede34..56fa546 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -33,7 +33,35 @@
/**
* A class to encapsulate a collection of attributes describing information about an audio
- * player or recorder.
+ * stream.
+ * <p><code>AudioAttributes</code> supersede the notion of stream types (see for instance
+ * {@link AudioManager#STREAM_MUSIC} or {@link AudioManager#STREAM_ALARM}) for defining the
+ * behavior of audio playback. Attributes allow an application to specify more information than is
+ * conveyed in a stream type by allowing the application to define:
+ * <ul>
+ * <li>usage: "why" you are playing a sound, what is this sound used for. This is achieved with
+ * the "usage" information. Examples of usage are {@link #USAGE_MEDIA} and {@link #USAGE_ALARM}.
+ * These two examples are the closest to stream types, but more detailed use cases are
+ * available. Usage information is more expressive than a stream type, and allows certain
+ * platforms or routing policies to use this information for more refined volume or routing
+ * decisions. Usage is the most important information to supply in <code>AudioAttributes</code>
+ * and it is recommended to build any instance with this information supplied, see
+ * {@link AudioAttributes.Builder} for exceptions.</li>
+ * <li>content type: "what" you are playing. The content type expresses the general category of
+ * the content. This information is optional. But in case it is known (for instance
+ * {@link #CONTENT_TYPE_MOVIE} for a movie streaming service or {@link #CONTENT_TYPE_MUSIC} for
+ * a music playback application) this information might be used by the audio framework to
+ * selectively configure some audio post-processing blocks.</li>
+ * <li>flags: "how" is playback to be affected, see the flag definitions for the specific playback
+ * behaviors they control. </li>
+ * </ul>
+ * <p><code>AudioAttributes</code> are used for example in one of the {@link AudioTrack}
+ * constructors (see {@link AudioTrack#AudioTrack(AudioAttributes, AudioFormat, int, int, int)}),
+ * to configure a {@link MediaPlayer}
+ * (see {@link MediaPlayer#setAudioAttributes(AudioAttributes)} or a
+ * {@link android.app.Notification} (see {@link android.app.Notification#audioAttributes}). An
+ * <code>AudioAttributes</code> instance is built through its builder,
+ * {@link AudioAttributes.Builder}.
*/
public final class AudioAttributes implements Parcelable {
private final static String TAG = "AudioAttributes";
@@ -237,6 +265,22 @@
/**
* Builder class for {@link AudioAttributes} objects.
+ * <p> Here is an example where <code>Builder</code> is used to define the
+ * {@link AudioAttributes} to be used by a new <code>AudioTrack</code> instance:
+ *
+ * <pre class="prettyprint">
+ * AudioTrack myTrack = new AudioTrack(
+ * new AudioAttributes.Builder()
+ * .setUsage(AudioAttributes.USAGE_MEDIA)
+ * .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
+ * .build(),
+ * myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);
+ * </pre>
+ *
+ * <p>By default all types of information (usage, content type, flags) conveyed by an
+ * <code>AudioAttributes</code> instance are set to "unknown". Unknown information will be
+ * interpreted as a default value that is dependent on the context of use, for instance a
+ * {@link MediaPlayer} will use a default usage of {@link AudioAttributes#USAGE_MEDIA}.
*/
public static class Builder {
private int mUsage = USAGE_UNKNOWN;
@@ -247,6 +291,11 @@
/**
* Constructs a new Builder with the defaults.
+ * By default, usage and content type are respectively {@link AudioAttributes#USAGE_UNKNOWN}
+ * and {@link AudioAttributes#CONTENT_TYPE_UNKNOWN}, and flags are 0. It is recommended to
+ * configure the usage (with {@link #setUsage(int)}) or deriving attributes from a legacy
+ * stream type (with {@link #setLegacyStreamType(int)}) before calling {@link #build()}
+ * to override any default playback behavior in terms of routing and volume management.
*/
public Builder() {
}
@@ -373,7 +422,9 @@
}
/**
- * Adds attributes inferred from the legacy stream types.
+ * Sets attributes as inferred from the legacy stream types.
+ * Use this method when building an {@link AudioAttributes} instance to initialize some of
+ * the attributes by information derived from a legacy stream type.
* @param streamType one of {@link AudioManager#STREAM_VOICE_CALL},
* {@link AudioManager#STREAM_SYSTEM}, {@link AudioManager#STREAM_RING},
* {@link AudioManager#STREAM_MUSIC}, {@link AudioManager#STREAM_ALARM},
@@ -432,7 +483,6 @@
/**
* @hide
- * CANDIDATE FOR PUBLIC API
* Sets the capture preset.
* Use this audio attributes configuration method when building an {@link AudioRecord}
* instance with {@link AudioRecord#AudioRecord(AudioAttributes, AudioFormat, int)}.
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index 704e4a1..54ebc6a 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -120,7 +120,9 @@
// Attributes from XML meta data.
private String mSetupActivity;
private String mSettingsActivity;
+
private int mType = TYPE_TUNER;
+ private HdmiDeviceInfo mHdmiDeviceInfo;
private String mLabel;
private Uri mIconUri;
private boolean mIsConnectedToHdmiSwitch;
@@ -159,7 +161,7 @@
* ResolveInfo, and HdmiDeviceInfo.
*
* @param service The ResolveInfo returned from the package manager about this TV input service.
- * @param deviceInfo The HdmiDeviceInfo for a HDMI CEC logical device.
+ * @param hdmiDeviceInfo The HdmiDeviceInfo for a HDMI CEC logical device.
* @param parentId The ID of this TV input's parent input. {@code null} if none exists.
* @param iconUri The {@link android.net.Uri} to load the icon image. See
* {@link android.content.ContentResolver#openInputStream}. If it is {@code null},
@@ -170,12 +172,14 @@
*/
@SystemApi
public static TvInputInfo createTvInputInfo(Context context, ResolveInfo service,
- HdmiDeviceInfo deviceInfo, String parentId, String label, Uri iconUri)
+ HdmiDeviceInfo hdmiDeviceInfo, String parentId, String label, Uri iconUri)
throws XmlPullParserException, IOException {
- boolean isConnectedToHdmiSwitch = (deviceInfo.getPhysicalAddress() & 0x0FFF) != 0;
- return createTvInputInfo(context, service, generateInputIdForHdmiDevice(
+ boolean isConnectedToHdmiSwitch = (hdmiDeviceInfo.getPhysicalAddress() & 0x0FFF) != 0;
+ TvInputInfo input = createTvInputInfo(context, service, generateInputIdForHdmiDevice(
new ComponentName(service.serviceInfo.packageName, service.serviceInfo.name),
- deviceInfo), parentId, TYPE_HDMI, label, iconUri, isConnectedToHdmiSwitch);
+ hdmiDeviceInfo), parentId, TYPE_HDMI, label, iconUri, isConnectedToHdmiSwitch);
+ input.mHdmiDeviceInfo = hdmiDeviceInfo;
+ return input;
}
/**
@@ -345,15 +349,27 @@
}
/**
- * Returns the type of this TV input service.
+ * Returns the type of this TV input.
*/
public int getType() {
return mType;
}
/**
- * Returns {@code true} if this TV input is pass-though which does not have any real channels
- * in TvProvider. {@code false} otherwise.
+ * Returns the HDMI device information of this TV input.
+ * @hide
+ */
+ @SystemApi
+ public HdmiDeviceInfo getHdmiDeviceInfo() {
+ if (mType == TYPE_HDMI) {
+ return mHdmiDeviceInfo;
+ }
+ return null;
+ }
+
+ /**
+ * Returns {@code true} if this TV input is pass-though which does not have any real channels in
+ * TvProvider. {@code false} otherwise.
*
* @see TvContract#buildChannelUriForPassthroughInput(String)
*/
@@ -480,6 +496,7 @@
dest.writeString(mSetupActivity);
dest.writeString(mSettingsActivity);
dest.writeInt(mType);
+ dest.writeParcelable(mHdmiDeviceInfo, flags);
dest.writeParcelable(mIconUri, flags);
dest.writeString(mLabel);
dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
@@ -552,6 +569,7 @@
mSetupActivity = in.readString();
mSettingsActivity = in.readString();
mType = in.readInt();
+ mHdmiDeviceInfo = in.readParcelable(null);
mIconUri = in.readParcelable(null);
mLabel = in.readString();
mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false;
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index d0447bc..9df21a2 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -170,6 +170,7 @@
mRunningJob = null;
mParams = null;
mExecutionStartTimeElapsed = 0L;
+ removeOpTimeOut();
return false;
}
try {
@@ -299,7 +300,7 @@
public void handleMessage(Message message) {
switch (message.what) {
case MSG_SERVICE_BOUND:
- removeMessages(MSG_TIMEOUT);
+ removeOpTimeOut();
handleServiceBoundH();
break;
case MSG_CALLBACK:
@@ -307,7 +308,7 @@
Slog.d(TAG, "MSG_CALLBACK of : " + mRunningJob + " v:" +
(mVerb >= 0 ? VERB_STRINGS[mVerb] : "[invalid]"));
}
- removeMessages(MSG_TIMEOUT);
+ removeOpTimeOut();
if (mVerb == VERB_STARTING) {
final boolean workOngoing = message.arg2 == 1;
@@ -498,7 +499,7 @@
* VERB_STOPPING.
*/
private void sendStopMessageH() {
- mCallbackHandler.removeMessages(MSG_TIMEOUT);
+ removeOpTimeOut();
if (mVerb != VERB_EXECUTING) {
Slog.e(TAG, "Sending onStopJob for a job that isn't started. " + mRunningJob);
closeAndCleanupJobH(false /* reschedule */);
@@ -540,7 +541,7 @@
service = null;
mAvailable = true;
}
- removeMessages(MSG_TIMEOUT);
+ removeOpTimeOut();
removeMessages(MSG_CALLBACK);
removeMessages(MSG_SERVICE_BOUND);
removeMessages(MSG_CANCEL);
@@ -555,7 +556,7 @@
* on with life.
*/
private void scheduleOpTimeOut() {
- mCallbackHandler.removeMessages(MSG_TIMEOUT);
+ removeOpTimeOut();
final long timeoutMillis = (mVerb == VERB_EXECUTING) ?
EXECUTING_TIMESLICE_MILLIS : OP_TIMEOUT_MILLIS;
@@ -568,4 +569,9 @@
mCallbackHandler.sendMessageDelayed(m, timeoutMillis);
mTimeoutElapsed = SystemClock.elapsedRealtime() + timeoutMillis;
}
+
+
+ private void removeOpTimeOut() {
+ mCallbackHandler.removeMessages(MSG_TIMEOUT);
+ }
}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index aeaff71..9ece434 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -186,6 +186,8 @@
public static final int DISABLED_AUTH_FAILURE = 3;
/** @hide */
public static final int DISABLED_ASSOCIATION_REJECT = 4;
+ /** @hide */
+ public static final int DISABLED_BY_WIFI_MANAGER = 5;
/**
* The ID number that the supplicant uses to identify this
@@ -438,11 +440,7 @@
/** @hide
* 5GHz band is prefered low over 2.4 if the 5GHz RSSI is higher than this threshold */
- public static int A_BAND_PREFERENCE_RSSI_THRESHOLD_LOW = -65;
-
- /** @hide
- * 5GHz band is prefered hard over 2.4 if the 5GHz RSSI is higher than this threshold */
- public static int A_BAND_PREFERENCE_RSSI_THRESHOLD = -55;
+ public static int A_BAND_PREFERENCE_RSSI_THRESHOLD = -65;
/** @hide
* 5GHz band is penalized if the 5GHz RSSI is lower than this threshold **/
@@ -457,6 +455,12 @@
***/
public static int HOME_NETWORK_RSSI_BOOST = 5;
+ /** @hide
+ * RSSI boost for configuration which use autoJoinUseAggressiveJoinAttemptThreshold
+ * To be more aggressive when initially attempting to auto join
+ */
+ public static int MAX_INITIAL_AUTO_JOIN_RSSI_BOOST = 8;
+
/**
* @hide
* A summary of the RSSI and Band status for that configuration
@@ -594,6 +598,11 @@
/** @hide */
public static final int AUTO_JOIN_DISABLED_ON_AUTH_FAILURE = 128;
/** @hide */
+ public static final int AUTO_JOIN_DISABLED_NO_CREDENTIALS = 160;
+ /** @hide */
+ public static final int AUTO_JOIN_DISABLED_USER_ACTION = 161;
+
+ /** @hide */
public static final int AUTO_JOIN_DELETED = 200;
/**
@@ -664,6 +673,18 @@
/**
* @hide
+ * Indicate that we didn't auto-join because rssi was too low
+ */
+ public boolean autoJoinBailedDueToLowRssi;
+
+ /**
+ * @hide
+ * AutoJoin even though RSSI is 10dB below threshold
+ */
+ public int autoJoinUseAggressiveJoinAttemptThreshold;
+
+ /**
+ * @hide
* Number of time the scorer overrode a the priority based choice, when comparing two
* WifiConfigurations, note that since comparing WifiConfiguration happens very often
* potentially at every scan, this number might become very large, even on an idle
@@ -881,11 +902,10 @@
if (this.autoJoinStatus > 0) {
sbuf.append(" autoJoinStatus ").append(this.numConnectionFailures).append("\n");
}
- if (this.didSelfAdd || this.selfAdded) {
- if (this.didSelfAdd) sbuf.append(" didSelfAdd");
- if (this.selfAdded) sbuf.append(" selfAdded");
- if (this.noInternetAccess) sbuf.append(" noInternetAccess");
-
+ if (this.didSelfAdd) sbuf.append(" didSelfAdd");
+ if (this.selfAdded) sbuf.append(" selfAdded");
+ if (this.noInternetAccess) sbuf.append(" noInternetAccess");
+ if (this.didSelfAdd || this.selfAdded || this.noInternetAccess) {
sbuf.append("\n");
}
sbuf.append(" KeyMgmt:");
@@ -950,21 +970,41 @@
if (this.preSharedKey != null) {
sbuf.append('*');
}
-
+ sbuf.append("\nEnterprise config:\n");
sbuf.append(enterpriseConfig);
- sbuf.append('\n');
+ sbuf.append("IP config:\n");
sbuf.append(mIpConfiguration.toString());
- if (this.creatorUid != 0) sbuf.append("uid=" + Integer.toString(creatorUid));
- if (this.autoJoinBSSID != null) sbuf.append("autoJoinBSSID=" + autoJoinBSSID);
+ if (this.creatorUid != 0) sbuf.append(" uid=" + Integer.toString(creatorUid));
+ if (this.autoJoinBSSID != null) sbuf.append(" autoJoinBSSID=" + autoJoinBSSID);
+ long now_ms = System.currentTimeMillis();
if (this.blackListTimestamp != 0) {
- long now_ms = System.currentTimeMillis();
+ sbuf.append('\n');
long diff = now_ms - this.blackListTimestamp;
if (diff <= 0) {
- sbuf.append("blackListed since <incorrect>");
+ sbuf.append(" blackListed since <incorrect>");
} else {
- sbuf.append("blackListed since ").append(Long.toString(diff/1000)).append( "sec");
+ sbuf.append(" blackListed: ").append(Long.toString(diff/1000)).append( "sec");
+ }
+ }
+ if (this.lastConnected != 0) {
+ sbuf.append('\n');
+ long diff = now_ms - this.lastConnected;
+ if (diff <= 0) {
+ sbuf.append("lastConnected since <incorrect>");
+ } else {
+ sbuf.append("lastConnected: ").append(Long.toString(diff/1000)).append( "sec");
+ }
+ }
+ if (this.lastConnectionFailure != 0) {
+ sbuf.append('\n');
+ long diff = now_ms - this.lastConnectionFailure;
+ if (diff <= 0) {
+ sbuf.append("lastConnectionFailure since <incorrect>");
+ } else {
+ sbuf.append("lastConnectionFailure: ").append(Long.toString(diff/1000));
+ sbuf.append( "sec");
}
}
sbuf.append('\n');
@@ -984,15 +1024,29 @@
}
}
}
- sbuf.append(" triggeredLow: ").append(numUserTriggeredWifiDisableLowRSSI);
- sbuf.append(" triggeredBad: ").append(numUserTriggeredWifiDisableBadRSSI);
- sbuf.append(" triggeredNotHigh: ").append(numUserTriggeredWifiDisableNotHighRSSI);
+ if (this.scanResultCache != null) {
+ sbuf.append("scan cache: ");
+ for(ScanResult result : this.scanResultCache.values()) {
+ sbuf.append("{").append(result.BSSID).append(",").append(result.frequency);
+ sbuf.append(",").append(result.level).append(",st=");
+ sbuf.append(result.autoJoinStatus).append("} ");
+ }
+ sbuf.append('\n');
+ }
+ sbuf.append("triggeredLow: ").append(this.numUserTriggeredWifiDisableLowRSSI);
+ sbuf.append(" triggeredBad: ").append(this.numUserTriggeredWifiDisableBadRSSI);
+ sbuf.append(" triggeredNotHigh: ").append(this.numUserTriggeredWifiDisableNotHighRSSI);
sbuf.append('\n');
- sbuf.append(" ticksLow: ").append(numTicksAtLowRSSI);
- sbuf.append(" ticksBad: ").append(numTicksAtBadRSSI);
- sbuf.append(" ticksNotHigh: ").append(numTicksAtNotHighRSSI);
+ sbuf.append("ticksLow: ").append(this.numTicksAtLowRSSI);
+ sbuf.append(" ticksBad: ").append(this.numTicksAtBadRSSI);
+ sbuf.append(" ticksNotHigh: ").append(this.numTicksAtNotHighRSSI);
sbuf.append('\n');
- sbuf.append(" triggeredJoin: ").append(numUserTriggeredJoinAttempts);
+ sbuf.append("triggeredJoin: ").append(this.numUserTriggeredJoinAttempts);
+ sbuf.append('\n');
+ sbuf.append("autoJoinBailedDueToLowRssi: ").append(this.autoJoinBailedDueToLowRssi);
+ sbuf.append('\n');
+ sbuf.append("autoJoinUseAggressiveJoinAttemptThreshold: ");
+ sbuf.append(this.autoJoinUseAggressiveJoinAttemptThreshold);
sbuf.append('\n');
return sbuf.toString();
@@ -1310,6 +1364,9 @@
numTicksAtNotHighRSSI = source.numTicksAtNotHighRSSI;
numUserTriggeredJoinAttempts = source.numUserTriggeredJoinAttempts;
autoJoinBSSID = source.autoJoinBSSID;
+ autoJoinUseAggressiveJoinAttemptThreshold
+ = source.autoJoinUseAggressiveJoinAttemptThreshold;
+ autoJoinBailedDueToLowRssi = source.autoJoinBailedDueToLowRssi;
}
}
@@ -1370,7 +1427,8 @@
dest.writeInt(numTicksAtBadRSSI);
dest.writeInt(numTicksAtNotHighRSSI);
dest.writeInt(numUserTriggeredJoinAttempts);
-
+ dest.writeInt(autoJoinUseAggressiveJoinAttemptThreshold);
+ dest.writeInt(autoJoinBailedDueToLowRssi ? 1 : 0);
}
/** Implement the Parcelable interface {@hide} */
@@ -1427,6 +1485,8 @@
config.numTicksAtBadRSSI = in.readInt();
config.numTicksAtNotHighRSSI = in.readInt();
config.numUserTriggeredJoinAttempts = in.readInt();
+ config.autoJoinUseAggressiveJoinAttemptThreshold = in.readInt();
+ config.autoJoinBailedDueToLowRssi = in.readInt() != 0;
return config;
}