Merge "Fix android:focusableInTouchMode support" into jb-dev
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 0c47069..9a8d802 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -907,6 +907,8 @@
* </pre>
*/
public static class Builder {
+ private static final int MAX_ACTION_BUTTONS = 2;
+
private Context mContext;
private long mWhen;
@@ -938,7 +940,7 @@
private ArrayList<String> mKindList = new ArrayList<String>(1);
private Bundle mExtras;
private int mPriority;
- private ArrayList<Action> mActions = new ArrayList<Action>(3);
+ private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS);
private boolean mUseChronometer;
private Style mStyle;
@@ -1460,7 +1462,7 @@
if (N > 0) {
// Log.d("Notification", "has actions: " + mContentText);
big.setViewVisibility(R.id.actions, View.VISIBLE);
- if (N>3) N=3;
+ if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS;
big.removeAllViews(R.id.actions);
for (int i=0; i<N; i++) {
final RemoteViews button = generateActionButton(mActions.get(i));
@@ -1500,18 +1502,14 @@
}
private RemoteViews generateActionButton(Action action) {
- RemoteViews button = new RemoteViews(mContext.getPackageName(), R.layout.notification_action);
+ final boolean tombstone = (action.actionIntent == null);
+ RemoteViews button = new RemoteViews(mContext.getPackageName(),
+ tombstone ? R.layout.notification_action_tombstone
+ : R.layout.notification_action);
button.setTextViewCompoundDrawables(R.id.action0, action.icon, 0, 0, 0);
button.setTextViewText(R.id.action0, action.title);
- if (action.actionIntent != null) {
+ if (!tombstone) {
button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
- //button.setBoolean(R.id.action0, "setEnabled", true);
- button.setFloat(R.id.button0, "setAlpha", 1.0f);
- button.setBoolean(R.id.button0, "setClickable", true);
- } else {
- //button.setBoolean(R.id.action0, "setEnabled", false);
- button.setFloat(R.id.button0, "setAlpha", 0.5f);
- button.setBoolean(R.id.button0, "setClickable", false);
}
button.setContentDescription(R.id.action0, action.title);
return button;
@@ -1639,15 +1637,21 @@
if (mBuilder.mSubText == null) {
contentView.setViewVisibility(R.id.line3, View.GONE);
+ } else {
+ contentView.setViewVisibility(R.id.line3, View.VISIBLE);
}
if (mBigContentTitle != null && mBigContentTitle.equals("")) {
contentView.setViewVisibility(R.id.line1, View.GONE);
+ } else {
+ contentView.setViewVisibility(R.id.line1, View.VISIBLE);
}
if (mSummaryText != null && !mSummaryText.equals("")) {
contentView.setViewVisibility(R.id.overflow_title, View.VISIBLE);
contentView.setTextViewText(R.id.overflow_title, mSummaryText);
+ } else {
+ contentView.setViewVisibility(R.id.overflow_title, View.GONE);
}
return contentView;
@@ -1854,6 +1858,8 @@
if (str != null && !str.equals("")) {
contentView.setViewVisibility(rowIds[i], View.VISIBLE);
contentView.setTextViewText(rowIds[i], str);
+ } else {
+ contentView.setViewVisibility(rowIds[i], View.GONE);
}
i++;
}
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index 7a8c1fb..3aa5181 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -320,6 +320,10 @@
* It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast,
* and outside of the handler.
* This method will only work when called from the uid that owns the AppWidget provider.
+ *
+ * <p>
+ * The total Bitmap memory used by the RemoteViews object cannot exceed that required to
+ * fill the screen once, ie. (screen width x screen height x 4) bytes.
*
* @param appWidgetIds The AppWidget instances for which to set the RemoteViews.
* @param views The RemoteViews object to show.
@@ -385,6 +389,10 @@
* and outside of the handler.
* This method will only work when called from the uid that owns the AppWidget provider.
*
+ * <p>
+ * The total Bitmap memory used by the RemoteViews object cannot exceed that required to
+ * fill the screen once, ie. (screen width x screen height x 4) bytes.
+ *
* @param appWidgetId The AppWidget instance for which to set the RemoteViews.
* @param views The RemoteViews object to show.
*/
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index a4fcd41..53bb3c6 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -6159,7 +6159,8 @@
ViewRootImpl viewRootImpl = getViewRootImpl();
if (viewRootImpl != null) {
View focusHost = viewRootImpl.getAccessibilityFocusedHost();
- if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) {
+ if (focusHost != null && focusHost != this
+ && ViewRootImpl.isViewDescendantOf(focusHost, this)) {
viewRootImpl.setAccessibilityFocusedHost(null);
}
}
@@ -6637,7 +6638,7 @@
private boolean nextAtGranularity(int granularity) {
CharSequence text = getIterableTextForAccessibility();
- if (text != null && text.length() > 0) {
+ if (text == null || text.length() == 0) {
return false;
}
TextSegmentIterator iterator = getIteratorForGranularity(granularity);
@@ -6661,7 +6662,7 @@
private boolean previousAtGranularity(int granularity) {
CharSequence text = getIterableTextForAccessibility();
- if (text != null && text.length() > 0) {
+ if (text == null || text.length() == 0) {
return false;
}
TextSegmentIterator iterator = getIteratorForGranularity(granularity);
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index 56c4bd8..51c957a 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -1445,7 +1445,8 @@
/**
* Returns an estimate of the bitmap heap memory usage for this RemoteViews.
*/
- int estimateMemoryUsage() {
+ /** @hide */
+ public int estimateMemoryUsage() {
return mMemoryUsageCounter.getMemoryUsage();
}
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index 60cd895..deb09e3 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -79,18 +79,17 @@
private static final int SHOW_ANIMATION_DURATION = 200;
private static final int SHOW_ANIMATION_DELAY = 0;
private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f;
- private static final long RING_EXPAND_DURATION = 200;
private static final float TARGET_INITIAL_POSITION_SCALE = 0.8f;
private TimeInterpolator mChevronAnimationInterpolator = Ease.Quad.easeOut;
private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>();
private ArrayList<TargetDrawable> mChevronDrawables = new ArrayList<TargetDrawable>();
- private ArrayList<Tweener> mChevronAnimations = new ArrayList<Tweener>();
- private ArrayList<Tweener> mTargetAnimations = new ArrayList<Tweener>();
+ private AnimationBundle mChevronAnimations = new AnimationBundle();
+ private AnimationBundle mTargetAnimations = new AnimationBundle();
+ private AnimationBundle mHandleAnimations = new AnimationBundle();
private ArrayList<String> mTargetDescriptions;
private ArrayList<String> mDirectionDescriptions;
- private Tweener mHandleAnimation;
private OnTriggerListener mOnTriggerListener;
private TargetDrawable mHandleDrawable;
private TargetDrawable mOuterRing;
@@ -114,6 +113,33 @@
private boolean mDragging;
private int mNewTargetResources;
+ private class AnimationBundle extends ArrayList<Tweener> {
+ private static final long serialVersionUID = 0xA84D78726F127468L;
+ private boolean mSuspended;
+
+ public void start() {
+ if (mSuspended) return; // ignore attempts to start animations
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.start();
+ }
+ }
+
+ public void stop() {
+ final int count = size();
+ for (int i = 0; i < count; i++) {
+ Tweener anim = get(i);
+ anim.animator.end();
+ }
+ clear();
+ }
+
+ public void setSuspended(boolean suspend) {
+ mSuspended = suspend;
+ }
+ };
+
private AnimatorListener mResetListener = new AnimatorListenerAdapter() {
public void onAnimationEnd(Animator animator) {
switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY);
@@ -239,6 +265,7 @@
a.recycle();
setVibrateEnabled(mVibrationDuration > 0);
+ assignDefaultsIfNeeded();
}
private void dump() {
@@ -254,6 +281,21 @@
Log.v(TAG, "VerticalOffset = " + mVerticalOffset);
}
+ public void suspendAnimations() {
+ mChevronAnimations.setSuspended(true);
+ mTargetAnimations.setSuspended(true);
+ mHandleAnimations.setSuspended(true);
+ }
+
+ public void resumeAnimations() {
+ mChevronAnimations.setSuspended(false);
+ mTargetAnimations.setSuspended(false);
+ mHandleAnimations.setSuspended(false);
+ mChevronAnimations.start();
+ mTargetAnimations.start();
+ mHandleAnimations.start();
+ }
+
@Override
protected int getSuggestedMinimumWidth() {
// View should be large enough to contain the background + handle and
@@ -340,6 +382,8 @@
final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0;
+ mChevronAnimations.stop();
+
// Add an animation for all chevron drawables. There are mFeedbackCount drawables
// in each direction and directionCount directions.
for (int direction = 0; direction < directionCount; direction++) {
@@ -367,24 +411,21 @@
"onUpdate", mUpdateListener));
}
}
+ mChevronAnimations.start();
}
private void stopChevronAnimation() {
- for (Tweener anim : mChevronAnimations) {
- anim.animator.end();
- }
- mChevronAnimations.clear();
+ mChevronAnimations.stop();
}
private void stopHandleAnimation() {
- if (mHandleAnimation != null) {
- mHandleAnimation.animator.end();
- mHandleAnimation = null;
- }
+ mHandleAnimations.stop();
}
private void deactivateTargets() {
- for (TargetDrawable target : mTargetDrawables) {
+ final int count = mTargetDrawables.size();
+ for (int i = 0; i < count; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
target.setState(TargetDrawable.STATE_INACTIVE);
}
mActiveTarget = -1;
@@ -445,14 +486,16 @@
// Animate handle back to the center based on current state.
int delay = targetHit ? RETURN_TO_HOME_DELAY : 0;
int duration = targetHit ? 0 : RETURN_TO_HOME_DURATION;
- mHandleAnimation = Tweener.to(mHandleDrawable, duration,
+ mHandleAnimations.stop();
+ mHandleAnimations.add(Tweener.to(mHandleDrawable, duration,
"ease", Ease.Quart.easeOut,
"delay", delay,
"alpha", 1.0f,
"x", 0,
"y", 0,
"onUpdate", mUpdateListener,
- "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener);
+ "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener));
+ mHandleAnimations.start();
setGrabbedState(OnTriggerListener.NO_HANDLE);
}
@@ -467,9 +510,7 @@
}
private void hideTargets(boolean animate) {
- if (mTargetAnimations.size() > 0) {
- stopTargetAnimation();
- }
+ mTargetAnimations.stop();
// Note: these animations should complete at the same time so that we can swap out
// the target assets asynchronously from the setTargetResources() call.
mAnimatingTargets = animate;
@@ -497,12 +538,12 @@
"delay", delay,
"onUpdate", mUpdateListener,
"onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
}
private void showTargets(boolean animate) {
- if (mTargetAnimations.size() > 0) {
- stopTargetAnimation();
- }
+ mTargetAnimations.stop();
mAnimatingTargets = animate;
final int delay = animate ? SHOW_ANIMATION_DELAY : 0;
final int length = mTargetDrawables.size();
@@ -521,7 +562,7 @@
}
mOuterRing.setScaleX(0.5f);
mOuterRing.setScaleY(0.5f);
- mTargetAnimations.add(Tweener.to(mOuterRing, animate ? RING_EXPAND_DURATION : 0,
+ mTargetAnimations.add(Tweener.to(mOuterRing, animate ? SHOW_ANIMATION_DURATION : 0,
"ease", Ease.Cubic.easeOut,
"alpha", 1.0f,
"scaleX", 1.0f,
@@ -529,13 +570,12 @@
"delay", delay,
"onUpdate", mUpdateListener,
"onComplete", mTargetUpdateListener));
+
+ mTargetAnimations.start();
}
private void stopTargetAnimation() {
- for (Tweener anim : mTargetAnimations) {
- anim.animator.end();
- }
- mTargetAnimations.clear();
+ mTargetAnimations.stop();
}
private void vibrate() {
@@ -658,7 +698,6 @@
*
*/
public void ping() {
- stopChevronAnimation();
startChevronAnimation();
}
@@ -721,7 +760,7 @@
}
private void handleDown(MotionEvent event) {
- if (!trySwitchToFirstTouchState(event)) {
+ if (!trySwitchToFirstTouchState(event.getX(), event.getY())) {
mDragging = false;
stopTargetAnimation();
ping();
@@ -747,14 +786,11 @@
}
private void handleMove(MotionEvent event) {
- if (!mDragging) {
- trySwitchToFirstTouchState(event);
- return;
- }
-
int activeTarget = -1;
final int historySize = event.getHistorySize();
- final boolean singleTarget = mTargetDrawables.size() == 1;
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ int ntargets = targets.size();
+ final boolean singleTarget = ntargets == 1;
float x = 0.0f;
float y = 0.0f;
for (int k = 0; k < historySize + 1; k++) {
@@ -768,25 +804,29 @@
float limitX = tx * scale;
float limitY = ty * scale;
- if (singleTarget) {
- // Snap to outer ring if there's only one target
- float snapRadius = mOuterRadius - mSnapMargin;
- if (touchRadius > snapRadius) {
- activeTarget = 0;
- }
+ if (!mDragging) {
+ trySwitchToFirstTouchState(eventX, eventY);
} else {
- // If there's more than one target, snap to the closest one less than hitRadius away.
- float best = Float.MAX_VALUE;
- final float hitRadius2 = mHitRadius * mHitRadius;
- for (int i = 0; i < mTargetDrawables.size(); i++) {
- // Snap to the first target in range
- TargetDrawable target = mTargetDrawables.get(i);
- float dx = limitX - target.getX();
- float dy = limitY - target.getY();
- float dist2 = dx*dx + dy*dy;
- if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) {
- activeTarget = i;
- best = dist2;
+ if (singleTarget) {
+ // Snap to outer ring if there's only one target
+ float snapRadius = mOuterRadius - mSnapMargin;
+ if (touchRadius > snapRadius) {
+ activeTarget = 0;
+ }
+ } else {
+ // For more than one target, snap to the closest one less than hitRadius away.
+ float best = Float.MAX_VALUE;
+ final float hitRadius2 = mHitRadius * mHitRadius;
+ for (int i = 0; i < ntargets; i++) {
+ // Snap to the first target in range
+ TargetDrawable target = targets.get(i);
+ float dx = limitX - target.getX();
+ float dy = limitY - target.getY();
+ float dist2 = dx*dx + dy*dy;
+ if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) {
+ activeTarget = i;
+ best = dist2;
+ }
}
}
}
@@ -794,9 +834,13 @@
y = limitY;
}
+ if (!mDragging) {
+ return;
+ }
+
if (activeTarget != -1) {
switchToState(STATE_SNAP, x,y);
- TargetDrawable target = mTargetDrawables.get(activeTarget);
+ TargetDrawable target = targets.get(activeTarget);
float newX = singleTarget ? x : target.getX();
float newY = singleTarget ? y : target.getY();
moveHandleTo(newX, newY, false);
@@ -812,7 +856,7 @@
if (mActiveTarget != activeTarget) {
// Defocus the old target
if (mActiveTarget != -1) {
- TargetDrawable target = mTargetDrawables.get(mActiveTarget);
+ TargetDrawable target = targets.get(mActiveTarget);
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
target.setState(TargetDrawable.STATE_INACTIVE);
mHandleDrawable.setAlpha(1.0f);
@@ -820,7 +864,7 @@
}
// Focus the new target
if (activeTarget != -1) {
- TargetDrawable target = mTargetDrawables.get(activeTarget);
+ TargetDrawable target = targets.get(activeTarget);
if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
target.setState(TargetDrawable.STATE_FOCUSED);
mHandleDrawable.setAlpha(0.0f);
@@ -877,9 +921,7 @@
}
}
- private boolean trySwitchToFirstTouchState(MotionEvent event) {
- final float x = event.getX();
- final float y = event.getY();
+ private boolean trySwitchToFirstTouchState(float x, float y) {
final float tx = x - mWaveCenterX;
final float ty = y - mWaveCenterY;
if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledTapRadiusSquared()) {
@@ -892,9 +934,9 @@
return false;
}
- private void assignDefaultsIfNeeded(float centerX, float centerY) {
+ private void assignDefaultsIfNeeded() {
if (mOuterRadius == 0.0f) {
- mOuterRadius = 0.5f*(float) Math.hypot(centerX, centerY);
+ mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f;
}
if (mHitRadius == 0.0f) {
// Use the radius of inscribed circle of the first target.
@@ -941,6 +983,7 @@
super.onLayout(changed, left, top, right, bottom);
final int width = right - left;
final int height = bottom - top;
+
// Target placement width/height. This puts the targets on the greater of the ring
// width or the specified outer radius.
final float placementWidth = Math.max(mOuterRing.getWidth(), 2 * mOuterRadius);
@@ -950,8 +993,6 @@
float newWaveCenterY = mVerticalOffset + mVerticalInset
+ Math.max(height, + mMaxTargetHeight + placementHeight) / 2;
- assignDefaultsIfNeeded(newWaveCenterX, newWaveCenterY);
-
if (mInitialLayout) {
hideChevrons();
hideTargets(false);
@@ -976,9 +1017,12 @@
private void updateTargetPositions(float centerX, float centerY) {
// Reposition the target drawables if the view changed.
- for (int i = 0; i < mTargetDrawables.size(); i++) {
- final TargetDrawable targetIcon = mTargetDrawables.get(i);
- double angle = -2.0f * Math.PI * i / mTargetDrawables.size();
+ ArrayList<TargetDrawable> targets = mTargetDrawables;
+ final int size = targets.size();
+ final float alpha = (float) (-2.0f * Math.PI / size);
+ for (int i = 0; i < size; i++) {
+ final TargetDrawable targetIcon = targets.get(i);
+ final float angle = alpha * i;
targetIcon.setPositionX(centerX);
targetIcon.setPositionY(centerY);
targetIcon.setX(mOuterRadius * (float) Math.cos(angle));
@@ -987,7 +1031,10 @@
}
private void updateChevronPositions(float centerX, float centerY) {
- for (TargetDrawable target : mChevronDrawables) {
+ ArrayList<TargetDrawable> chevrons = mChevronDrawables;
+ final int size = chevrons.size();
+ for (int i = 0; i < size; i++) {
+ TargetDrawable target = chevrons.get(i);
if (target != null) {
target.setPositionX(centerX);
target.setPositionY(centerY);
@@ -996,7 +1043,10 @@
}
private void hideChevrons() {
- for (TargetDrawable chevron : mChevronDrawables) {
+ ArrayList<TargetDrawable> chevrons = mChevronDrawables;
+ final int size = chevrons.size();
+ for (int i = 0; i < size; i++) {
+ TargetDrawable chevron = chevrons.get(i);
if (chevron != null) {
chevron.setAlpha(0.0f);
}
@@ -1006,14 +1056,18 @@
@Override
protected void onDraw(Canvas canvas) {
mOuterRing.draw(canvas);
- for (TargetDrawable target : mTargetDrawables) {
+ final int ntargets = mTargetDrawables.size();
+ for (int i = 0; i < ntargets; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
if (target != null) {
target.draw(canvas);
}
}
- for (TargetDrawable target : mChevronDrawables) {
- if (target != null) {
- target.draw(canvas);
+ final int nchevrons = mChevronDrawables.size();
+ for (int i = 0; i < nchevrons; i++) {
+ TargetDrawable chevron = mChevronDrawables.get(i);
+ if (chevron != null) {
+ chevron.draw(canvas);
}
}
mHandleDrawable.draw(canvas);
diff --git a/core/java/com/android/internal/widget/multiwaveview/Tweener.java b/core/java/com/android/internal/widget/multiwaveview/Tweener.java
index bc8a62f..1d502ba 100644
--- a/core/java/com/android/internal/widget/multiwaveview/Tweener.java
+++ b/core/java/com/android/internal/widget/multiwaveview/Tweener.java
@@ -122,7 +122,6 @@
anim.addListener(listener);
}
anim.addListener(mCleanupListener);
- anim.start();
return tween;
}
diff --git a/core/res/res/layout/notification_action.xml b/core/res/res/layout/notification_action.xml
index 28812a9..33cbab9 100644
--- a/core/res/res/layout/notification_action.xml
+++ b/core/res/res/layout/notification_action.xml
@@ -17,11 +17,14 @@
<Button xmlns:android="http://schemas.android.com/apk/res/android"
style="?android:attr/borderlessButtonStyle"
android:id="@+id/action0"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="48dp"
+ android:layout_weight="1"
android:gravity="left|center_vertical"
android:drawablePadding="8dp"
android:paddingLeft="8dp"
android:textColor="#ccc"
android:textSize="14dp"
+ android:singleLine="true"
+ android:ellipsize="end"
/>
diff --git a/core/res/res/layout/notification_action_list.xml b/core/res/res/layout/notification_action_list.xml
new file mode 100644
index 0000000..fa0a8c8
--- /dev/null
+++ b/core/res/res/layout/notification_action_list.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2012 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/actions"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:visibility="gone"
+ android:showDividers="middle"
+ android:divider="?android:attr/listDivider"
+ >
+ <!-- actions will be added here -->
+</LinearLayout>
diff --git a/core/res/res/layout/notification_action_tombstone.xml b/core/res/res/layout/notification_action_tombstone.xml
index e61e15f..992b37c 100644
--- a/core/res/res/layout/notification_action_tombstone.xml
+++ b/core/res/res/layout/notification_action_tombstone.xml
@@ -15,12 +15,18 @@
-->
<Button xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?android:attr/borderlessButtonStyle"
android:id="@+id/action0"
- android:layout_width="match_parent"
+ android:layout_width="0dp"
android:layout_height="48dp"
+ android:layout_weight="1"
android:gravity="left|center_vertical"
android:drawablePadding="8dp"
android:paddingLeft="8dp"
- android:textColor="#666"
+ android:textColor="#ccc"
android:textSize="14dp"
+ android:singleLine="true"
+ android:ellipsize="end"
+ android:alpha="0.5"
+ android:enabled="false"
/>
diff --git a/core/res/res/layout/notification_template_big_base.xml b/core/res/res/layout/notification_template_big_base.xml
index 378161c..d50b792 100644
--- a/core/res/res/layout/notification_template_big_base.xml
+++ b/core/res/res/layout/notification_template_big_base.xml
@@ -143,14 +143,11 @@
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
- <LinearLayout
+ <include
+ layout="@layout/notification_action_list"
android:id="@+id/actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
- android:visibility="gone"
- >
- <!-- actions will be added here -->
- </LinearLayout>
+ />
</LinearLayout>
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_big_picture.xml b/core/res/res/layout/notification_template_big_picture.xml
index 51e46b2..f98970a 100644
--- a/core/res/res/layout/notification_template_big_picture.xml
+++ b/core/res/res/layout/notification_template_big_picture.xml
@@ -27,11 +27,12 @@
android:id="@+id/big_picture"
android:layout_width="match_parent"
android:layout_height="192dp"
+ android:layout_marginTop="64dp"
+ android:layout_gravity="bottom"
android:scaleType="centerCrop"
/>
<include layout="@layout/notification_template_base"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="192dp"
/>
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml
index 77a5f11..210bc13 100644
--- a/core/res/res/layout/notification_template_big_text.xml
+++ b/core/res/res/layout/notification_template_big_text.xml
@@ -105,16 +105,13 @@
android:layout_weight="1"
/>
</LinearLayout>
- <LinearLayout
- android:id="@+id/actions"
+ <include
+ layout="@layout/notification_action_list"
android:layout_width="match_parent"
android:layout_height="0dp"
- android:orientation="vertical"
android:visibility="gone"
android:layout_weight="1"
- >
- <!-- actions will be added here -->
- </LinearLayout>
+ />
<TextView android:id="@+id/overflow_title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
android:layout_width="match_parent"
diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml
index 05ec1d8..eb5e759 100644
--- a/core/res/res/layout/notification_template_inbox.xml
+++ b/core/res/res/layout/notification_template_inbox.xml
@@ -93,8 +93,6 @@
android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
- android:paddingTop="4dp"
- android:paddingBottom="4dp"
android:visibility="gone"
android:layout_weight="1"
/>
@@ -104,8 +102,6 @@
android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
- android:paddingTop="4dp"
- android:paddingBottom="4dp"
android:visibility="gone"
android:layout_weight="1"
/>
@@ -115,8 +111,6 @@
android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
- android:paddingTop="4dp"
- android:paddingBottom="4dp"
android:visibility="gone"
android:layout_weight="1"
/>
@@ -126,8 +120,6 @@
android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
- android:paddingTop="4dp"
- android:paddingBottom="4dp"
android:visibility="gone"
android:layout_weight="1"
/>
@@ -137,21 +129,16 @@
android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
- android:paddingTop="4dp"
- android:paddingBottom="4dp"
android:visibility="gone"
android:layout_weight="1"
/>
- <LinearLayout
+ <include
+ layout="@layout/notification_action_list"
android:id="@+id/actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="vertical"
android:layout_weight="0"
- android:visibility="gone"
- >
- <!-- actions will be added here -->
- </LinearLayout>
+ />
<TextView android:id="@+id/overflow_title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
android:layout_width="match_parent"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index b739835..732b0ab 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -176,9 +176,9 @@
<string name="permgrouplab_network" msgid="5808983377727109831">"Netwerkkommunikasie"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Kry toegang tot verskeie netwerkfunksies."</string>
<string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
- <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Toegangstoestelle en netwerke deur Bluetooth."</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Kry toegang tot toestelle en netwerke deur Bluetooth."</string>
<string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kortreeks-netwerke"</string>
- <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Toegangstoestelle met kortreeks-netwerke soos NFC."</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Kry toegang tot toestelle met kortreeks-netwerke soos NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Oudio-instellings"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Verander oudio-instellings."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affekteer battery"</string>
@@ -561,7 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Laat die program toe om die USB-berging se inhoud te lees, wat foto\'s en media kan insluit."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Laat die program toe om die SD-kaart se inhoud te lees, wat foto\'s en media kan insluit."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"verander of vee die inhoud van jou USB-berging uit"</string>
- <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of skrap die inhoud van jou SD-kaart"</string>
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of vee die inhoud van jou SD-kaart uit"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Laat die program toe om die USB-geheue te skryf."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Laat die program toe om na die SD-kaart te skryf."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"verander/vee uit interne mediabergingsinhoud"</string>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 0da38aa..72132dd 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Solo una vez"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 3c705ec..f5132c1 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Siunčiama…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Tik kartą"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 0b96365..e6c8d99 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Notiek sūtīšana…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Tikai vienreiz"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 47aa00a..1ab7002 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -177,7 +177,7 @@
<string name="permgroupdesc_network" msgid="4478299413241861987">"Akses pelbagai ciri rangkaian."</string>
<string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
<string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Akses peranti dan rangkaian melalui Bluetooth."</string>
- <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-pendek"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-dekat"</string>
<string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Akses peranti melalui rangkaian jarak dekat seperti NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Tetapan Audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Tukar tetapan audio."</string>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 4bb3b2f..e7a809c 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -178,7 +178,7 @@
<string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
<string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Aceder a dispositivos e redes através de Bluetooth."</string>
<string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de Curto Alcance"</string>
- <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance como NFC."</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance tal como a NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Definições de Áudio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Alterar as definições de áudio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afetar a Bateria"</string>
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"A enviar..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Só Uma Vez"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 4236d50..84ce4bb 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1104,7 +1104,7 @@
<string name="dlg_error_title" msgid="7323658469626514207">"Falha na operação do USB"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
<string name="usb_mtp_notification_title" msgid="3699913097391550394">"Conectado como um dispositivo de mídia"</string>
- <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectadas como uma câmera"</string>
+ <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectado como câmera"</string>
<string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectados como um instalador"</string>
<string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string>
<string name="usb_notification_message" msgid="2290859399983720271">"Toque para obter outras opções USB."</string>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index e943dda..3b416fe 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Надгледајте своју физичку локацију."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Комуникација преко мреже"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Приступајте разним функцијама мреже."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Приступање уређајима и мрежама преко Bluetooth-а."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Мреже кратког домета"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Приступање уређајима преко мрежа кратког домета, као што је NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Аудио подешавања"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Промена аудио подешавања."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Утицај на батерију"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Коришћење функција које могу брзо да истроше батерију."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Директан приступ календару и догађајима."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Читање речника корисника"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Читање речи у речнику корисника."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Уписивање у речник корисника"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Додавање речи у речник корисника."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Обележивачи и историја"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Директан приступ обележивачима и историји прегледача."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Аларм"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Дозвољава апликацији читање садржаја USB меморије, што могу да буду слике и медиа датотеке."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Дозвољава апликацији да чита садржај SD картице, који може да обухвата слике и медиа датотеке."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"измена или брисање садржаја USB меморије"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"мењање или брисање садржаја SD картице"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Дозвољава апликацији да уписује податке на USB меморију."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозвољава апликацији да уписује податке на SD картицу."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"измена/брисање интерне меморије медија"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Подеси"</string>
<string name="date_time_done" msgid="2507683751759308828">"Готово"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВО: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Омогућава <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Није потребна ниједна дозвола"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB великог капацитета"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB је повезан"</string>
@@ -1322,6 +1312,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string>
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Само једном"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 46c58e3..17dcf64 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"ตรวจดูตำแหน่งทางกายภาพของคุณ"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"การสื่อสารของเครือข่าย"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"เข้าถึงคุณลักษณะเครือข่ายต่างๆ"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"บลูทูธ"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"เข้าถึงอุปกรณ์และเครือข่ายผ่านบลูทูธ"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"เครือข่ายระยะใกล้"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"เข้าถึงอุปกรณ์ผ่านเครือข่ายระยะใกล้ เช่น NFC"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"การตั้งค่าเสียง"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"เปลี่ยนการตั้งค่าเสียง"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"มีผลต่อแบตเตอรี่"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"ใช้คุณลักษณะที่ทำให้พลังงานแบตเตอรี่ลดลงอย่างรวดเร็ว"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ปฏิทิน"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"เข้าถึงปฏิทินและกิจกรรมโดยตรง"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"อ่านพจนานุกรมผู้ใช้"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"อ่านคำในพจนานุกรมผู้ใช้"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"เขียนพจนานุกรมผู้ใช้"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"เพิ่มคำลงในพจนานุกรมผู้ใช้"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"บุ๊กมาร์กและประวัติ"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"เข้าถึงบุ๊กมาร์กและประวัติของเบราว์เซอร์โดยตรง"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"เตือน"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"อนุญาตให้แอปอ่านเนื้อหาในที่จัดเก็บข้อมูล USB ซึ่งอาจรวมไปถึงรูปภาพและสื่อ"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"อนุญาตให้แอปอ่านเนื้อหาในการ์ด SD ซึ่งอาจรวมไปถึงรูปภาพและสื่อ"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"แก้ไขหรือลบเนื้อหาใน USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"แก้ไขหรือลบเนื้อหาในการ์ด SD ของคุณ"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"อนุญาตให้แอปฯ เขียนลงใน USB"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"อนุญาตให้แอปพลิเคชันเขียนลงบนการ์ด SD"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"แก้/ลบเนื้อหาข้อมูลสื่อภายใน"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"ตั้งค่า"</string>
<string name="date_time_done" msgid="2507683751759308828">"เสร็จสิ้น"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"ใหม่: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"โดย <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="no_permissions" msgid="7283357728219338112">"ไม่ต้องการการอนุญาต"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"ที่จัดเก็บข้อมูลจำนวนมากแบบ USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"เชื่อมต่อ USB แล้ว"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"กำลังส่ง…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"เปิดเบราว์เซอร์หรือไม่"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"รับสายหรือไม่"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"ทุกครั้ง"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"เพียงแค่ครั้งเดียว"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 9aa2df3..9222823 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziksel konumunuzu izleme."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Ağ iletişimi"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Çeşitli ağ özelliklerine erişme."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Cihazlara ve ağlara Bluetooth ile eriş."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kısa Mesafeli Ağlar"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Cihazlara NFC gibi kısa mesafeli ağları kullanarak eriş."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Ses Ayarları"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Ses ayarlarını değiştirme."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Pili Etkileyenler"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Pili çok çabuk tüketebilen özellikleri kullanma."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Takvime ve etkinliklere doğrudan erişim."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Kullanıcı Sözlüğünü Oku"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Kelimeleri kullanıcı sözlüğünde oku."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Kullanıcı Sözlüğüne Yaz"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Kelimeleri kullanıcı sözlüğüne ekle."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Yer İşaretleri ve Geçmiş"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Yer işaretlerine ve tarayıcı geçmişine doğrudan erişim."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Uygulamaya USB depolamanın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Uygulamaya SD kartın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB depolamamın içeriğini değiştir veya sil"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartın içeriğini değiştir veya sil"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Uygulamaya USB depolama birimine yazma izni verir."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Uygulamaya, SD karta yazma izni verir."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"dahili medya depolama birimi içeriğini değiştir/sil"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Ayarla"</string>
<string name="date_time_done" msgid="2507683751759308828">"Tamamlandı"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"YENİ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Sağlayan: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB yığın depolama"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB bağlandı"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Gönderiliyor…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Her zaman"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Sadece Bir Defa"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 148713237..542f048 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Đang gửi…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Khởi chạy trình duyệt?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn bật"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Chỉ một lần"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index dce0525..0c9717f 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -185,7 +185,7 @@
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Sebenzisa izici ezingakhipha ngokushesha ibhethri."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Ukufinyelela okuqondile kukhalenda nezehlakalo."</string>
- <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichzamazwi somsebenzisi"</string>
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichazamazwi somsebenzisi"</string>
<string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Funda amagama kusichazamazwi somsebenzisi."</string>
<string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Bhala isichazamazwi somsebenzisi"</string>
<string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Engeza amagama kusichazamazwi somsebenzisi."</string>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 4d038e0..a90dab8 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -239,22 +239,25 @@
</style>
<!-- Notification content styles -->
<style name="TextAppearance.StatusBar.EventContent">
- <item name="android:textColor">?android:attr/textColorSecondary</item>
- <item name="android:textSize">12sp</item>
+ <item name="android:textColor">#808080</item>
+ <item name="android:textSize">14dp</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Title">
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- <item name="android:textSize">16sp</item>
+ <item name="android:textColor">#ffffff</item>
+ <item name="android:fontFamily">sans-serif-light</item>
+ <item name="android:textSize">18dp</item>
<item name="android:textStyle">bold</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Line2">
- <item name="android:textSize">13sp</item>
+ <!-- inherit all -->
</style>
<style name="TextAppearance.StatusBar.EventContent.Info">
- <!-- inherit all -->
+ <item name="android:textSize">12sp</item>
+ <item name="android:textColor">#666666</item>
</style>
<style name="TextAppearance.StatusBar.EventContent.Time">
- <!-- inherit all -->
+ <item name="android:textSize">12sp</item>
+ <item name="android:textColor">#666666</item>
</style>
<style name="TextAppearance.Small.CalendarViewWeekDayView">
diff --git a/docs/html/guide/practices/design/performance.jd b/docs/html/guide/practices/design/performance.jd
index c41f971..dd9b554 100644
--- a/docs/html/guide/practices/design/performance.jd
+++ b/docs/html/guide/practices/design/performance.jd
@@ -180,6 +180,9 @@
trivial getter. This is true in Froyo, but will improve in the future when
the JIT inlines getter methods.</p>
+<p>Note that if you're using ProGuard, you can have the best
+of both worlds because ProGuard can inline accessors for you.</p>
+
<a name="use_final" id="use_final"></a>
<h2>Use Static Final For Constants</h2>
diff --git a/media/jni/mediaeditor/Android.mk b/media/jni/mediaeditor/Android.mk
index d1cf8b5..040d2ab 100755
--- a/media/jni/mediaeditor/Android.mk
+++ b/media/jni/mediaeditor/Android.mk
@@ -47,20 +47,23 @@
$(TOP)/frameworks/native/include/media/openmax
LOCAL_SHARED_LIBRARIES := \
+ libandroid_runtime \
+ libaudioflinger \
libaudioutils \
+ libbinder \
libcutils \
libdl \
- libutils \
- libandroid_runtime \
- libnativehelper \
+ libgui \
libmedia \
- libaudioflinger \
- libbinder \
+ libnativehelper \
libstagefright \
libstagefright_foundation \
libstagefright_omx \
- libgui \
- libvideoeditorplayer
+ libutils \
+ libvideoeditor_core \
+ libvideoeditor_osal \
+ libvideoeditor_videofilters \
+ libvideoeditorplayer \
LOCAL_CFLAGS += \
@@ -72,15 +75,6 @@
-DUSE_STAGEFRIGHT_READERS \
-DUSE_STAGEFRIGHT_3GPP_READER
-LOCAL_STATIC_LIBRARIES := \
- libvideoeditor_core \
- libstagefright_color_conversion \
- libvideoeditor_3gpwriter \
- libvideoeditor_mcs \
- libvideoeditor_videofilters \
- libvideoeditor_stagefrightshells \
- libvideoeditor_osal
-
LOCAL_MODULE:= libvideoeditor_jni
LOCAL_MODULE_TAGS := optional
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 50aaa9a..0165977 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -34,6 +34,7 @@
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import java.io.CharArrayReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.EOFException;
@@ -45,7 +46,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
import java.util.zip.CRC32;
@@ -55,7 +60,7 @@
*/
public class SettingsBackupAgent extends BackupAgentHelper {
private static final boolean DEBUG = false;
- private static final boolean DEBUG_BACKUP = DEBUG || true;
+ private static final boolean DEBUG_BACKUP = DEBUG || false;
private static final String KEY_SYSTEM = "system";
private static final String KEY_SECURE = "secure";
@@ -111,6 +116,130 @@
private WifiManager mWfm;
private static String mWifiConfigFile;
+ // Class for capturing a network definition from the wifi supplicant config file
+ static class Network {
+ String ssid = ""; // equals() and hashCode() need these to be non-null
+ String key_mgmt = "";
+ final ArrayList<String> rawLines = new ArrayList<String>();
+
+ public static Network readFromStream(BufferedReader in) {
+ final Network n = new Network();
+ String line;
+ try {
+ while (in.ready()) {
+ line = in.readLine();
+ if (line == null || line.startsWith("}")) {
+ break;
+ }
+ n.rememberLine(line);
+ }
+ } catch (IOException e) {
+ return null;
+ }
+ return n;
+ }
+
+ void rememberLine(String line) {
+ // can't rely on particular whitespace patterns so strip leading/trailing
+ line = line.trim();
+ if (line.isEmpty()) return; // only whitespace; drop the line
+ rawLines.add(line);
+
+ // remember the ssid and key_mgmt lines for duplicate culling
+ if (line.startsWith("ssid")) {
+ ssid = line;
+ } else if (line.startsWith("key_mgmt")) {
+ key_mgmt = line;
+ }
+ }
+
+ public void write(Writer w) throws IOException {
+ w.write("\nnetwork={\n");
+ for (String line : rawLines) {
+ w.write("\t" + line + "\n");
+ }
+ w.write("}\n");
+ }
+
+ public void dump() {
+ Log.v(TAG, "network={");
+ for (String line : rawLines) {
+ Log.v(TAG, " " + line);
+ }
+ Log.v(TAG, "}");
+ }
+
+ // Same approach as Pair.equals() and Pair.hashCode()
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) return true;
+ if (!(o instanceof Network)) return false;
+ final Network other;
+ try {
+ other = (Network) o;
+ } catch (ClassCastException e) {
+ return false;
+ }
+ return ssid.equals(other.ssid) && key_mgmt.equals(other.key_mgmt);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + ssid.hashCode();
+ result = 31 * result + key_mgmt.hashCode();
+ return result;
+ }
+ }
+
+ // Ingest multiple wifi config file fragments, looking for network={} blocks
+ // and eliminating duplicates
+ class WifiNetworkSettings {
+ // One for fast lookup, one for maintaining ordering
+ final HashSet<Network> mKnownNetworks = new HashSet<Network>();
+ final ArrayList<Network> mNetworks = new ArrayList<Network>(8);
+
+ public void readNetworks(BufferedReader in) {
+ try {
+ String line;
+ while (in.ready()) {
+ line = in.readLine();
+ if (line != null) {
+ // Parse out 'network=' decls so we can ignore duplicates
+ if (line.startsWith("network")) {
+ Network net = Network.readFromStream(in);
+ if (! mKnownNetworks.contains(net)) {
+ if (DEBUG_BACKUP) {
+ Log.v(TAG, "Adding " + net.ssid + " / " + net.key_mgmt);
+ }
+ mKnownNetworks.add(net);
+ mNetworks.add(net);
+ } else {
+ if (DEBUG_BACKUP) {
+ Log.v(TAG, "Dupe; skipped " + net.ssid + " / " + net.key_mgmt);
+ }
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ // whatever happened, we're done now
+ }
+ }
+
+ public void write(Writer w) throws IOException {
+ for (Network net : mNetworks) {
+ net.write(w);
+ }
+ }
+
+ public void dump() {
+ for (Network net : mNetworks) {
+ net.dump();
+ }
+ }
+ }
+
@Override
public void onCreate() {
if (DEBUG_BACKUP) Log.d(TAG, "onCreate() invoked");
@@ -622,29 +751,51 @@
private void restoreWifiSupplicant(String filename, byte[] bytes, int size) {
try {
- File supplicantFile = new File(FILE_WIFI_SUPPLICANT);
- if (supplicantFile.exists()) supplicantFile.delete();
- copyWifiSupplicantTemplate();
+ WifiNetworkSettings supplicantImage = new WifiNetworkSettings();
- OutputStream os = new BufferedOutputStream(new FileOutputStream(filename, true));
- os.write("\n".getBytes());
- os.write(bytes, 0, size);
- os.close();
+ File supplicantFile = new File(FILE_WIFI_SUPPLICANT);
+ if (supplicantFile.exists()) {
+ // Retain the existing APs; we'll append the restored ones to them
+ BufferedReader in = new BufferedReader(new FileReader(FILE_WIFI_SUPPLICANT));
+ supplicantImage.readNetworks(in);
+ in.close();
+
+ supplicantFile.delete();
+ }
+
+ // Incorporate the restore AP information
+ if (size > 0) {
+ char[] restoredAsBytes = new char[size];
+ for (int i = 0; i < size; i++) restoredAsBytes[i] = (char) bytes[i];
+ BufferedReader in = new BufferedReader(new CharArrayReader(restoredAsBytes));
+ supplicantImage.readNetworks(in);
+
+ if (DEBUG_BACKUP) {
+ Log.v(TAG, "Final AP list:");
+ supplicantImage.dump();
+ }
+ }
+
+ // Install the correct default template
+ BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_WIFI_SUPPLICANT));
+ copyWifiSupplicantTemplate(bw);
+
+ // Write the restored supplicant config and we're done
+ supplicantImage.write(bw);
+ bw.close();
} catch (IOException ioe) {
Log.w(TAG, "Couldn't restore " + filename);
}
}
- private void copyWifiSupplicantTemplate() {
+ private void copyWifiSupplicantTemplate(BufferedWriter bw) {
try {
BufferedReader br = new BufferedReader(new FileReader(FILE_WIFI_SUPPLICANT_TEMPLATE));
- BufferedWriter bw = new BufferedWriter(new FileWriter(FILE_WIFI_SUPPLICANT));
char[] temp = new char[1024];
int size;
while ((size = br.read(temp)) > 0) {
bw.write(temp, 0, size);
}
- bw.close();
br.close();
} catch (IOException ioe) {
Log.w(TAG, "Couldn't copy wpa_supplicant file");
diff --git a/packages/SystemUI/res/drawable/navbar_search_outerring.xml b/packages/SystemUI/res/drawable/navbar_search_outerring.xml
index 37b6c1c..0dd081d 100644
--- a/packages/SystemUI/res/drawable/navbar_search_outerring.xml
+++ b/packages/SystemUI/res/drawable/navbar_search_outerring.xml
@@ -19,5 +19,5 @@
<size android:height="@dimen/navbar_search_outerring_diameter"
android:width="@dimen/navbar_search_outerring_diameter" />
<solid android:color="#00000000" />
- <stroke android:color="#1affffff" android:width="2dp" />
+ <stroke android:color="#40ffffff" android:width="2dp" />
</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 4cff67b..406ed25 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -23,34 +23,39 @@
xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
android:id="@+id/notification_panel"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
+ android:layout_height="match_parent"
android:background="@drawable/notification_panel_bg"
android:paddingTop="@dimen/notification_panel_padding_top"
android:layout_marginLeft="@dimen/notification_panel_margin_left"
>
- <include layout="@layout/status_bar_expanded_header"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- />
-
- <ScrollView
- android:id="@+id/scroll"
+ <FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:fadingEdge="none"
- android:overScrollMode="ifContentScrolls"
- android:layout_marginTop="@dimen/notification_panel_header_height"
android:layout_marginBottom="@dimen/close_handle_underlap"
>
- <com.android.systemui.statusbar.policy.NotificationRowLayout
- android:id="@+id/latestItems"
+
+ <include layout="@layout/status_bar_expanded_header"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- systemui:rowHeight="@dimen/notification_row_min_height"
+ android:layout_height="48dp"
/>
- </ScrollView>
+
+ <ScrollView
+ android:id="@+id/scroll"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:fadingEdge="none"
+ android:overScrollMode="ifContentScrolls"
+ android:layout_marginTop="@dimen/notification_panel_header_height"
+ >
+ <com.android.systemui.statusbar.policy.NotificationRowLayout
+ android:id="@+id/latestItems"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ systemui:rowHeight="@dimen/notification_row_min_height"
+ />
+ </ScrollView>
+ </FrameLayout>
<com.android.systemui.statusbar.phone.CloseDragHandle android:id="@+id/close"
android:layout_width="match_parent"
@@ -67,5 +72,4 @@
/>
</com.android.systemui.statusbar.phone.CloseDragHandle>
-
</FrameLayout><!-- end of sliding panel -->
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index b4e0d8a..06a9395 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -144,10 +144,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificaciones desactivadas"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Toca aquí para volver a activar las notificaciones."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"La pantalla rotará automáticamente."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"La pantalla está bloqueada en modo horizontal."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"La pantalla está bloqueada en modo vertical."</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index a242640..018b5e5 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programos informacija"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Pranešimai išjungti"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Jei norite vėl įjungti pranešimus, palieskite čia."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekranas bus sukamas automatiškai."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Užrakintas ekranas yra horizontalios orientacijos."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Užrakintas ekranas yra vertikalios orientacijos."</string>
</resources>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 3c2e193..e708804 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informācija par lietotni"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Paziņojumi ir izslēgti"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Pieskarieties šeit, lai atkal ieslēgtu paziņojumus."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekrāns tiks pagriezts automātiski."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekrāns tagad ir bloķēts ainavas orientācijā."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekrāns tagad ir bloķēts portreta orientācijā."</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 77ed068..d08c529 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para voltar a ativar as notificações."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"O ecrã será rodado automaticamente."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"O ecrã está bloqueado na orientação horizontal."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"O ecrã está bloqueado na orientação vertical."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 5f523a2..fd41e02 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -140,10 +140,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Обриши сва обавештења."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Активирање чувара екрана"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информације о апликацији"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Обавештења су искључена"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Додирните овде да бисте поново укључили обавештења."</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран ће се аутоматски ротирати."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран је закључан у хоризонталном положају."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index dbb8d91..70f0b9b 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"ล้างการแจ้งเตือนทั้งหมด"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"เปิดโปรแกรมรักษาหน้าจอ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"ข้อมูลแอป"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"การแจ้งเตือนปิดอยู่"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"แตะที่นี่เพื่อเปิดการแจ้งเตือนอีกครั้ง"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"หน้าจอจะหมุนโดยอัตโนมัติ"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ขณะนี้หน้าจอถูกล็อกให้วางในแนวนอน"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ขณะนี้หน้าจอถูกล็อกให้วางในแนวตั้ง"</string>
</resources>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index d0f08fc..9bf8f76 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tüm bildirimleri temizle"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Ekran koruyucuyu etkinleştir"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Uygulama bilgileri"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Bildirimler kapalı"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Bildirimleri tekrar açmak için buraya hafifçe vurun."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran otomatik olarak dönecektir."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran yatay yönde kilitlendi."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran dikey yönde kilitlendi."</string>
</resources>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 0019c7c..02d0138 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Thông tin về ứng dụng"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Tắt thông báo"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Chạm vào đây để bật lại thông báo."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Màn hinh sẽ xoay tự động."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Màn hình hiện bị khóa theo hướng ngang."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Màn hình hiện bị khóa theo hướng dọc."</string>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 9042045..0d79a9b 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -115,10 +115,10 @@
<dimen name="navbar_search_hit_radius">60dip</dimen>
<!-- Diameter of outer shape drawable shown in navbar search-->
- <dimen name="navbar_search_outerring_diameter">270dp</dimen>
+ <dimen name="navbar_search_outerring_diameter">340dp</dimen>
<!-- Threshold for swipe-up gesture to activate search dialog -->
- <dimen name="navbar_search_up_threshhold">20dip</dimen>
+ <dimen name="navbar_search_up_threshhold">40dip</dimen>
<!-- Height of search panel including navigation bar height -->
<dimen name="navbar_search_panel_height">230dip</dimen>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index 144760e..af77a30 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -16,12 +16,6 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android">
- <style name="TextAppearance.StatusBar.Title" parent="@*android:style/TextAppearance.StatusBar">
- <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
- <item name="android:textStyle">bold</item>
- <item name="android:textColor">?android:attr/textColorPrimary</item>
- </style>
-
<style name="TextAppearance.StatusBar.IntruderAlert"
parent="@*android:style/TextAppearance.StatusBar">
</style>
@@ -48,7 +42,7 @@
</style>
<style name="TextAppearance.StatusBar.Date" parent="@*android:style/TextAppearance.StatusBar.Icon">
- <item name="android:textSize">16sp</item>
+ <item name="android:textSize">16dp</item>
<item name="android:textStyle">normal</item>
<item name="android:textColor">@android:color/holo_blue_light</item>
</style>
@@ -57,6 +51,7 @@
<style name="TextAppearance.StatusBar.Expanded.Clock">
<item name="android:textSize">32dp</item>
+ <item name="android:fontFamily">sans-serif-light</item>
<item name="android:textStyle">normal</item>
<item name="android:textColor">#ffffff</item>
</style>
diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
index 7a7afa7..ba3336b 100644
--- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
@@ -31,7 +31,7 @@
public class ExpandHelper implements Gefingerpoken, OnClickListener {
public interface Callback {
- View getChildAtPosition(MotionEvent ev);
+ View getChildAtRawPosition(float x, float y);
View getChildAtPosition(float x, float y);
boolean canChildBeExpanded(View v);
boolean setUserExpandedChild(View v, boolean userxpanded);
@@ -62,6 +62,7 @@
private Context mContext;
private boolean mStretching;
+ private View mEventSource;
private View mCurrView;
private View mCurrViewTopGlow;
private View mCurrViewBottomGlow;
@@ -141,7 +142,19 @@
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
if (DEBUG) Log.v(TAG, "onscalebegin()");
- View v = mCallback.getChildAtPosition(detector.getFocusX(), detector.getFocusY());
+ float x = detector.getFocusX();
+ float y = detector.getFocusY();
+
+ View v = null;
+ if (mEventSource != null) {
+ int[] location = new int[2];
+ mEventSource.getLocationOnScreen(location);
+ x += (float) location[0];
+ y += (float) location[1];
+ v = mCallback.getChildAtRawPosition(x, y);
+ } else {
+ v = mCallback.getChildAtPosition(x, y);
+ }
// your fingers have to be somewhat close to the bounds of the view in question
mInitialTouchFocusY = detector.getFocusY();
@@ -189,6 +202,11 @@
}
});
}
+
+ public void setEventSource(View eventSource) {
+ mEventSource = eventSource;
+ }
+
public void setGlow(float glow) {
if (!mGlowAnimationSet.isRunning() || glow == 0f) {
if (mGlowAnimationSet.isRunning()) {
@@ -211,7 +229,6 @@
}
}
}
-
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (DEBUG) Log.d(TAG, "interceptTouch: act=" + (ev.getAction()) +
" stretching=" + mStretching);
@@ -223,11 +240,13 @@
final int action = ev.getAction();
if (DEBUG) Log.d(TAG, "touch: act=" + (action) + " stretching=" + mStretching);
if (mStretching) {
+ if (DEBUG) Log.d(TAG, "detector ontouch");
mDetector.onTouchEvent(ev);
}
switch (action) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
+ if (DEBUG) Log.d(TAG, "cancel");
mStretching = false;
clearView();
break;
diff --git a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
index 57f15a8..05a3bec 100644
--- a/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/SearchPanelView.java
@@ -23,13 +23,14 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.speech.RecognizerIntent;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Slog;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.FrameLayout;
import com.android.internal.widget.multiwaveview.MultiWaveView;
@@ -146,6 +147,14 @@
}
}
+ private OnPreDrawListener mPreDrawListener = new ViewTreeObserver.OnPreDrawListener() {
+ public boolean onPreDraw() {
+ getViewTreeObserver().removeOnPreDrawListener(this);
+ mMultiWaveView.resumeAnimations();
+ return false;
+ }
+ };
+
public void show(final boolean show, boolean animate) {
if (animate) {
if (mShowing != show) {
@@ -156,16 +165,20 @@
mShowing = show;
onAnimationEnd(null);
}
- postDelayed(new Runnable() {
- public void run() {
- setVisibility(show ? View.VISIBLE : View.INVISIBLE);
- if (show) {
- setFocusable(true);
- setFocusableInTouchMode(true);
- requestFocus();
- }
+ if (show) {
+ if (getVisibility() != View.VISIBLE) {
+ setVisibility(View.VISIBLE);
+ // Don't start the animation until we've created the layer, which is done
+ // right before we are drawn
+ mMultiWaveView.suspendAnimations();
+ getViewTreeObserver().addOnPreDrawListener(mPreDrawListener);
}
- }, show ? 0 : 100);
+ setFocusable(true);
+ setFocusableInTouchMode(true);
+ requestFocus();
+ } else {
+ setVisibility(View.INVISIBLE);
+ }
}
public void hide(boolean animate) {
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 6584c7d..2d65dd6 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -186,6 +186,7 @@
public void removeLongPressCallback() {
if (mWatchLongPress != null) {
mHandler.removeCallbacks(mWatchLongPress);
+ mWatchLongPress = null;
}
}
@@ -245,6 +246,7 @@
mCurrView = null;
mCurrAnimView = null;
mLongPressSent = false;
+ removeLongPressCallback();
break;
}
return mDragging;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 4b223dd..a352748 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -531,30 +531,27 @@
}
}
catch (RuntimeException e) {
- exception = e;
- }
- if (expandedOneU == null && expandedLarge == null) {
final String ident = sbn.pkg + "/0x" + Integer.toHexString(sbn.id);
- Slog.e(TAG, "couldn't inflate view for notification " + ident, exception);
+ Slog.e(TAG, "couldn't inflate view for notification " + ident, e);
return false;
- } else {
- if (expandedOneU != null) {
- SizeAdaptiveLayout.LayoutParams params =
- new SizeAdaptiveLayout.LayoutParams(expandedOneU.getLayoutParams());
- params.minHeight = minHeight;
- params.maxHeight = minHeight;
- adaptive.addView(expandedOneU, params);
- }
- if (expandedLarge != null) {
- SizeAdaptiveLayout.LayoutParams params =
- new SizeAdaptiveLayout.LayoutParams(expandedLarge.getLayoutParams());
- params.minHeight = minHeight+1;
- params.maxHeight = maxHeight;
- adaptive.addView(expandedLarge, params);
- }
- row.setDrawingCacheEnabled(true);
}
+ if (expandedOneU != null) {
+ SizeAdaptiveLayout.LayoutParams params =
+ new SizeAdaptiveLayout.LayoutParams(expandedOneU.getLayoutParams());
+ params.minHeight = rowHeight;
+ params.maxHeight = rowHeight;
+ adaptive.addView(expandedOneU, params);
+ }
+ if (expandedLarge != null) {
+ SizeAdaptiveLayout.LayoutParams params =
+ new SizeAdaptiveLayout.LayoutParams(expandedLarge.getLayoutParams());
+ params.minHeight = rowHeight+1;
+ params.maxHeight = maxHeight;
+ adaptive.addView(expandedLarge, params);
+ }
+ row.setDrawingCacheEnabled(true);
+
applyLegacyRowBackground(sbn, content);
row.setTag(R.id.expandable_tag, Boolean.valueOf(large != null));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 2ea1827..4e6857e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -289,7 +289,7 @@
animateCollapse();
}
}
- return true;
+ return mStatusBarWindow.onTouchEvent(event);
}});
mStatusBarView = (PhoneStatusBarView) mStatusBarWindow.findViewById(R.id.status_bar);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 0fc5b4d..ed1b2f5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -18,17 +18,39 @@
import android.content.Context;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.KeyEvent;
+import android.view.MotionEvent;
import android.widget.FrameLayout;
import android.widget.TextSwitcher;
+import com.android.systemui.ExpandHelper;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NotificationRowLayout;
+
public class StatusBarWindowView extends FrameLayout
{
+ private static final String TAG = "StatusBarWindowView";
+
+ private ExpandHelper mExpandHelper;
+ private NotificationRowLayout latestItems;
+
PhoneStatusBar mService;
public StatusBarWindowView(Context context, AttributeSet attrs) {
super(context, attrs);
+ setMotionEventSplittingEnabled(false);
+ }
+
+ @Override
+ protected void onAttachedToWindow () {
+ super.onAttachedToWindow();
+ latestItems = (NotificationRowLayout) findViewById(R.id.latestItems);
+ int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height);
+ int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height);
+ mExpandHelper = new ExpandHelper(mContext, latestItems, minHeight, maxHeight);
+ mExpandHelper.setEventSource(this);
}
@Override
@@ -43,5 +65,25 @@
}
return super.dispatchKeyEvent(event);
}
+
+ @Override
+ public boolean onInterceptTouchEvent(MotionEvent ev) {
+ MotionEvent cancellation = MotionEvent.obtain(ev);
+ cancellation.setAction(MotionEvent.ACTION_CANCEL);
+
+ boolean intercept = mExpandHelper.onInterceptTouchEvent(ev) ||
+ super.onInterceptTouchEvent(ev);
+ if (intercept) {
+ latestItems.onInterceptTouchEvent(cancellation);
+ }
+ return intercept;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent ev) {
+ boolean handled = mExpandHelper.onTouchEvent(ev) ||
+ super.onTouchEvent(ev);
+ return handled;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
index a00fab3..bb0ce16 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java
@@ -52,6 +52,7 @@
int mCode;
int mTouchSlop;
Drawable mGlowBG;
+ int mGlowWidth, mGlowHeight;
float mGlowAlpha = 0f, mGlowScale = 1f, mDrawingAlpha = 1f;
boolean mSupportsLongpress = true;
RectF mRect = new RectF(0f,0f,0f,0f);
@@ -89,6 +90,8 @@
mGlowBG = a.getDrawable(R.styleable.KeyButtonView_glowBackground);
if (mGlowBG != null) {
setDrawingAlpha(BUTTON_QUIESCENT_ALPHA);
+ mGlowWidth = mGlowBG.getIntrinsicWidth();
+ mGlowHeight = mGlowBG.getIntrinsicHeight();
}
a.recycle();
@@ -103,8 +106,12 @@
canvas.save();
final int w = getWidth();
final int h = getHeight();
+ final float aspect = (float)mGlowWidth / mGlowHeight;
+ final int drawW = (int)(h*aspect);
+ final int drawH = h;
+ final int margin = (drawW-w)/2;
canvas.scale(mGlowScale, mGlowScale, w*0.5f, h*0.5f);
- mGlowBG.setBounds(0, 0, w, h);
+ mGlowBG.setBounds(-margin, 0, drawW-margin, drawH);
mGlowBG.setAlpha((int)(mDrawingAlpha * mGlowAlpha * 255));
mGlowBG.draw(canvas);
canvas.restore();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
index f41d99c..0284644 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
@@ -36,7 +36,6 @@
import android.widget.LinearLayout;
import com.android.systemui.ExpandHelper;
-import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.SwipeHelper;
import com.android.systemui.statusbar.NotificationData;
@@ -62,9 +61,6 @@
HashMap<View, ValueAnimator> mDisappearingViews = new HashMap<View, ValueAnimator>();
private SwipeHelper mSwipeHelper;
- private ExpandHelper mExpandHelper;
-
- private Gefingerpoken mCurrentHelper;
// Flag set during notification removal animation to avoid causing too much work until
// animation is done
@@ -81,8 +77,6 @@
setOrientation(LinearLayout.VERTICAL);
- setMotionEventSplittingEnabled(false);
-
if (DEBUG) {
setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() {
@Override
@@ -101,9 +95,6 @@
float densityScale = getResources().getDisplayMetrics().density;
float pagingTouchSlop = ViewConfiguration.get(mContext).getScaledPagingTouchSlop();
mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, pagingTouchSlop);
- int minHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_min_height);
- int maxHeight = getResources().getDimensionPixelSize(R.dimen.notification_row_max_height);
- mExpandHelper = new ExpandHelper(mContext, this, minHeight, maxHeight);
}
public void setLongPressListener(View.OnLongClickListener listener) {
@@ -135,39 +126,17 @@
if (DEBUG) Log.v(TAG, "onInterceptTouchEvent()");
if (DEBUG) logLayoutTransition();
- MotionEvent cancellation = MotionEvent.obtain(ev);
- cancellation.setAction(MotionEvent.ACTION_CANCEL);
-
- if (mSwipeHelper.onInterceptTouchEvent(ev)) {
- if (DEBUG) Log.v(TAG, "will swipe");
- mCurrentHelper = mSwipeHelper;
- mExpandHelper.onInterceptTouchEvent(cancellation);
- return true;
- } else if (mExpandHelper.onInterceptTouchEvent(ev)) {
- if (DEBUG) Log.v(TAG, "will stretch");
- mCurrentHelper = mExpandHelper;
- mSwipeHelper.onInterceptTouchEvent(cancellation);
- return true;
- } else {
- mCurrentHelper = null;
- if (super.onInterceptTouchEvent(ev)) {
- if (DEBUG) Log.v(TAG, "intercepting ourselves");
- mSwipeHelper.onInterceptTouchEvent(cancellation);
- mExpandHelper.onInterceptTouchEvent(cancellation);
- return true;
- }
- }
- return false;
+ return mSwipeHelper.onInterceptTouchEvent(ev) ||
+ super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (DEBUG) Log.v(TAG, "onTouchEvent()");
if (DEBUG) logLayoutTransition();
- if (mCurrentHelper != null) {
- return mCurrentHelper.onTouchEvent(ev);
- }
- return super.onTouchEvent(ev);
+
+ return mSwipeHelper.onTouchEvent(ev) ||
+ super.onTouchEvent(ev);
}
public boolean canChildBeDismissed(View v) {
@@ -202,6 +171,13 @@
public View getChildAtPosition(MotionEvent ev) {
return getChildAtPosition(ev.getX(), ev.getY());
}
+
+ public View getChildAtRawPosition(float touchX, float touchY) {
+ int[] location = new int[2];
+ getLocationOnScreen(location);
+ return getChildAtPosition((float) (touchX - location[0]), (float) (touchY - location[1]));
+ }
+
public View getChildAtPosition(float touchX, float touchY) {
// find the view under the pointer, accounting for GONE views
final int count = getChildCount();
diff --git a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
index 17e671d..9a6d2cc 100644
--- a/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/PatternUnlockScreen.java
@@ -41,7 +41,7 @@
class PatternUnlockScreen extends LinearLayoutWithDefaultTouchRecepient
implements KeyguardScreen {
- private static final boolean DEBUG = true; /* TODO: revert before JB release */
+ private static final boolean DEBUG = false;
private static final String TAG = "UnlockScreen";
// how long before we clear the wrong pattern
@@ -321,7 +321,6 @@
implements LockPatternView.OnPatternListener {
public void onPatternStart() {
- if (DEBUG) Log.d(TAG, "Got pattern start");
mLockPatternView.removeCallbacks(mCancelPatternRunnable);
}
@@ -337,7 +336,6 @@
// Give just a little extra time if they hit one of the first few dots
mCallback.pokeWakelock(UNLOCK_PATTERN_WAKE_INTERVAL_FIRST_DOTS_MS);
}
- if (DEBUG) Log.d(TAG, "Got pattern cell");
}
public void onPatternDetected(List<LockPatternView.Cell> pattern) {
diff --git a/services/input/EventHub.cpp b/services/input/EventHub.cpp
index 50bfee6..f80ac18 100644
--- a/services/input/EventHub.cpp
+++ b/services/input/EventHub.cpp
@@ -16,7 +16,7 @@
#define LOG_TAG "EventHub"
-#define LOG_NDEBUG 0
+// #define LOG_NDEBUG 0
#include "EventHub.h"
@@ -767,7 +767,11 @@
size_t count = size_t(readSize) / sizeof(struct input_event);
for (size_t i = 0; i < count; i++) {
const struct input_event& iev = readBuffer[i];
- nsecs_t delta = 0;
+ ALOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, value=%d",
+ device->path.string(),
+ (int) iev.time.tv_sec, (int) iev.time.tv_usec,
+ iev.type, iev.code, iev.value);
+
#ifdef HAVE_POSIX_CLOCKS
// Use the time specified in the event instead of the current time
// so that downstream code can get more accurate estimates of
@@ -782,23 +786,10 @@
// system call that also queries ktime_get_ts().
event->when = nsecs_t(iev.time.tv_sec) * 1000000000LL
+ nsecs_t(iev.time.tv_usec) * 1000LL;
- delta = now - event->when;
-
- // Only log verbose if events are older that 1ms
- if (delta > 1 * 1000000LL) {
- ALOGV("event time %lld, now %lld, delta %lldus", event->when, now, delta / 1000LL);
- }
+ ALOGV("event time %lld, now %lld", event->when, now);
#else
event->when = now;
#endif
- if (delta > 1 * 1000000LL) {
- ALOGV("%s got: t0=%d, t1=%d, type=%d, code=%d, value=%d",
- device->path.string(),
- (int) iev.time.tv_sec, (int) iev.time.tv_usec,
- iev.type, iev.code, iev.value);
- }
-
-
event->deviceId = deviceId;
event->type = iev.type;
event->code = iev.code;
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java
index 23f2fdd..df2e1aa 100644
--- a/services/java/com/android/server/AppWidgetServiceImpl.java
+++ b/services/java/com/android/server/AppWidgetServiceImpl.java
@@ -49,6 +49,7 @@
import android.util.Slog;
import android.util.TypedValue;
import android.util.Xml;
+import android.view.WindowManager;
import android.widget.RemoteViews;
import com.android.internal.appwidget.IAppWidgetHost;
@@ -171,6 +172,7 @@
boolean mSafeMode;
int mUserId;
boolean mStateLoaded;
+ int mMaxWidgetBitmapMemory;
// These are for debugging only -- widgets are going missing in some rare instances
ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>();
@@ -181,6 +183,14 @@
mPm = AppGlobals.getPackageManager();
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mUserId = userId;
+ computeMaximumWidgetBitmapMemory();
+ }
+
+ void computeMaximumWidgetBitmapMemory() {
+ WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
+ int height = wm.getDefaultDisplay().getRawHeight();
+ int width = wm.getDefaultDisplay().getRawWidth();
+ mMaxWidgetBitmapMemory = 4 * width * height;
}
public void systemReady(boolean safeMode) {
@@ -806,6 +816,15 @@
if (appWidgetIds == null) {
return;
}
+
+ int bitmapMemoryUsage = views.estimateMemoryUsage();
+ if (bitmapMemoryUsage > mMaxWidgetBitmapMemory) {
+ throw new IllegalArgumentException("RemoteViews for widget update exceeds maximum" +
+ " bitmap memory usage (used: " + bitmapMemoryUsage + ", max: " +
+ mMaxWidgetBitmapMemory + ") The total memory cannot exceed that required to" +
+ " fill the device's screen once.");
+ }
+
if (appWidgetIds.length == 0) {
return;
}
diff --git a/services/java/com/android/server/NativeDaemonConnector.java b/services/java/com/android/server/NativeDaemonConnector.java
index 6a6c585..a15d3bb 100644
--- a/services/java/com/android/server/NativeDaemonConnector.java
+++ b/services/java/com/android/server/NativeDaemonConnector.java
@@ -148,6 +148,7 @@
mCallbackHandler.sendMessage(mCallbackHandler.obtainMessage(
event.getCode(), event.getRawEvent()));
} else {
+ log("POST<- {" + rawEvent + "}");
mResponseQueue.add(event.getCmdNumber(), event);
}
} catch (IllegalArgumentException e) {
@@ -327,6 +328,7 @@
loge("timed-out waiting for response to " + logCmd);
throw new NativeDaemonFailureException(logCmd, event);
}
+ log("RMV <- {" + event + "}");
events.add(event);
} while (event.isClassContinue());
@@ -337,6 +339,7 @@
throw new NativeDaemonFailureException(logCmd, event);
}
+ log("RTN <- {" + logCmd + "}");
return events.toArray(new NativeDaemonEvent[events.size()]);
}
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index 4536a6d..e2852b5 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -166,7 +166,7 @@
}
mConnector = new NativeDaemonConnector(
- new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 50);
+ new NetdCallbackReceiver(), "netd", 10, NETD_TAG, 80);
mThread = new Thread(mConnector, NETD_TAG);
// Add ourself to the Watchdog monitors.
diff --git a/services/java/com/android/server/StatusBarManagerService.java b/services/java/com/android/server/StatusBarManagerService.java
index 8429086..78c0c12 100644
--- a/services/java/com/android/server/StatusBarManagerService.java
+++ b/services/java/com/android/server/StatusBarManagerService.java
@@ -489,7 +489,8 @@
synchronized (mNotifications) {
final StatusBarNotification n = mNotifications.remove(key);
if (n == null) {
- throw new IllegalArgumentException("removeNotification key not found: " + key);
+ Slog.e(TAG, "removeNotification key not found: " + key);
+ return;
}
if (mBar != null) {
try {
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index bb38cd9..b1558c7 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -562,6 +562,8 @@
*/
public synchronized boolean setWifiEnabled(boolean enable) {
enforceChangePermission();
+ Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
+ + ", uid=" + Binder.getCallingUid());
if (DBG) {
Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
}