diff options
| -rw-r--r-- | core/java/android/view/RoundScrollbarRenderer.java | 12 | ||||
| -rw-r--r-- | core/java/android/view/View.java | 35 | ||||
| -rw-r--r-- | services/net/java/android/net/apf/ApfFilter.java | 11 | ||||
| -rw-r--r-- | telephony/java/android/telephony/Rlog.java | 8 |
4 files changed, 60 insertions, 6 deletions
diff --git a/core/java/android/view/RoundScrollbarRenderer.java b/core/java/android/view/RoundScrollbarRenderer.java index f258458a9b15..b77be8c00e69 100644 --- a/core/java/android/view/RoundScrollbarRenderer.java +++ b/core/java/android/view/RoundScrollbarRenderer.java @@ -20,6 +20,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; +import android.graphics.Rect; /** * Helper class for drawing round scroll bars on round Wear devices. @@ -53,7 +54,7 @@ class RoundScrollbarRenderer { mParent = parent; } - public void drawRoundScrollbars(Canvas canvas, float alpha) { + public void drawRoundScrollbars(Canvas canvas, float alpha, Rect bounds) { if (alpha == 0) { return; } @@ -83,10 +84,11 @@ class RoundScrollbarRenderer { // Draw the track and the scroll bar. mRect.set( - 0 + thumbWidth / 2, - 0 + thumbWidth / 2, - mParent.getWidth() - thumbWidth / 2, - mParent.getHeight() - thumbWidth / 2); + bounds.left - thumbWidth / 2, + bounds.top, + bounds.right - thumbWidth / 2, + bounds.bottom); + canvas.drawArc(mRect, -SCROLLBAR_ANGLE_RANGE / 2, SCROLLBAR_ANGLE_RANGE, false, mTrackPaint); canvas.drawArc(mRect, startAngle, sweepAngle, false, mThumbPaint); diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1fa182050c95..d93f8af2165d 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -14770,6 +14770,37 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private void getVerticalScrollBarBounds(Rect bounds) { + if (mRoundScrollbarRenderer == null) { + getStraightVerticalScrollBarBounds(bounds); + } else { + getRoundVerticalScrollBarBounds(bounds); + } + } + + private void getRoundVerticalScrollBarBounds(Rect bounds) { + final int inside = (mViewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0; + int verticalScrollbarPosition = mVerticalScrollbarPosition; + if (verticalScrollbarPosition == SCROLLBAR_POSITION_DEFAULT) { + verticalScrollbarPosition = isLayoutRtl() ? + SCROLLBAR_POSITION_LEFT : SCROLLBAR_POSITION_RIGHT; + } + final int width = mRight - mLeft; + final int height = mBottom - mTop; + switch (verticalScrollbarPosition) { + default: + case SCROLLBAR_POSITION_RIGHT: + bounds.left = mScrollX - (mUserPaddingRight & inside); + break; + case SCROLLBAR_POSITION_LEFT: + bounds.left = mScrollX + (mUserPaddingLeft & inside); + break; + } + bounds.top = mScrollY + (mPaddingTop & inside); + bounds.right = bounds.left + width; + bounds.bottom = mScrollY + height - (mUserPaddingBottom & inside); + } + + private void getStraightVerticalScrollBarBounds(Rect bounds) { final int inside = (mViewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0; final int size = getVerticalScrollbarWidth(); int verticalScrollbarPosition = mVerticalScrollbarPosition; @@ -14848,8 +14879,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // Fork out the scroll bar drawing for round wearable devices. if (mRoundScrollbarRenderer != null) { if (drawVerticalScrollBar) { + final Rect bounds = cache.mScrollBarBounds; + getVerticalScrollBarBounds(bounds); mRoundScrollbarRenderer.drawRoundScrollbars( - canvas, (float) cache.scrollBar.getAlpha() / 255f); + canvas, (float) cache.scrollBar.getAlpha() / 255f, bounds); if (invalidate) { invalidate(); } diff --git a/services/net/java/android/net/apf/ApfFilter.java b/services/net/java/android/net/apf/ApfFilter.java index 0f812acf67bd..4bb0902f2ec0 100644 --- a/services/net/java/android/net/apf/ApfFilter.java +++ b/services/net/java/android/net/apf/ApfFilter.java @@ -192,6 +192,7 @@ public class ApfFilter { private static final int ICMP6_TYPE_OFFSET = ETH_HEADER_LEN + IPV6_HEADER_LEN; private static final int ICMP6_NEIGHBOR_ANNOUNCEMENT = 136; + private static final int ICMP6_ROUTER_ADVERTISEMENT = 134; // NOTE: this must be added to the IPv4 header length in IPV4_HEADER_SIZE_MEMORY_SLOT private static final int UDP_DESTINATION_PORT_OFFSET = ETH_HEADER_LEN + 2; @@ -452,6 +453,16 @@ public class ApfFilter { Ra(byte[] packet, int length) { mPacket = ByteBuffer.wrap(Arrays.copyOf(packet, length)); mLastSeen = curTime(); + + // Sanity check packet in case a packet arrives before we attach RA filter + // to our packet socket. b/29586253 + if (getUint16(mPacket, ETH_ETHERTYPE_OFFSET) != ETH_P_IPV6 || + uint8(mPacket.get(IPV6_NEXT_HEADER_OFFSET)) != IPPROTO_ICMPV6 || + uint8(mPacket.get(ICMP6_TYPE_OFFSET)) != ICMP6_ROUTER_ADVERTISEMENT) { + throw new IllegalArgumentException("Not an ICMP6 router advertisement"); + } + + RaEvent.Builder builder = new RaEvent.Builder(); // Ignore the checksum. diff --git a/telephony/java/android/telephony/Rlog.java b/telephony/java/android/telephony/Rlog.java index 2a7f7af11434..b4f400fe852c 100644 --- a/telephony/java/android/telephony/Rlog.java +++ b/telephony/java/android/telephony/Rlog.java @@ -85,5 +85,13 @@ public final class Rlog { return Log.isLoggable(tag, level); } + /** + * Redact personally identifiable information for production users. + * If log tag is loggable in verbose mode, return the original string, otherwise return XXX. + */ + public static String pii(String tag, Object pii) { + return (isLoggable(tag, Log.VERBOSE) ? String.valueOf(pii) : "XXX"); + } + } |