summaryrefslogtreecommitdiffstats
path: root/core/java
diff options
context:
space:
mode:
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/app/Activity.java11
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java7
-rw-r--r--core/java/android/content/Intent.java54
-rw-r--r--core/java/android/preference/MultiSelectListPreference.java5
-rw-r--r--core/java/android/provider/CalendarContract.java11
-rw-r--r--core/java/android/webkit/WebViewClassic.java36
-rw-r--r--core/java/android/webkit/WebViewCore.java23
-rw-r--r--core/java/android/webkit/WebViewInputDispatcher.java17
-rw-r--r--core/java/android/webkit/ZoomManager.java6
9 files changed, 113 insertions, 57 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index ac55abe..69ee434 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -2713,7 +2713,16 @@ public class Activity extends ContextThemeWrapper
onCreateNavigateUpTaskStack(b);
onPrepareNavigateUpTaskStack(b);
b.startActivities();
- finishAffinity();
+
+ // We can't finishAffinity if we have a result.
+ // Fall back and simply finish the current activity instead.
+ if (mResultCode != RESULT_CANCELED || mResultData != null) {
+ // Tell the developer what's going on to avoid hair-pulling.
+ Log.i(TAG, "onNavigateUp only finishing topmost activity to return a result");
+ finish();
+ } else {
+ finishAffinity();
+ }
} else {
navigateUpTo(upIntent);
}
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index 01b68d4..ed95ae5 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -38,6 +38,7 @@ import android.util.SparseArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
@@ -523,6 +524,12 @@ public class AppWidgetHostView extends FrameLayout {
return tv;
}
+ @Override
+ public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(info);
+ info.setClassName(AppWidgetHostView.class.getName());
+ }
+
private static class ParcelableSparseArray extends SparseArray<Parcelable> implements Parcelable {
public int describeContents() {
return 0;
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index da09a18..718a917 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -808,13 +808,16 @@ public class Intent implements Parcelable, Cloneable {
* always present to the user a list of the things they can do, with a
* nice title given by the caller such as "Send this photo with:".
* <p>
+ * If you need to grant URI permissions through a chooser, you must specify
+ * the permissions to be granted on the ACTION_CHOOSER Intent
+ * <em>in addition</em> to the EXTRA_INTENT inside. This means using
+ * {@link #setClipData} to specify the URIs to be granted as well as
+ * {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
+ * {@link #FLAG_GRANT_WRITE_URI_PERMISSION} as appropriate.
+ * <p>
* As a convenience, an Intent of this form can be created with the
* {@link #createChooser} function.
* <p>
- * If the target {@link #EXTRA_INTENT} contains {@link ClipData}, you should
- * also copy it to this intent along with relevant flags, such as
- * {@link #FLAG_GRANT_READ_URI_PERMISSION}.
- * <p>
* Input: No data should be specified. get*Extra must have
* a {@link #EXTRA_INTENT} field containing the Intent being executed,
* and can optionally have a {@link #EXTRA_TITLE} field containing the
@@ -828,6 +831,14 @@ public class Intent implements Parcelable, Cloneable {
/**
* Convenience function for creating a {@link #ACTION_CHOOSER} Intent.
*
+ * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given
+ * target intent, also optionally supplying a title. If the target
+ * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or
+ * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be
+ * set in the returned chooser intent, with its ClipData set appropriately:
+ * either a direct reflection of {@link #getClipData()} if that is non-null,
+ * or a new ClipData build from {@link #getData()}.
+ *
* @param target The Intent that the user will be selecting an activity
* to perform.
* @param title Optional title that will be displayed in the chooser.
@@ -843,12 +854,26 @@ public class Intent implements Parcelable, Cloneable {
}
// Migrate any clip data and flags from target.
- final ClipData targetClipData = target.getClipData();
- if (targetClipData != null) {
- intent.setClipData(targetClipData);
- intent.addFlags(target.getFlags()
- & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION));
+ int permFlags = target.getFlags()
+ & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION);
+ if (permFlags != 0) {
+ ClipData targetClipData = target.getClipData();
+ if (targetClipData == null && target.getData() != null) {
+ ClipData.Item item = new ClipData.Item(target.getData());
+ String[] mimeTypes;
+ if (target.getType() != null) {
+ mimeTypes = new String[] { target.getType() };
+ } else {
+ mimeTypes = new String[] { };
+ }
+ targetClipData = new ClipData(null, mimeTypes, item);
+ }
+ if (targetClipData != null) {
+ intent.setClipData(targetClipData);
+ intent.addFlags(permFlags);
+ }
}
+
return intent;
}
@@ -3078,6 +3103,17 @@ public class Intent implements Parcelable, Cloneable {
*/
public static final int FLAG_ACTIVITY_TASK_ON_HOME = 0X00004000;
/**
+ * If set in an Intent passed to {@link Context#startActivity Context.startActivity()},
+ * upon starting the activity the system will also clear any system dialogs that
+ * are currently shown. This is intended primarily for any actions that are
+ * associated with buttons in a notification: tapping on the button to launch
+ * the activity needs to also dismiss the notification window (which is one
+ * of the system dialogs); setting this flag on the Intent associated with that
+ * action will ensure that and other system dialogs are dismissed so that the
+ * user arrives in the new activity.
+ */
+ public static final int FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS = 0X00002000;
+ /**
* If set, when sending a broadcast only registered receivers will be
* called -- no BroadcastReceiver components will be launched.
*/
diff --git a/core/java/android/preference/MultiSelectListPreference.java b/core/java/android/preference/MultiSelectListPreference.java
index 2e8d551..553ce80 100644
--- a/core/java/android/preference/MultiSelectListPreference.java
+++ b/core/java/android/preference/MultiSelectListPreference.java
@@ -125,8 +125,9 @@ public class MultiSelectListPreference extends DialogPreference {
* @param values The values to set for the key.
*/
public void setValues(Set<String> values) {
- mValues = values;
-
+ mValues.clear();
+ mValues.addAll(values);
+
persistStringSet(values);
}
diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java
index 09bf42b..1ef0916 100644
--- a/core/java/android/provider/CalendarContract.java
+++ b/core/java/android/provider/CalendarContract.java
@@ -105,6 +105,17 @@ public final class CalendarContract {
* and it should call {@link Activity#setResult(int)} with
* {@link Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} to
* acknowledge whether the action was handled or not.
+ *
+ * The custom app should have an intent-filter like the following
+ * <pre>
+ * {@code
+ * <intent-filter>
+ * <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" />
+ * <category android:name="android.intent.category.DEFAULT" />
+ * <data android:mimeType="vnd.android.cursor.item/event" />
+ * </intent-filter>
+ * }
+ * </pre>
* <p>
* Input: {@link Intent#getData} has the event URI. The extra
* {@link #EXTRA_EVENT_BEGIN_TIME} has the start time of the instance. The
diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java
index 5d42da1..f1f3db2 100644
--- a/core/java/android/webkit/WebViewClassic.java
+++ b/core/java/android/webkit/WebViewClassic.java
@@ -1716,6 +1716,10 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
mZoomManager.updateDefaultZoomDensity(density);
}
+ /* package */ int getScaledNavSlop() {
+ return viewToContentDimension(mNavSlop);
+ }
+
/* package */ boolean onSavePassword(String schemePlusHost, String username,
String password, final Message resumeMsg) {
boolean rVal = false;
@@ -2939,6 +2943,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
// premature data from webkit, ignore
if ((w | h) == 0) {
+ invalidate();
return;
}
@@ -2951,10 +2956,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
// updated when we get out of that mode.
if (!mDrawHistory) {
// repin our scroll, taking into account the new content size
- if (updateScrollCoordinates(pinLocX(getScrollX()),
- pinLocY(getScrollY()))) {
- invalidate();
- }
+ updateScrollCoordinates(pinLocX(getScrollX()), pinLocY(getScrollY()));
if (!mScroller.isFinished()) {
// We are in the middle of a scroll. Repin the final scroll
// position.
@@ -2962,6 +2964,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
mScroller.setFinalY(pinLocY(mScroller.getFinalY()));
}
}
+ invalidate();
}
contentSizeChanged(updateLayout);
}
@@ -4339,10 +4342,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
private void removeTouchHighlight() {
- if (mWebViewCore != null) {
- mWebViewCore.removeMessages(EventHub.HIT_TEST);
- }
- mPrivateHandler.removeMessages(HIT_TEST_RESULT);
setTouchHighlightRects(null);
}
@@ -5817,7 +5816,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
switch (action) {
case MotionEvent.ACTION_DOWN: {
mConfirmMove = false;
- mInitialHitTestResult = null;
if (!mEditTextScroller.isFinished()) {
mEditTextScroller.abortAnimation();
}
@@ -5839,23 +5837,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
} else { // the normal case
mTouchMode = TOUCH_INIT_MODE;
- // TODO: Have WebViewInputDispatch handle this
- TouchHighlightData data = new TouchHighlightData();
- data.mX = contentX;
- data.mY = contentY;
- data.mNativeLayerRect = new Rect();
- if (mNativeClass != 0) {
- data.mNativeLayer = nativeScrollableLayer(mNativeClass,
- contentX, contentY, data.mNativeLayerRect, null);
- } else {
- data.mNativeLayer = 0;
- }
- data.mSlop = viewToContentDimension(mNavSlop);
- removeTouchHighlight();
- if (!mBlockWebkitViewMessages && mWebViewCore != null) {
- mWebViewCore.sendMessageAtFrontOfQueue(
- EventHub.HIT_TEST, data);
- }
if (mLogEvent && eventTime - mLastTouchUpTime < 1000) {
EventLog.writeEvent(EventLogTags.BROWSER_DOUBLE_TAP_DURATION,
(eventTime - mLastTouchUpTime), eventTime);
@@ -7956,7 +7937,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc
}
// update the zoom information based on the new picture
- mZoomManager.onNewPicture(draw);
+ if (mZoomManager.onNewPicture(draw))
+ invalidate();
if (isPictureAfterFirstLayout) {
mViewManager.postReadyToDrawAll();
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 7aa9a0b..76cd1c9 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -1143,8 +1143,6 @@ public final class WebViewCore {
static final int ADD_PACKAGE_NAME = 185;
static final int REMOVE_PACKAGE_NAME = 186;
- static final int HIT_TEST = 187;
-
// accessibility support
static final int MODIFY_SELECTION = 190;
@@ -1648,18 +1646,6 @@ public final class WebViewCore {
(Set<String>) msg.obj);
break;
- case HIT_TEST:
- TouchHighlightData d = (TouchHighlightData) msg.obj;
- if (d.mNativeLayer != 0) {
- nativeScrollLayer(mNativeClass,
- d.mNativeLayer, d.mNativeLayerRect);
- }
- WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true);
- mWebViewClassic.mPrivateHandler.obtainMessage(
- WebViewClassic.HIT_TEST_RESULT, hit)
- .sendToTarget();
- break;
-
case SET_USE_MOCK_DEVICE_ORIENTATION:
setUseMockDeviceOrientation();
break;
@@ -1792,6 +1778,15 @@ public final class WebViewCore {
return false;
}
switch (eventType) {
+ case WebViewInputDispatcher.EVENT_TYPE_HIT_TEST:
+ int x = Math.round(event.getX());
+ int y = Math.round(event.getY());
+ WebKitHitTest hit = performHitTest(x, y,
+ mWebViewClassic.getScaledNavSlop(), true);
+ mWebViewClassic.mPrivateHandler.obtainMessage(
+ WebViewClassic.HIT_TEST_RESULT, hit).sendToTarget();
+ return false;
+
case WebViewInputDispatcher.EVENT_TYPE_CLICK:
return nativeMouseClick(mNativeClass);
diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java
index 9328d8c..9eeb311 100644
--- a/core/java/android/webkit/WebViewInputDispatcher.java
+++ b/core/java/android/webkit/WebViewInputDispatcher.java
@@ -204,6 +204,11 @@ final class WebViewInputDispatcher {
public static final int EVENT_TYPE_DOUBLE_TAP = 5;
/**
+ * Event type: Indicates that a hit test should be performed
+ */
+ public static final int EVENT_TYPE_HIT_TEST = 6;
+
+ /**
* Flag: This event is private to this queue. Do not forward it.
*/
public static final int FLAG_PRIVATE = 1 << 0;
@@ -499,13 +504,17 @@ final class WebViewInputDispatcher {
}
private void enqueueDoubleTapLocked(MotionEvent event) {
- unscheduleClickLocked();
- hideTapCandidateLocked();
MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event);
DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_DOUBLE_TAP, 0,
mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale);
enqueueEventLocked(d);
- mIsDoubleTapCandidate = false;
+ }
+
+ private void enqueueHitTestLocked(MotionEvent event) {
+ MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event);
+ DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_HIT_TEST, 0,
+ mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale);
+ enqueueEventLocked(d);
}
private void checkForSlopLocked(MotionEvent event) {
@@ -545,6 +554,7 @@ final class WebViewInputDispatcher {
mInitialDownX = event.getX();
mInitialDownY = event.getY();
scheduleShowTapHighlightLocked();
+ enqueueHitTestLocked(event);
} else if (action == MotionEvent.ACTION_UP) {
unscheduleLongPressLocked();
if (isClickCandidateLocked(event)) {
@@ -824,6 +834,7 @@ final class WebViewInputDispatcher {
case EVENT_TYPE_CLICK:
case EVENT_TYPE_HOVER:
case EVENT_TYPE_SCROLL:
+ case EVENT_TYPE_HIT_TEST:
return false;
case EVENT_TYPE_TOUCH:
return !mPostSendTouchEventsToWebKit
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 2247678..1da59e4 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -1008,8 +1008,10 @@ class ZoomManager {
/**
* Updates zoom values when Webkit produces a new picture. This method
* should only be called from the UI thread's message handler.
+ *
+ * @return True if zoom value has changed
*/
- public void onNewPicture(WebViewCore.DrawData drawData) {
+ public boolean onNewPicture(WebViewCore.DrawData drawData) {
final int viewWidth = mWebView.getViewWidth();
final boolean zoomOverviewWidthChanged = setupZoomOverviewWidth(drawData, viewWidth);
final float newZoomOverviewScale = getZoomOverviewScale();
@@ -1056,6 +1058,8 @@ class ZoomManager {
// so next new picture could be forced into overview mode if it's true.
mInitialZoomOverview = mInZoomOverview;
}
+
+ return scaleHasDiff;
}
/**