summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/java/android/content/ComponentName.java52
-rw-r--r--core/java/android/content/pm/PackageParser.java80
-rw-r--r--core/java/android/content/pm/ResolveInfo.java22
-rw-r--r--core/java/android/printservice/PrintService.java40
-rw-r--r--core/java/android/transition/TextChange.java50
-rw-r--r--core/java/android/transition/Transition.java6
-rw-r--r--core/java/android/widget/AbsListView.java15
-rw-r--r--core/java/android/widget/FastScroller.java2
-rw-r--r--core/java/android/widget/ListView.java2
-rw-r--r--core/java/android/widget/PopupMenu.java13
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java23
-rw-r--r--core/java/com/android/internal/transition/ActionBarTransition.java33
-rw-r--r--core/java/com/android/internal/util/FastPrintWriter.java71
-rw-r--r--core/java/com/android/internal/view/menu/ActionMenuPresenter.java4
-rw-r--r--core/java/com/android/internal/widget/ActionBarView.java18
-rw-r--r--core/res/res/drawable-hdpi/ic_contact_picture.pngbin5929 -> 1575 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.pngbin697 -> 728 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.pngbin7367 -> 4095 bytes
-rw-r--r--core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.pngbin7343 -> 7311 bytes
-rw-r--r--core/res/res/drawable-hdpi/toast_frame.9.pngbin1319 -> 1053 bytes
-rw-r--r--core/res/res/drawable-hdpi/toast_frame_holo.9.pngbin1585 -> 1053 bytes
-rw-r--r--core/res/res/drawable-mdpi/ic_contact_picture.pngbin4733 -> 959 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.pngbin523 -> 591 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.pngbin4021 -> 2352 bytes
-rw-r--r--core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.pngbin4025 -> 4166 bytes
-rw-r--r--core/res/res/drawable-mdpi/stat_notify_more.pngbin603 -> 849 bytes
-rw-r--r--core/res/res/drawable-mdpi/toast_frame.9.pngbin839 -> 666 bytes
-rw-r--r--core/res/res/drawable-mdpi/toast_frame_holo.9.pngbin985 -> 666 bytes
-rw-r--r--core/res/res/drawable-xhdpi/ic_contact_picture.pngbin7422 -> 2451 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.pngbin923 -> 953 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.pngbin11439 -> 5601 bytes
-rw-r--r--core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.pngbin11335 -> 11692 bytes
-rw-r--r--core/res/res/drawable-xhdpi/toast_frame.9.pngbin1956 -> 1557 bytes
-rw-r--r--core/res/res/drawable-xhdpi/toast_frame_holo.9.pngbin2342 -> 1557 bytes
-rw-r--r--packages/DocumentsUI/res/drawable/item_background.xml18
-rw-r--r--packages/DocumentsUI/res/layout/fragment_directory.xml1
-rw-r--r--packages/DocumentsUI/res/values/dimens.xml4
-rw-r--r--packages/DocumentsUI/res/values/strings.xml2
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java2
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java12
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java71
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java22
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java24
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/TestActivity.java27
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java56
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java25
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java10
-rw-r--r--packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java2
-rw-r--r--services/java/com/android/server/IntentResolver.java35
-rw-r--r--services/java/com/android/server/PreferredComponent.java9
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java3
-rwxr-xr-xservices/java/com/android/server/pm/PackageManagerService.java8
-rw-r--r--services/java/com/android/server/print/RemotePrintService.java17
-rw-r--r--services/java/com/android/server/print/UserState.java17
-rw-r--r--services/java/com/android/server/wm/WindowManagerService.java6
55 files changed, 615 insertions, 187 deletions
diff --git a/core/java/android/content/ComponentName.java b/core/java/android/content/ComponentName.java
index 7ca0f01..547a2c3 100644
--- a/core/java/android/content/ComponentName.java
+++ b/core/java/android/content/ComponentName.java
@@ -18,6 +18,8 @@ package android.content;
import android.os.Parcel;
import android.os.Parcelable;
+
+import java.io.PrintWriter;
import java.lang.Comparable;
/**
@@ -109,6 +111,32 @@ public final class ComponentName implements Parcelable, Cloneable, Comparable<Co
return mClass;
}
+ private static void appendShortClassName(StringBuilder sb, String packageName,
+ String className) {
+ if (className.startsWith(packageName)) {
+ int PN = packageName.length();
+ int CN = className.length();
+ if (CN > PN && className.charAt(PN) == '.') {
+ sb.append(className, PN, CN);
+ return;
+ }
+ }
+ sb.append(className);
+ }
+
+ private static void printShortClassName(PrintWriter pw, String packageName,
+ String className) {
+ if (className.startsWith(packageName)) {
+ int PN = packageName.length();
+ int CN = className.length();
+ if (CN > PN && className.charAt(PN) == '.') {
+ pw.write(className, PN, CN-PN);
+ return;
+ }
+ }
+ pw.print(className);
+ }
+
/**
* Return a String that unambiguously describes both the package and
* class names contained in the ComponentName. You can later recover
@@ -137,9 +165,29 @@ public final class ComponentName implements Parcelable, Cloneable, Comparable<Co
* @see #unflattenFromString(String)
*/
public String flattenToShortString() {
- return mPackage + "/" + getShortClassName();
+ StringBuilder sb = new StringBuilder(mPackage.length() + mClass.length());
+ appendShortString(sb, mPackage, mClass);
+ return sb.toString();
}
-
+
+ /** @hide */
+ public void appendShortString(StringBuilder sb) {
+ appendShortString(sb, mPackage, mClass);
+ }
+
+ /** @hide */
+ public static void appendShortString(StringBuilder sb, String packageName, String className) {
+ sb.append(packageName).append('/');
+ appendShortClassName(sb, packageName, className);
+ }
+
+ /** @hide */
+ public static void printShortString(PrintWriter pw, String packageName, String className) {
+ pw.print(packageName);
+ pw.print('/');
+ printShortClassName(pw, packageName, className);
+ }
+
/**
* Recover a ComponentName from a String that was previously created with
* {@link #flattenToString()}. It splits the string at the first '/',
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 2e25177..b489ee9 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -39,6 +39,7 @@ import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.io.PrintWriter;
import java.lang.ref.WeakReference;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
@@ -3707,18 +3708,15 @@ public class PackageParser {
}
return componentName;
}
-
- public String getComponentShortName() {
- if (componentShortName != null) {
- return componentShortName;
- }
- ComponentName component = getComponentName();
- if (component != null) {
- componentShortName = component.flattenToShortString();
- }
- return componentShortName;
+
+ public void appendComponentShortName(StringBuilder sb) {
+ ComponentName.appendShortString(sb, owner.applicationInfo.packageName, className);
}
-
+
+ public void printComponentShortName(PrintWriter pw) {
+ ComponentName.printShortString(pw, owner.applicationInfo.packageName, className);
+ }
+
public void setPackageName(String packageName) {
componentName = null;
componentShortName = null;
@@ -3917,9 +3915,13 @@ public class PackageParser {
}
public String toString() {
- return "Activity{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + getComponentShortName() + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("Activity{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
@@ -3954,9 +3956,13 @@ public class PackageParser {
}
public String toString() {
- return "Service{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + getComponentShortName() + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("Service{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
@@ -3999,9 +4005,13 @@ public class PackageParser {
}
public String toString() {
- return "Provider{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + info.name + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("Provider{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
@@ -4040,9 +4050,13 @@ public class PackageParser {
}
public String toString() {
- return "Instrumentation{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + getComponentShortName() + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("Instrumentation{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
@@ -4074,9 +4088,13 @@ public class PackageParser {
}
public String toString() {
- return "ActivityIntentInfo{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + activity.info.name + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("ActivityIntentInfo{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ activity.appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
@@ -4088,9 +4106,13 @@ public class PackageParser {
}
public String toString() {
- return "ServiceIntentInfo{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + service.info.name + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("ServiceIntentInfo{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ service.appendComponentShortName(sb);
+ sb.append('}');
+ return sb.toString();
}
}
diff --git a/core/java/android/content/pm/ResolveInfo.java b/core/java/android/content/pm/ResolveInfo.java
index de8e256..e360e40 100644
--- a/core/java/android/content/pm/ResolveInfo.java
+++ b/core/java/android/content/pm/ResolveInfo.java
@@ -16,6 +16,7 @@
package android.content.pm;
+import android.content.ComponentName;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
@@ -247,10 +248,23 @@ public class ResolveInfo implements Parcelable {
public String toString() {
ComponentInfo ci = activityInfo != null ? activityInfo : serviceInfo;
- return "ResolveInfo{"
- + Integer.toHexString(System.identityHashCode(this))
- + " " + ci.name + " p=" + priority + " o="
- + preferredOrder + " m=0x" + Integer.toHexString(match) + "}";
+ StringBuilder sb = new StringBuilder(128);
+ sb.append("ResolveInfo{");
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(' ');
+ ComponentName.appendShortString(sb, ci.packageName, ci.name);
+ if (priority != 0) {
+ sb.append(" p=");
+ sb.append(priority);
+ }
+ if (preferredOrder != 0) {
+ sb.append(" o=");
+ sb.append(preferredOrder);
+ }
+ sb.append(" m=0x");
+ sb.append(Integer.toHexString(match));
+ sb.append('}');
+ return sb.toString();
}
public int describeContents() {
diff --git a/core/java/android/printservice/PrintService.java b/core/java/android/printservice/PrintService.java
index e5ebf77..e73a53b 100644
--- a/core/java/android/printservice/PrintService.java
+++ b/core/java/android/printservice/PrintService.java
@@ -383,6 +383,10 @@ public abstract class PrintService extends Service {
final int action = message.what;
switch (action) {
case MSG_CREATE_PRINTER_DISCOVERY_SESSION: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_CREATE_PRINTER_DISCOVERY_SESSION "
+ + getPackageName());
+ }
PrinterDiscoverySession session = onCreatePrinterDiscoverySession();
if (session == null) {
throw new NullPointerException("session cannot be null");
@@ -396,6 +400,10 @@ public abstract class PrintService extends Service {
} break;
case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_DESTROY_PRINTER_DISCOVERY_SESSION "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
mDiscoverySession.destroy();
mDiscoverySession = null;
@@ -403,6 +411,10 @@ public abstract class PrintService extends Service {
} break;
case MSG_START_PRINTER_DISCOVERY: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_START_PRINTER_DISCOVERY "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj;
mDiscoverySession.startPrinterDiscovery(priorityList);
@@ -410,12 +422,20 @@ public abstract class PrintService extends Service {
} break;
case MSG_STOP_PRINTER_DISCOVERY: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_STOP_PRINTER_DISCOVERY "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
mDiscoverySession.stopPrinterDiscovery();
}
} break;
case MSG_VALIDATE_PRINTERS: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_VALIDATE_PRINTERS "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
List<PrinterId> printerIds = (List<PrinterId>) message.obj;
mDiscoverySession.validatePrinters(printerIds);
@@ -423,6 +443,10 @@ public abstract class PrintService extends Service {
} break;
case MSG_START_PRINTER_STATE_TRACKING: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_START_PRINTER_STATE_TRACKING "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
PrinterId printerId = (PrinterId) message.obj;
mDiscoverySession.startPrinterStateTracking(printerId);
@@ -430,6 +454,10 @@ public abstract class PrintService extends Service {
} break;
case MSG_STOP_PRINTER_STATE_TRACKING: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_STOP_PRINTER_STATE_TRACKING "
+ + getPackageName());
+ }
if (mDiscoverySession != null) {
PrinterId printerId = (PrinterId) message.obj;
mDiscoverySession.stopPrinterStateTracking(printerId);
@@ -437,11 +465,19 @@ public abstract class PrintService extends Service {
} break;
case MSG_ON_REQUEST_CANCEL_PRINTJOB: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_ON_REQUEST_CANCEL_PRINTJOB "
+ + getPackageName());
+ }
PrintJobInfo printJobInfo = (PrintJobInfo) message.obj;
onRequestCancelPrintJob(new PrintJob(printJobInfo, mClient));
} break;
case MSG_ON_PRINTJOB_QUEUED: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_ON_PRINTJOB_QUEUED "
+ + getPackageName());
+ }
PrintJobInfo printJobInfo = (PrintJobInfo) message.obj;
if (DEBUG) {
Log.i(LOG_TAG, "Queued: " + printJobInfo);
@@ -450,6 +486,10 @@ public abstract class PrintService extends Service {
} break;
case MSG_SET_CLEINT: {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "MSG_SET_CLEINT "
+ + getPackageName());
+ }
mClient = (IPrintServiceClient) message.obj;
if (mClient != null) {
onConnected();
diff --git a/core/java/android/transition/TextChange.java b/core/java/android/transition/TextChange.java
index fa2f548..cf190a1 100644
--- a/core/java/android/transition/TextChange.java
+++ b/core/java/android/transition/TextChange.java
@@ -23,6 +23,7 @@ import android.animation.ValueAnimator;
import android.graphics.Color;
import android.util.Log;
import android.view.ViewGroup;
+import android.widget.EditText;
import android.widget.TextView;
import java.util.Map;
@@ -41,6 +42,10 @@ public class TextChange extends Transition {
private static final String LOG_TAG = "TextChange";
private static final String PROPNAME_TEXT = "android:textchange:text";
+ private static final String PROPNAME_TEXT_SELECTION_START =
+ "android:textchange:textSelectionStart";
+ private static final String PROPNAME_TEXT_SELECTION_END =
+ "android:textchange:textSelectionEnd";
private static final String PROPNAME_TEXT_COLOR = "android:textchange:textColor";
private int mChangeBehavior = CHANGE_BEHAVIOR_KEEP;
@@ -84,7 +89,9 @@ public class TextChange extends Transition {
public static final int CHANGE_BEHAVIOR_OUT_IN = 3;
private static final String[] sTransitionProperties = {
- PROPNAME_TEXT
+ PROPNAME_TEXT,
+ PROPNAME_TEXT_SELECTION_START,
+ PROPNAME_TEXT_SELECTION_END
};
/**
@@ -122,6 +129,12 @@ public class TextChange extends Transition {
if (transitionValues.view instanceof TextView) {
TextView textview = (TextView) transitionValues.view;
transitionValues.values.put(PROPNAME_TEXT, textview.getText());
+ if (textview instanceof EditText) {
+ transitionValues.values.put(PROPNAME_TEXT_SELECTION_START,
+ textview.getSelectionStart());
+ transitionValues.values.put(PROPNAME_TEXT_SELECTION_END,
+ textview.getSelectionEnd());
+ }
if (mChangeBehavior > CHANGE_BEHAVIOR_KEEP) {
transitionValues.values.put(PROPNAME_TEXT_COLOR, textview.getCurrentTextColor());
}
@@ -152,8 +165,24 @@ public class TextChange extends Transition {
(CharSequence) startVals.get(PROPNAME_TEXT) : "";
final CharSequence endText = endVals.get(PROPNAME_TEXT) != null ?
(CharSequence) endVals.get(PROPNAME_TEXT) : "";
+ final int startSelectionStart, startSelectionEnd, endSelectionStart, endSelectionEnd;
+ if (view instanceof EditText) {
+ startSelectionStart = startVals.get(PROPNAME_TEXT_SELECTION_START) != null ?
+ (Integer) startVals.get(PROPNAME_TEXT_SELECTION_START) : -1;
+ startSelectionEnd = startVals.get(PROPNAME_TEXT_SELECTION_END) != null ?
+ (Integer) startVals.get(PROPNAME_TEXT_SELECTION_END) : startSelectionStart;
+ endSelectionStart = endVals.get(PROPNAME_TEXT_SELECTION_START) != null ?
+ (Integer) endVals.get(PROPNAME_TEXT_SELECTION_START) : -1;
+ endSelectionEnd = endVals.get(PROPNAME_TEXT_SELECTION_END) != null ?
+ (Integer) endVals.get(PROPNAME_TEXT_SELECTION_END) : endSelectionStart;
+ } else {
+ startSelectionStart = startSelectionEnd = endSelectionStart = endSelectionEnd = -1;
+ }
if (!startText.equals(endText)) {
view.setText(startText);
+ if (view instanceof EditText) {
+ setSelection(((EditText) view), startSelectionStart, startSelectionEnd);
+ }
Animator anim;
if (mChangeBehavior == CHANGE_BEHAVIOR_KEEP) {
anim = ValueAnimator.ofFloat(0, 1);
@@ -163,6 +192,9 @@ public class TextChange extends Transition {
if (startText.equals(view.getText())) {
// Only set if it hasn't been changed since anim started
view.setText(endText);
+ if (view instanceof EditText) {
+ setSelection(((EditText) view), endSelectionStart, endSelectionEnd);
+ }
}
}
});
@@ -188,6 +220,10 @@ public class TextChange extends Transition {
if (startText.equals(view.getText())) {
// Only set if it hasn't been changed since anim started
view.setText(endText);
+ if (view instanceof EditText) {
+ setSelection(((EditText) view), endSelectionStart,
+ endSelectionEnd);
+ }
}
}
});
@@ -220,11 +256,17 @@ public class TextChange extends Transition {
@Override
public void onTransitionPause(Transition transition) {
view.setText(endText);
+ if (view instanceof EditText) {
+ setSelection(((EditText) view), endSelectionStart, endSelectionEnd);
+ }
}
@Override
public void onTransitionResume(Transition transition) {
view.setText(startText);
+ if (view instanceof EditText) {
+ setSelection(((EditText) view), startSelectionStart, startSelectionEnd);
+ }
}
};
addListener(transitionListener);
@@ -235,4 +277,10 @@ public class TextChange extends Transition {
}
return null;
}
+
+ private void setSelection(EditText editText, int start, int end) {
+ if (start >= 0 && end >= 0) {
+ editText.setSelection(start, end);
+ }
+ }
}
diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java
index 4a99153..a552fd4 100644
--- a/core/java/android/transition/Transition.java
+++ b/core/java/android/transition/Transition.java
@@ -1094,7 +1094,11 @@ public abstract class Transition implements Cloneable {
}
TransitionValues values = new TransitionValues();
values.view = view;
- captureStartValues(values);
+ if (start) {
+ captureStartValues(values);
+ } else {
+ captureEndValues(values);
+ }
if (start) {
if (!isListViewItem) {
mStartValues.viewValues.put(view, values);
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 7378d74..41a8fd1 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -675,11 +675,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private int mLastAccessibilityScrollEventToIndex;
/**
- * Track if we are currently attached to a window.
- */
- boolean mIsAttached;
-
- /**
* Track the item count from the last time we handled a data change.
*/
private int mLastHandledItemCount;
@@ -1904,7 +1899,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
if (gainFocus && mSelectedPosition < 0 && !isInTouchMode()) {
- if (!mIsAttached && mAdapter != null) {
+ if (!isAttachedToWindow() && mAdapter != null) {
// Data may have changed while we were detached and it's valid
// to change focus while detached. Refresh so we don't die.
mDataChanged = true;
@@ -2715,7 +2710,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mOldItemCount = mItemCount;
mItemCount = mAdapter.getCount();
}
- mIsAttached = true;
}
@Override
@@ -2770,7 +2764,6 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
removeCallbacks(mTouchModeReset);
mTouchModeReset.run();
}
- mIsAttached = false;
}
@Override
@@ -3397,7 +3390,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mPositionScroller.stop();
}
- if (!mIsAttached) {
+ if (!isAttachedToWindow()) {
// Something isn't right.
// Since we rely on being attached to get data set change notifications,
// don't risk doing anything where we might try to resync and find things
@@ -3636,7 +3629,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mTouchMode = TOUCH_MODE_REST;
child.setPressed(false);
setPressed(false);
- if (!mDataChanged) {
+ if (!mDataChanged && isAttachedToWindow()) {
performClick.run();
}
}
@@ -3911,7 +3904,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
mPositionScroller.stop();
}
- if (!mIsAttached) {
+ if (!isAttachedToWindow()) {
// Something isn't right.
// Since we rely on being attached to get data set change notifications,
// don't risk doing anything where we might try to resync and find things
diff --git a/core/java/android/widget/FastScroller.java b/core/java/android/widget/FastScroller.java
index 006b96e..e2f6d7d 100644
--- a/core/java/android/widget/FastScroller.java
+++ b/core/java/android/widget/FastScroller.java
@@ -210,7 +210,7 @@ class FastScroller {
private final Runnable mDeferStartDrag = new Runnable() {
@Override
public void run() {
- if (mList.mIsAttached) {
+ if (mList.isAttachedToWindow()) {
beginDrag();
final float pos = getPosFromMotionEvent(mInitialTouchY);
diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java
index b239fbd..4b00f90 100644
--- a/core/java/android/widget/ListView.java
+++ b/core/java/android/widget/ListView.java
@@ -2122,7 +2122,7 @@ public class ListView extends AbsListView {
}
private boolean commonKey(int keyCode, int count, KeyEvent event) {
- if (mAdapter == null || !mIsAttached) {
+ if (mAdapter == null || !isAttachedToWindow()) {
return false;
}
diff --git a/core/java/android/widget/PopupMenu.java b/core/java/android/widget/PopupMenu.java
index 603db70..9ac6a59 100644
--- a/core/java/android/widget/PopupMenu.java
+++ b/core/java/android/widget/PopupMenu.java
@@ -93,7 +93,20 @@ public class PopupMenu implements MenuBuilder.Callback, MenuPresenter.Callback {
if (mDragListener == null) {
mDragListener = new ForwardingListener(mAnchor) {
@Override
+ protected boolean onForwardingStarted() {
+ show();
+ return true;
+ }
+
+ @Override
+ protected boolean onForwardingStopped() {
+ dismiss();
+ return true;
+ }
+
+ @Override
public ListPopupWindow getPopup() {
+ // This will be null until show() is called.
return mPopup.getPopup();
}
};
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index 497c0c6..05fd613 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -28,7 +28,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
-import android.content.pm.IPackageManager;
import android.content.pm.LabeledIntent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -89,6 +88,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
private Intent makeMyIntent() {
Intent intent = new Intent(getIntent());
+ intent.setComponent(null);
// The resolver activity is set to be hidden from recent tasks.
// we don't want this attribute to be propagated to the next activity
// being launched. Note that if the original Intent also had this
@@ -119,7 +119,6 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
mPm = getPackageManager();
mAlwaysUseOption = alwaysUseOption;
mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns);
- intent.setComponent(null);
AlertController.AlertParams ap = mAlertParams;
@@ -290,7 +289,7 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
}
protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) {
- if (mAlwaysUseOption) {
+ if (mAlwaysUseOption && mAdapter.mOrigResolveList != null) {
// Build a reasonable intent filter, based on what matched.
IntentFilter filter = new IntentFilter();
@@ -367,11 +366,11 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
}
if (filter != null) {
- final int N = mAdapter.mList.size();
+ final int N = mAdapter.mOrigResolveList.size();
ComponentName[] set = new ComponentName[N];
int bestMatch = 0;
for (int i=0; i<N; i++) {
- ResolveInfo r = mAdapter.mList.get(i).ri;
+ ResolveInfo r = mAdapter.mOrigResolveList.get(i);
set[i] = new ComponentName(r.activityInfo.packageName,
r.activityInfo.name);
if (r.match > bestMatch) bestMatch = r.match;
@@ -428,13 +427,14 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
private final int mLaunchedFromUid;
private final LayoutInflater mInflater;
- private List<DisplayResolveInfo> mList;
+ List<DisplayResolveInfo> mList;
+ List<ResolveInfo> mOrigResolveList;
+
private int mInitialHighlight = -1;
public ResolveListAdapter(Context context, Intent intent,
Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid) {
mIntent = new Intent(intent);
- mIntent.setComponent(null);
mInitialIntents = initialIntents;
mBaseResolveList = rList;
mLaunchedFromUid = launchedFromUid;
@@ -472,8 +472,9 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
mList.clear();
if (mBaseResolveList != null) {
currentResolveList = mBaseResolveList;
+ mOrigResolveList = null;
} else {
- currentResolveList = mPm.queryIntentActivities(
+ currentResolveList = mOrigResolveList = mPm.queryIntentActivities(
mIntent, PackageManager.MATCH_DEFAULT_ONLY
| (mAlwaysUseOption ? PackageManager.GET_RESOLVED_FILTER : 0));
// Filter out any activities that the launched uid does not
@@ -489,6 +490,9 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
ai.applicationInfo.uid, ai.exported);
if (granted != PackageManager.PERMISSION_GRANTED) {
// Access not allowed!
+ if (mOrigResolveList == currentResolveList) {
+ mOrigResolveList = new ArrayList<ResolveInfo>(mOrigResolveList);
+ }
currentResolveList.remove(i);
}
}
@@ -510,6 +514,9 @@ public class ResolverActivity extends AlertActivity implements AdapterView.OnIte
if (r0.priority != ri.priority ||
r0.isDefault != ri.isDefault) {
while (i < N) {
+ if (mOrigResolveList == currentResolveList) {
+ mOrigResolveList = new ArrayList<ResolveInfo>(mOrigResolveList);
+ }
currentResolveList.remove(i);
N--;
}
diff --git a/core/java/com/android/internal/transition/ActionBarTransition.java b/core/java/com/android/internal/transition/ActionBarTransition.java
index de59728..8beae8c 100644
--- a/core/java/com/android/internal/transition/ActionBarTransition.java
+++ b/core/java/com/android/internal/transition/ActionBarTransition.java
@@ -21,27 +21,38 @@ import android.transition.ChangeBounds;
import android.transition.Fade;
import android.transition.TextChange;
import android.transition.Transition;
+import android.transition.TransitionManager;
import android.transition.TransitionSet;
+import android.view.ViewGroup;
public class ActionBarTransition {
+ private static boolean TRANSITIONS_ENABLED = false;
+
private static final int TRANSITION_DURATION = 120; // ms
private static final Transition sTransition;
static {
- final TextChange tc = new TextChange();
- tc.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT_IN);
- final TransitionSet inner = new TransitionSet();
- inner.addTransition(tc).addTransition(new ChangeBounds());
- final TransitionSet tg = new TransitionSet();
- tg.addTransition(new Fade(Fade.OUT)).addTransition(inner).addTransition(new Fade(Fade.IN));
- tg.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
- tg.setDuration(TRANSITION_DURATION);
- sTransition = tg;
+ if (TRANSITIONS_ENABLED) {
+ final TextChange tc = new TextChange();
+ tc.setChangeBehavior(TextChange.CHANGE_BEHAVIOR_OUT_IN);
+ final TransitionSet inner = new TransitionSet();
+ inner.addTransition(tc).addTransition(new ChangeBounds());
+ final TransitionSet tg = new TransitionSet();
+ tg.addTransition(new Fade(Fade.OUT)).addTransition(inner).
+ addTransition(new Fade(Fade.IN));
+ tg.setOrdering(TransitionSet.ORDERING_SEQUENTIAL);
+ tg.setDuration(TRANSITION_DURATION);
+ sTransition = tg;
+ } else {
+ sTransition = null;
+ }
}
- public static Transition getActionBarTransition() {
- return sTransition;
+ public static void beginDelayedTransition(ViewGroup sceneRoot) {
+ if (TRANSITIONS_ENABLED) {
+ TransitionManager.beginDelayedTransition(sceneRoot, sTransition);
+ }
}
}
diff --git a/core/java/com/android/internal/util/FastPrintWriter.java b/core/java/com/android/internal/util/FastPrintWriter.java
index 9bec10e..c70a243 100644
--- a/core/java/com/android/internal/util/FastPrintWriter.java
+++ b/core/java/com/android/internal/util/FastPrintWriter.java
@@ -1,5 +1,7 @@
package com.android.internal.util;
+import android.util.Printer;
+
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
@@ -41,6 +43,7 @@ public class FastPrintWriter extends PrintWriter {
final private String mSeparator;
final private Writer mWriter;
+ final private Printer mPrinter;
private CharsetEncoder mCharset;
final private ByteBuffer mBytes;
@@ -106,6 +109,7 @@ public class FastPrintWriter extends PrintWriter {
mBytes = ByteBuffer.allocate(mBufferLen);
mOutputStream = out;
mWriter = null;
+ mPrinter = null;
mAutoFlush = autoFlush;
mSeparator = System.lineSeparator();
initDefaultEncoder();
@@ -130,7 +134,7 @@ public class FastPrintWriter extends PrintWriter {
}
/**
- * Constructs a new {@code PrintWriter} with {@code out} as its target
+ * Constructs a new {@code PrintWriter} with {@code wr} as its target
* writer. The parameter {@code autoFlush} determines if the print writer
* automatically flushes its contents to the target writer when a newline is
* encountered.
@@ -148,7 +152,7 @@ public class FastPrintWriter extends PrintWriter {
}
/**
- * Constructs a new {@code PrintWriter} with {@code out} as its target
+ * Constructs a new {@code PrintWriter} with {@code wr} as its target
* writer and a custom buffer size. The parameter {@code autoFlush} determines
* if the print writer automatically flushes its contents to the target writer
* when a newline is encountered.
@@ -174,11 +178,55 @@ public class FastPrintWriter extends PrintWriter {
mBytes = null;
mOutputStream = null;
mWriter = wr;
+ mPrinter = null;
mAutoFlush = autoFlush;
mSeparator = System.lineSeparator();
initDefaultEncoder();
}
+ /**
+ * Constructs a new {@code PrintWriter} with {@code pr} as its target
+ * printer and the default buffer size. Because a {@link Printer} is line-base,
+ * autoflush is always enabled.
+ *
+ * @param pr
+ * the target writer.
+ * @throws NullPointerException
+ * if {@code pr} is {@code null}.
+ */
+ public FastPrintWriter(Printer pr) {
+ this(pr, 512);
+ }
+
+ /**
+ * Constructs a new {@code PrintWriter} with {@code pr} as its target
+ * printer and a custom buffer size. Because a {@link Printer} is line-base,
+ * autoflush is always enabled.
+ *
+ * @param pr
+ * the target writer.
+ * @param bufferLen
+ * specifies the size of the FastPrintWriter's internal buffer; the
+ * default is 512.
+ * @throws NullPointerException
+ * if {@code pr} is {@code null}.
+ */
+ public FastPrintWriter(Printer pr, int bufferLen) {
+ super(sDummyWriter, true);
+ if (pr == null) {
+ throw new NullPointerException("pr is null");
+ }
+ mBufferLen = bufferLen;
+ mText = new char[bufferLen];
+ mBytes = null;
+ mOutputStream = null;
+ mWriter = null;
+ mPrinter = pr;
+ mAutoFlush = true;
+ mSeparator = System.lineSeparator();
+ initDefaultEncoder();
+ }
+
private final void initEncoder(String csn) throws UnsupportedEncodingException {
try {
mCharset = Charset.forName(csn).newEncoder();
@@ -306,9 +354,22 @@ public class FastPrintWriter extends PrintWriter {
}
flushBytesLocked();
mOutputStream.flush();
- } else {
+ } else if (mWriter != null) {
mWriter.write(mText, 0, mPos);
mWriter.flush();
+ } else {
+ int nonEolOff = 0;
+ final int sepLen = mSeparator.length();
+ final int len = sepLen < mPos ? sepLen : mPos;
+ while (nonEolOff < len && mText[mPos-1-nonEolOff]
+ == mSeparator.charAt(mSeparator.length()-1-nonEolOff)) {
+ nonEolOff++;
+ }
+ if (nonEolOff >= mPos) {
+ mPrinter.println("");
+ } else {
+ mPrinter.println(new String(mText, 0, mPos-nonEolOff));
+ }
}
mPos = 0;
}
@@ -326,7 +387,7 @@ public class FastPrintWriter extends PrintWriter {
flushLocked();
if (mOutputStream != null) {
mOutputStream.flush();
- } else {
+ } else if (mWriter != null) {
mWriter.flush();
}
} catch (IOException e) {
@@ -342,7 +403,7 @@ public class FastPrintWriter extends PrintWriter {
flushLocked();
if (mOutputStream != null) {
mOutputStream.close();
- } else {
+ } else if (mWriter != null) {
mWriter.close();
}
} catch (IOException e) {
diff --git a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
index d5ab0f2..4c6ddbf 100644
--- a/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
+++ b/core/java/com/android/internal/view/menu/ActionMenuPresenter.java
@@ -73,8 +73,6 @@ public class ActionMenuPresenter extends BaseMenuPresenter
final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback();
int mOpenSubMenuId;
- private static final Transition sTransition = ActionBarTransition.getActionBarTransition();
-
public ActionMenuPresenter(Context context) {
super(context, com.android.internal.R.layout.action_menu_layout,
com.android.internal.R.layout.action_menu_item_layout);
@@ -213,7 +211,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter
public void updateMenuView(boolean cleared) {
final ViewGroup menuViewParent = (ViewGroup) ((View) mMenuView).getParent();
if (menuViewParent != null) {
- TransitionManager.beginDelayedTransition(menuViewParent, sTransition);
+ ActionBarTransition.beginDelayedTransition(menuViewParent);
}
super.updateMenuView(cleared);
diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java
index 7efcb6e..a6566d5 100644
--- a/core/java/com/android/internal/widget/ActionBarView.java
+++ b/core/java/com/android/internal/widget/ActionBarView.java
@@ -144,8 +144,6 @@ public class ActionBarView extends AbsActionBarView {
Window.Callback mWindowCallback;
- private final static Transition sTransition = ActionBarTransition.getActionBarTransition();
-
private final AdapterView.OnItemSelectedListener mNavItemSelectedListener =
new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView parent, View view, int position, long id) {
@@ -483,7 +481,7 @@ public class ActionBarView extends AbsActionBarView {
public void setCustomNavigationView(View view) {
final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0;
if (showCustom) {
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
}
if (mCustomNavView != null && showCustom) {
removeView(mCustomNavView);
@@ -522,7 +520,7 @@ public class ActionBarView extends AbsActionBarView {
}
private void setTitleImpl(CharSequence title) {
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
mTitle = title;
if (mTitleView != null) {
mTitleView.setText(title);
@@ -542,7 +540,7 @@ public class ActionBarView extends AbsActionBarView {
}
public void setSubtitle(CharSequence subtitle) {
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
mSubtitle = subtitle;
if (mSubtitleView != null) {
mSubtitleView.setText(subtitle);
@@ -623,7 +621,7 @@ public class ActionBarView extends AbsActionBarView {
mDisplayOptions = options;
if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) {
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
if ((flagsChanged & ActionBar.DISPLAY_HOME_AS_UP) != 0) {
final boolean setUp = (options & ActionBar.DISPLAY_HOME_AS_UP) != 0;
@@ -737,7 +735,7 @@ public class ActionBarView extends AbsActionBarView {
public void setNavigationMode(int mode) {
final int oldMode = mNavigationMode;
if (mode != oldMode) {
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
switch (oldMode) {
case ActionBar.NAVIGATION_MODE_LIST:
if (mListNavLayout != null) {
@@ -860,7 +858,7 @@ public class ActionBarView extends AbsActionBarView {
}
}
- TransitionManager.beginDelayedTransition(this, sTransition);
+ ActionBarTransition.beginDelayedTransition(this);
mUpGoerFive.addView(mTitleLayout);
if (mExpandedActionView != null ||
(TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle))) {
@@ -1639,7 +1637,7 @@ public class ActionBarView extends AbsActionBarView {
@Override
public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {
- TransitionManager.beginDelayedTransition(ActionBarView.this, sTransition);
+ ActionBarTransition.beginDelayedTransition(ActionBarView.this);
mExpandedActionView = item.getActionView();
mExpandedHomeLayout.setIcon(mIcon.getConstantState().newDrawable(getResources()));
@@ -1668,7 +1666,7 @@ public class ActionBarView extends AbsActionBarView {
@Override
public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {
- TransitionManager.beginDelayedTransition(ActionBarView.this, sTransition);
+ ActionBarTransition.beginDelayedTransition(ActionBarView.this);
// Do this before detaching the actionview from the hierarchy, in case
// it needs to dismiss the soft keyboard, etc.
diff --git a/core/res/res/drawable-hdpi/ic_contact_picture.png b/core/res/res/drawable-hdpi/ic_contact_picture.png
index 2eef7b5..00d0ec4 100644
--- a/core/res/res/drawable-hdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-hdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
index 449d427..7fe402a 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
index 14f4ff8..4052eed 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
index 5cf9086..738d0fe 100644
--- a/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-hdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/toast_frame.9.png b/core/res/res/drawable-hdpi/toast_frame.9.png
index ad2cb5a..ca65994 100644
--- a/core/res/res/drawable-hdpi/toast_frame.9.png
+++ b/core/res/res/drawable-hdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/toast_frame_holo.9.png b/core/res/res/drawable-hdpi/toast_frame_holo.9.png
index f8f75db..ca65994 100644
--- a/core/res/res/drawable-hdpi/toast_frame_holo.9.png
+++ b/core/res/res/drawable-hdpi/toast_frame_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_contact_picture.png b/core/res/res/drawable-mdpi/ic_contact_picture.png
index 6c7cb61..771cb6b 100644
--- a/core/res/res/drawable-mdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-mdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
index 4c4adf2..5762e5f 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
index cb5b31a..bfb0967 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
index 52c9e3a..8c0386f 100644
--- a/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-mdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_more.png b/core/res/res/drawable-mdpi/stat_notify_more.png
index ca9e09e..52b40f8 100644
--- a/core/res/res/drawable-mdpi/stat_notify_more.png
+++ b/core/res/res/drawable-mdpi/stat_notify_more.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/toast_frame.9.png b/core/res/res/drawable-mdpi/toast_frame.9.png
index b9105de..9e93fe7 100644
--- a/core/res/res/drawable-mdpi/toast_frame.9.png
+++ b/core/res/res/drawable-mdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/toast_frame_holo.9.png b/core/res/res/drawable-mdpi/toast_frame_holo.9.png
index da2d52d..9e93fe7 100644
--- a/core/res/res/drawable-mdpi/toast_frame_holo.9.png
+++ b/core/res/res/drawable-mdpi/toast_frame_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_contact_picture.png b/core/res/res/drawable-xhdpi/ic_contact_picture.png
index 1a2bfde..bdba57b 100644
--- a/core/res/res/drawable-xhdpi/ic_contact_picture.png
+++ b/core/res/res/drawable-xhdpi/ic_contact_picture.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
index db1cbe6..6a97445 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_default_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
index de4ca91..f0e9ab9 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_green_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
index 853b0f0..170b833 100644
--- a/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
+++ b/core/res/res/drawable-xhdpi/indicator_code_lock_point_area_red_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/toast_frame.9.png b/core/res/res/drawable-xhdpi/toast_frame.9.png
index 9f39a77..1f63420 100644
--- a/core/res/res/drawable-xhdpi/toast_frame.9.png
+++ b/core/res/res/drawable-xhdpi/toast_frame.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/toast_frame_holo.9.png b/core/res/res/drawable-xhdpi/toast_frame_holo.9.png
index 9cb7c10..1f63420 100644
--- a/core/res/res/drawable-xhdpi/toast_frame_holo.9.png
+++ b/core/res/res/drawable-xhdpi/toast_frame_holo.9.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable/item_background.xml b/packages/DocumentsUI/res/drawable/item_background.xml
index 7447aa8..6fcab3c 100644
--- a/packages/DocumentsUI/res/drawable/item_background.xml
+++ b/packages/DocumentsUI/res/drawable/item_background.xml
@@ -16,18 +16,16 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:state_enabled="false" android:state_selected="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
- <item android:state_enabled="false" android:state_focused="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
- <item android:state_enabled="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
+ <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
- <item android:state_activated="true" android:state_pressed="true" android:drawable="@*android:drawable/list_activated_holo" />
- <item android:state_activated="true" android:drawable="@*android:drawable/list_activated_holo" />
+ <item android:state_focused="true" android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" />
+ <item android:state_focused="false" android:state_activated="true" android:drawable="@*android:drawable/list_selected_holo_light" />
- <item android:state_focused="true" android:drawable="@*android:drawable/list_focused_holo" />
- <item android:state_selected="true" android:drawable="@*android:drawable/list_focused_holo" />
-
- <item android:state_pressed="true" android:state_focused="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
- <item android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
+ <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_enabled="false" android:drawable="@*android:drawable/list_selector_disabled_holo_light" />
+ <item android:state_focused="true" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
+ <item android:state_focused="false" android:state_pressed="true" android:drawable="@*android:drawable/list_selector_background_transition_holo_light" />
+ <item android:state_focused="true" android:drawable="@*android:drawable/list_focused_holo" />
<item android:drawable="@android:color/transparent" />
diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml
index 98ded34..77cdc3b 100644
--- a/packages/DocumentsUI/res/layout/fragment_directory.xml
+++ b/packages/DocumentsUI/res/layout/fragment_directory.xml
@@ -42,6 +42,7 @@
android:paddingEnd="@dimen/grid_padding_horiz"
android:paddingTop="@dimen/grid_padding"
android:paddingBottom="@dimen/grid_padding"
+ android:clipToPadding="false"
android:scrollbarStyle="outsideOverlay"
android:listSelector="@android:color/transparent"
android:visibility="gone" />
diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml
index 4a93cdb..924a8d6 100644
--- a/packages/DocumentsUI/res/values/dimens.xml
+++ b/packages/DocumentsUI/res/values/dimens.xml
@@ -17,8 +17,8 @@
<resources>
<dimen name="icon_size">32dp</dimen>
<dimen name="root_icon_size">24dp</dimen>
- <dimen name="grid_width">180dp</dimen>
- <dimen name="grid_height">180dp</dimen>
+ <dimen name="grid_width">160dp</dimen>
+ <dimen name="grid_height">170dp</dimen>
<dimen name="grid_padding">4dp</dimen>
<dimen name="grid_padding_horiz">4dp</dimen>
diff --git a/packages/DocumentsUI/res/values/strings.xml b/packages/DocumentsUI/res/values/strings.xml
index 682ae4a..b7dcb71 100644
--- a/packages/DocumentsUI/res/values/strings.xml
+++ b/packages/DocumentsUI/res/values/strings.xml
@@ -62,6 +62,8 @@
<!-- Toast shown when saving a document failed with an error [CHAR LIMIT=48] -->
<string name="save_error">Failed to save document</string>
+ <!-- Toast shown when creating a folder failed with an error [CHAR LIMIT=48] -->
+ <string name="create_error">Failed to create folder</string>
<!-- Title of storage root location that contains recently modified or used documents [CHAR LIMIT=24] -->
<string name="root_recent">Recent</string>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
index d8e60aa..9d92cd8 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/CreateDirectoryFragment.java
@@ -76,7 +76,7 @@ public class CreateDirectoryFragment extends DialogFragment {
final DocumentInfo childDoc = DocumentInfo.fromUri(resolver, childUri);
activity.onDocumentPicked(childDoc);
} catch (Exception e) {
- Toast.makeText(context, R.string.save_error, Toast.LENGTH_SHORT).show();
+ Toast.makeText(context, R.string.create_error, Toast.LENGTH_SHORT).show();
}
}
});
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index de1f130..79ab28d 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -715,8 +715,16 @@ public class DirectoryFragment extends Fragment {
final FrameLayout grid = (FrameLayout) convertView;
final int gridPadding = getResources()
.getDimensionPixelSize(R.dimen.grid_padding);
- grid.setForeground(new InsetDrawable(grid.getForeground(), gridPadding));
- grid.setBackground(new InsetDrawable(grid.getBackground(), gridPadding));
+
+ // Tricksy hobbitses! We need to fully clear the drawable so
+ // the view doesn't clobber the new InsetDrawable callback
+ // when setting back later.
+ final Drawable fg = grid.getForeground();
+ final Drawable bg = grid.getBackground();
+ grid.setForeground(null);
+ grid.setBackground(null);
+ grid.setForeground(new InsetDrawable(fg, gridPadding));
+ grid.setBackground(new InsetDrawable(bg, gridPadding));
} else {
throw new IllegalStateException();
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
index 6d5475d..8d55ec4 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java
@@ -285,6 +285,7 @@ public class DocumentsActivity extends Activity {
private class RestoreStackTask extends AsyncTask<Void, Void, Void> {
private volatile boolean mRestoredStack;
+ private volatile boolean mExternal;
@Override
protected Void doInBackground(Void... params) {
@@ -298,6 +299,7 @@ public class DocumentsActivity extends Activity {
cursor.getColumnIndex(ResumeColumns.STACK));
DurableUtils.readFromArray(rawStack, mState.stack);
mRestoredStack = true;
+ mExternal = cursor.getInt(cursor.getColumnIndex(ResumeColumns.EXTERNAL)) != 0;
}
} catch (IOException e) {
Log.w(TAG, "Failed to resume", e);
@@ -305,12 +307,17 @@ public class DocumentsActivity extends Activity {
IoUtils.closeQuietly(cursor);
}
- // If restored root isn't valid, fall back to recents
- final RootInfo root = getCurrentRoot();
- final Collection<RootInfo> matchingRoots = mRoots.getMatchingRootsBlocking(mState);
- if (!matchingRoots.contains(root)) {
- mState.stack.reset();
- mRestoredStack = false;
+ if (mRestoredStack) {
+ // Update the restored stack to ensure we have freshest data
+ final Collection<RootInfo> matchingRoots = mRoots.getMatchingRootsBlocking(mState);
+ try {
+ mState.stack.updateRoot(matchingRoots);
+ mState.stack.updateDocuments(getContentResolver());
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "Failed to restore stack: " + e);
+ mState.stack.reset();
+ mRestoredStack = false;
+ }
}
return null;
@@ -321,10 +328,22 @@ public class DocumentsActivity extends Activity {
if (isDestroyed()) return;
mState.restored = true;
- // Only open drawer when not restoring stack, and when not showing
- // visual content.
- if (!mRestoredStack
- && !MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes)) {
+ // Show drawer when no stack restored, but only when requesting
+ // non-visual content. However, if we last used an external app,
+ // drawer is always shown.
+
+ boolean showDrawer = false;
+ if (!mRestoredStack) {
+ showDrawer = true;
+ }
+ if (MimePredicate.mimeMatches(MimePredicate.VISUAL_MIMES, mState.acceptMimes)) {
+ showDrawer = false;
+ }
+ if (mExternal && mState.action == ACTION_GET_CONTENT) {
+ showDrawer = true;
+ }
+
+ if (showDrawer) {
setRootsDrawerOpen(true);
}
@@ -340,6 +359,7 @@ public class DocumentsActivity extends Activity {
mState.showSize = true;
} else {
mState.showSize = SettingsActivity.getDisplayFileSize(this);
+ invalidateOptionsMenu();
}
}
@@ -779,10 +799,10 @@ public class DocumentsActivity extends Activity {
} else {
DirectoryFragment.showRecentsOpen(fm, anim);
- // Start recents in relevant mode
- final boolean acceptImages = MimePredicate.mimeMatches(
- "image/*", mState.acceptMimes);
- mState.userMode = acceptImages ? MODE_GRID : MODE_LIST;
+ // Start recents in grid when requesting visual things
+ final boolean visualMimes = MimePredicate.mimeMatches(
+ MimePredicate.VISUAL_MIMES, mState.acceptMimes);
+ mState.userMode = visualMimes ? MODE_GRID : MODE_LIST;
mState.derivedMode = mState.userMode;
}
} else {
@@ -814,9 +834,17 @@ public class DocumentsActivity extends Activity {
}
public void onStackPicked(DocumentStack stack) {
- mState.stack = stack;
- mState.stackTouched = true;
- onCurrentDirectoryChanged(ANIM_SIDE);
+ try {
+ // Update the restored stack to ensure we have freshest data
+ stack.updateDocuments(getContentResolver());
+
+ mState.stack = stack;
+ mState.stackTouched = true;
+ onCurrentDirectoryChanged(ANIM_SIDE);
+
+ } catch (FileNotFoundException e) {
+ Log.w(TAG, "Failed to restore stack: " + e);
+ }
}
public void onRootPicked(RootInfo root, boolean closeDrawer) {
@@ -858,6 +886,14 @@ public class DocumentsActivity extends Activity {
// Only relay back results when not canceled; otherwise stick around to
// let the user pick another app/backend.
if (requestCode == CODE_FORWARD && resultCode != RESULT_CANCELED) {
+
+ // Remember that we last picked via external app
+ final String packageName = getCallingPackage();
+ final ContentValues values = new ContentValues();
+ values.put(ResumeColumns.EXTERNAL, 1);
+ getContentResolver().insert(RecentsProvider.buildResume(packageName), values);
+
+ // Pass back result to original caller
setResult(resultCode, data);
finish();
} else {
@@ -945,6 +981,7 @@ public class DocumentsActivity extends Activity {
final String packageName = getCallingPackage();
values.clear();
values.put(ResumeColumns.STACK, rawStack);
+ values.put(ResumeColumns.EXTERNAL, 0);
resolver.insert(RecentsProvider.buildResume(packageName), values);
final Intent intent = new Intent();
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
index a396f79..670d5c0 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsCreateFragment.java
@@ -45,8 +45,10 @@ import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
+import com.android.documentsui.DocumentsActivity.State;
import com.android.documentsui.RecentsProvider.RecentColumns;
import com.android.documentsui.model.DocumentStack;
+import com.android.documentsui.model.RootInfo;
import com.google.android.collect.Lists;
import libcore.io.IoUtils;
@@ -55,6 +57,7 @@ import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
/**
@@ -89,10 +92,13 @@ public class RecentsCreateFragment extends Fragment {
mAdapter = new DocumentStackAdapter();
mListView.setAdapter(mAdapter);
+ final RootsCache roots = DocumentsApplication.getRootsCache(context);
+ final State state = ((DocumentsActivity) getActivity()).getDisplayState();
+
mCallbacks = new LoaderCallbacks<List<DocumentStack>>() {
@Override
public Loader<List<DocumentStack>> onCreateLoader(int id, Bundle args) {
- return new RecentsCreateLoader(context);
+ return new RecentsCreateLoader(context, roots, state);
}
@Override
@@ -131,12 +137,18 @@ public class RecentsCreateFragment extends Fragment {
};
public static class RecentsCreateLoader extends UriDerivativeLoader<Uri, List<DocumentStack>> {
- public RecentsCreateLoader(Context context) {
+ private final RootsCache mRoots;
+ private final State mState;
+
+ public RecentsCreateLoader(Context context, RootsCache roots, State state) {
super(context, RecentsProvider.buildRecent());
+ mRoots = roots;
+ mState = state;
}
@Override
public List<DocumentStack> loadInBackground(Uri uri, CancellationSignal signal) {
+ final Collection<RootInfo> matchingRoots = mRoots.getMatchingRootsBlocking(mState);
final ArrayList<DocumentStack> result = Lists.newArrayList();
final ContentResolver resolver = getContext().getContentResolver();
@@ -149,6 +161,12 @@ public class RecentsCreateFragment extends Fragment {
try {
final DocumentStack stack = new DocumentStack();
stack.read(new DataInputStream(new ByteArrayInputStream(rawStack)));
+
+ // Only update root here to avoid spinning up all
+ // providers; we update the stack during the actual
+ // restore. This also filters away roots that don't
+ // match current filter.
+ stack.updateRoot(matchingRoots);
result.add(stack);
} catch (IOException e) {
Log.w(TAG, "Failed to resolve stack: " + e);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
index af79c93..7386cae 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RecentsProvider.java
@@ -72,6 +72,7 @@ public class RecentsProvider extends ContentProvider {
public static final String PACKAGE_NAME = "package_name";
public static final String STACK = "stack";
public static final String TIMESTAMP = "timestamp";
+ public static final String EXTERNAL = "external";
}
public static Uri buildRecent() {
@@ -97,9 +98,10 @@ public class RecentsProvider extends ContentProvider {
private static final int VERSION_INIT = 1;
private static final int VERSION_AS_BLOB = 3;
+ private static final int VERSION_ADD_EXTERNAL = 4;
public DatabaseHelper(Context context) {
- super(context, DB_NAME, null, VERSION_AS_BLOB);
+ super(context, DB_NAME, null, VERSION_ADD_EXTERNAL);
}
@Override
@@ -121,9 +123,10 @@ public class RecentsProvider extends ContentProvider {
")");
db.execSQL("CREATE TABLE " + TABLE_RESUME + " (" +
- ResumeColumns.PACKAGE_NAME + " TEXT PRIMARY KEY ON CONFLICT REPLACE," +
- ResumeColumns.STACK + " BLOB," +
- ResumeColumns.TIMESTAMP + " INTEGER" +
+ ResumeColumns.PACKAGE_NAME + " TEXT NOT NULL PRIMARY KEY," +
+ ResumeColumns.STACK + " BLOB DEFAULT NULL," +
+ ResumeColumns.TIMESTAMP + " INTEGER," +
+ ResumeColumns.EXTERNAL + " INTEGER NOT NULL DEFAULT 0" +
")");
}
@@ -176,6 +179,7 @@ public class RecentsProvider extends ContentProvider {
@Override
public Uri insert(Uri uri, ContentValues values) {
final SQLiteDatabase db = mHelper.getWritableDatabase();
+ final ContentValues key = new ContentValues();
switch (sMatcher.match(uri)) {
case URI_RECENT:
values.put(RecentColumns.TIMESTAMP, System.currentTimeMillis());
@@ -188,7 +192,6 @@ public class RecentsProvider extends ContentProvider {
final String rootId = uri.getPathSegments().get(2);
final String documentId = uri.getPathSegments().get(3);
- final ContentValues key = new ContentValues();
key.put(StateColumns.AUTHORITY, authority);
key.put(StateColumns.ROOT_ID, rootId);
key.put(StateColumns.DOCUMENT_ID, documentId);
@@ -201,10 +204,15 @@ public class RecentsProvider extends ContentProvider {
return uri;
case URI_RESUME:
- final String packageName = uri.getPathSegments().get(1);
- values.put(ResumeColumns.PACKAGE_NAME, packageName);
values.put(ResumeColumns.TIMESTAMP, System.currentTimeMillis());
- db.insert(TABLE_RESUME, null, values);
+
+ final String packageName = uri.getPathSegments().get(1);
+ key.put(ResumeColumns.PACKAGE_NAME, packageName);
+
+ // Ensure that row exists, then update with changed values
+ db.insertWithOnConflict(TABLE_RESUME, null, key, SQLiteDatabase.CONFLICT_IGNORE);
+ db.update(TABLE_RESUME, values, ResumeColumns.PACKAGE_NAME + "=?",
+ new String[] { packageName });
return uri;
default:
throw new UnsupportedOperationException("Unsupported Uri " + uri);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
index 7b7c3d5..1cc35a7 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
@@ -27,6 +27,7 @@ import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.LinearLayout;
+import android.widget.ScrollView;
import android.widget.TextView;
import libcore.io.IoUtils;
@@ -52,6 +53,9 @@ public class TestActivity extends Activity {
final LinearLayout view = new LinearLayout(context);
view.setOrientation(LinearLayout.VERTICAL);
+ mResult = new TextView(context);
+ view.addView(mResult);
+
final CheckBox multiple = new CheckBox(context);
multiple.setText("ALLOW_MULTIPLE");
view.addView(multiple);
@@ -156,6 +160,23 @@ public class TestActivity extends Activity {
view.addView(button);
button = new Button(context);
+ button.setText("CREATE_DOC image/png");
+ button.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
+ intent.addCategory(Intent.CATEGORY_OPENABLE);
+ intent.setType("image/png");
+ intent.putExtra(Intent.EXTRA_TITLE, "mypicture.png");
+ if (localOnly.isChecked()) {
+ intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
+ }
+ startActivityForResult(intent, CODE_WRITE);
+ }
+ });
+ view.addView(button);
+
+ button = new Button(context);
button.setText("GET_CONTENT */*");
button.setOnClickListener(new OnClickListener() {
@Override
@@ -174,10 +195,10 @@ public class TestActivity extends Activity {
});
view.addView(button);
- mResult = new TextView(context);
- view.addView(mResult);
+ final ScrollView scroll = new ScrollView(context);
+ scroll.addView(view);
- setContentView(view);
+ setContentView(scroll);
}
@Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
index 08a8c13..5091a61 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentInfo.java
@@ -23,6 +23,7 @@ import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.provider.DocumentsContract;
+import android.provider.DocumentsProvider;
import android.provider.DocumentsContract.Document;
import com.android.documentsui.RootCursorWrapper;
@@ -141,23 +142,42 @@ public class DocumentInfo implements Durable, Parcelable {
}
public static DocumentInfo fromCursor(Cursor cursor, String authority) {
- final DocumentInfo doc = new DocumentInfo();
- doc.authority = authority;
- doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
- doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
- doc.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
- doc.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
- doc.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
- doc.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
- doc.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
- doc.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
- doc.size = getCursorLong(cursor, Document.COLUMN_SIZE);
- doc.icon = getCursorInt(cursor, Document.COLUMN_ICON);
- doc.deriveFields();
- return doc;
- }
-
- public static DocumentInfo fromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
+ final DocumentInfo info = new DocumentInfo();
+ info.updateFromCursor(cursor, authority);
+ return info;
+ }
+
+ public void updateFromCursor(Cursor cursor, String authority) {
+ this.authority = authority;
+ this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+ this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+ this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
+ this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
+ this.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
+ this.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
+ this.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
+ this.summary = getCursorString(cursor, Document.COLUMN_SUMMARY);
+ this.size = getCursorLong(cursor, Document.COLUMN_SIZE);
+ this.icon = getCursorInt(cursor, Document.COLUMN_ICON);
+ this.deriveFields();
+ }
+
+ public static DocumentInfo fromUri(ContentResolver resolver, Uri uri)
+ throws FileNotFoundException {
+ final DocumentInfo info = new DocumentInfo();
+ info.updateFromUri(resolver, uri);
+ return info;
+ }
+
+ /**
+ * Update a possibly stale restored document against a live
+ * {@link DocumentsProvider}.
+ */
+ public void updateSelf(ContentResolver resolver) throws FileNotFoundException {
+ updateFromUri(resolver, derivedUri);
+ }
+
+ public void updateFromUri(ContentResolver resolver, Uri uri) throws FileNotFoundException {
final ContentProviderClient client = resolver.acquireUnstableContentProviderClient(
uri.getAuthority());
Cursor cursor = null;
@@ -166,7 +186,7 @@ public class DocumentInfo implements Durable, Parcelable {
if (!cursor.moveToFirst()) {
throw new FileNotFoundException("Missing details for " + uri);
}
- return fromCursor(cursor, uri.getAuthority());
+ updateFromCursor(cursor, uri.getAuthority());
} catch (Throwable t) {
throw asFileNotFoundException(t);
} finally {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
index 2541440..0a378c0 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/DocumentStack.java
@@ -16,10 +16,15 @@
package com.android.documentsui.model;
+import android.content.ContentResolver;
+import android.provider.DocumentsProvider;
+
import java.io.DataInputStream;
import java.io.DataOutputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.ProtocolException;
+import java.util.Collection;
import java.util.LinkedList;
/**
@@ -46,6 +51,26 @@ public class DocumentStack extends LinkedList<DocumentInfo> implements Durable {
return size() == 0;
}
+ public void updateRoot(Collection<RootInfo> matchingRoots) throws FileNotFoundException {
+ for (RootInfo root : matchingRoots) {
+ if (root.equals(this.root)) {
+ this.root = root;
+ return;
+ }
+ }
+ throw new FileNotFoundException("Failed to find matching root for " + root);
+ }
+
+ /**
+ * Update a possibly stale restored stack against a live
+ * {@link DocumentsProvider}.
+ */
+ public void updateDocuments(ContentResolver resolver) throws FileNotFoundException {
+ for (DocumentInfo info : this) {
+ info.updateSelf(resolver);
+ }
+ }
+
@Override
public void reset() {
clear();
diff --git a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
index 72f6f0a..b4eb08a 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/FusedPrintersProvider.java
@@ -86,10 +86,6 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
}
private void computeAndDeliverResult(Map<PrinterId, PrinterInfo> discoveredPrinters) {
- if (!isStarted()) {
- return;
- }
-
List<PrinterInfo> printers = new ArrayList<PrinterInfo>();
// Add the updated favorite printers.
@@ -123,8 +119,10 @@ public class FusedPrintersProvider extends Loader<List<PrinterInfo>> {
mPrinters.clear();
mPrinters.addAll(printers);
- // Deliver the printers.
- deliverResult(printers);
+ if (isStarted()) {
+ // Deliver the printers.
+ deliverResult(printers);
+ }
}
@Override
diff --git a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
index fb2c935..ce1f6ec 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/PrintSpoolerService.java
@@ -74,7 +74,7 @@ public final class PrintSpoolerService extends Service {
private static final String LOG_TAG = "PrintSpoolerService";
- private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = true;
+ private static final boolean DEBUG_PRINT_JOB_LIFECYCLE = false;
private static final boolean DEBUG_PERSISTENCE = false;
diff --git a/services/java/com/android/server/IntentResolver.java b/services/java/com/android/server/IntentResolver.java
index 54aa50c..64b0487 100644
--- a/services/java/com/android/server/IntentResolver.java
+++ b/services/java/com/android/server/IntentResolver.java
@@ -38,6 +38,7 @@ import android.util.Printer;
import android.content.Intent;
import android.content.IntentFilter;
+import com.android.internal.util.FastPrintWriter;
/**
* {@hide}
@@ -229,8 +230,8 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
if (debug) Slog.v(
- TAG, "Resolving type " + resolvedType + " scheme " + scheme
- + " of intent " + intent);
+ TAG, "Resolving type=" + resolvedType + " scheme=" + scheme
+ + " defaultOnly=" + defaultOnly + " userId=" + userId + " of " + intent);
F[] firstTypeCut = null;
F[] secondTypeCut = null;
@@ -312,8 +313,8 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
if (debug) {
Slog.v(TAG, "Final result list:");
- for (R r : finalList) {
- Slog.v(TAG, " " + r);
+ for (int i=0; i<finalList.size(); i++) {
+ Slog.v(TAG, " " + finalList.get(i));
}
}
return finalList;
@@ -521,6 +522,16 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
final boolean excludingStopped = intent.isExcludingStopped();
+ final Printer logPrinter;
+ final PrintWriter logPrintWriter;
+ if (debug) {
+ logPrinter = new LogPrinter(Log.VERBOSE, TAG, Log.LOG_ID_SYSTEM);
+ logPrintWriter = new FastPrintWriter(logPrinter);
+ } else {
+ logPrinter = null;
+ logPrintWriter = null;
+ }
+
final int N = src != null ? src.length : 0;
boolean hasNonDefaults = false;
int i;
@@ -555,11 +566,17 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
match = filter.match(action, resolvedType, scheme, data, categories, TAG);
if (match >= 0) {
if (debug) Slog.v(TAG, " Filter matched! match=0x" +
- Integer.toHexString(match));
+ Integer.toHexString(match) + " hasDefault="
+ + filter.hasCategory(Intent.CATEGORY_DEFAULT));
if (!defaultOnly || filter.hasCategory(Intent.CATEGORY_DEFAULT)) {
final R oneResult = newResult(filter, match, userId);
if (oneResult != null) {
dest.add(oneResult);
+ if (debug) {
+ dumpFilter(logPrintWriter, " ", filter);
+ logPrintWriter.flush();
+ filter.dump(logPrinter, " ");
+ }
}
} else {
hasNonDefaults = true;
@@ -579,8 +596,12 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
}
}
- if (dest.size() == 0 && hasNonDefaults) {
- Slog.w(TAG, "resolveIntent failed: found match, but none with Intent.CATEGORY_DEFAULT");
+ if (hasNonDefaults) {
+ if (dest.size() == 0) {
+ Slog.w(TAG, "resolveIntent failed: found match, but none with CATEGORY_DEFAULT");
+ } else if (dest.size() > 1) {
+ Slog.w(TAG, "resolveIntent: multiple matches, only some with CATEGORY_DEFAULT");
+ }
}
}
diff --git a/services/java/com/android/server/PreferredComponent.java b/services/java/com/android/server/PreferredComponent.java
index 134b198..a7af252 100644
--- a/services/java/com/android/server/PreferredComponent.java
+++ b/services/java/com/android/server/PreferredComponent.java
@@ -80,7 +80,7 @@ public class PreferredComponent {
}
myPackages[i] = cn.getPackageName().intern();
myClasses[i] = cn.getClassName().intern();
- myComponents[i] = cn.flattenToShortString().intern();
+ myComponents[i] = cn.flattenToShortString();
}
mSetPackages = myPackages;
mSetClasses = myClasses;
@@ -219,9 +219,10 @@ public class PreferredComponent {
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(ident)));
out.print(' ');
- out.print(mComponent.flattenToShortString());
- out.print(" match=0x");
- out.println( Integer.toHexString(mMatch));
+ out.println(mShortComponent);
+ out.print(prefix); out.print(" mMatch=0x");
+ out.print(Integer.toHexString(mMatch));
+ out.print(" mAlways="); out.println(mAlways);
if (mSetComponents != null) {
out.print(prefix); out.println(" Selected from:");
for (int i=0; i<mSetComponents.length; i++) {
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 327c854..4f73588 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -2355,7 +2355,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
killUnneededProcessLocked(proc, Long.toString(proc.lastCachedPss)
+ "k from cached");
- } else if (proc != null && !keepIfLarge && mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL
+ } else if (proc != null && !keepIfLarge
+ && mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL
&& proc.setProcState >= ActivityManager.PROCESS_STATE_CACHED_EMPTY) {
if (DEBUG_PSS) Slog.d(TAG, "May not keep " + proc + ": pss=" + proc.lastCachedPss);
if (proc.lastCachedPss >= mProcessList.getCachedRestoreThreshold()) {
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index f221598..6cf3223 100755
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -5713,7 +5713,7 @@ public class PackageManagerService extends IPackageManager.Stub {
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(filter.activity)));
out.print(' ');
- out.print(filter.activity.getComponentShortName());
+ filter.activity.printComponentShortName(out);
out.print(" filter ");
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
@@ -5912,7 +5912,7 @@ public class PackageManagerService extends IPackageManager.Stub {
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(filter.service)));
out.print(' ');
- out.print(filter.service.getComponentShortName());
+ filter.service.printComponentShortName(out);
out.print(" filter ");
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
@@ -10423,7 +10423,7 @@ public class PackageManagerService extends IPackageManager.Stub {
dumpState.getTitlePrinted()
? "\nPreferred Activities User " + user + ":"
: "Preferred Activities User " + user + ":", " ",
- packageName, dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
+ packageName, true)) {
dumpState.setTitlePrinted(true);
}
}
@@ -10467,7 +10467,7 @@ public class PackageManagerService extends IPackageManager.Stub {
pw.println("Registered ContentProviders:");
printedSomething = true;
}
- pw.print(" "); pw.print(p.getComponentShortName()); pw.println(":");
+ pw.print(" "); p.printComponentShortName(pw); pw.println(":");
pw.print(" "); pw.println(p.toString());
}
printedSomething = false;
diff --git a/services/java/com/android/server/print/RemotePrintService.java b/services/java/com/android/server/print/RemotePrintService.java
index a20973e..5b9dc28 100644
--- a/services/java/com/android/server/print/RemotePrintService.java
+++ b/services/java/com/android/server/print/RemotePrintService.java
@@ -85,7 +85,7 @@ final class RemotePrintService implements DeathRecipient {
private boolean mHasPrinterDiscoverySession;
- private boolean mServiceDead;
+ private boolean mServiceDied;
private List<PrinterId> mDiscoveryPriorityList;
@@ -107,7 +107,6 @@ final class RemotePrintService implements DeathRecipient {
mSpooler = spooler;
mHandler = new MyHandler(context.getMainLooper());
mPrintServiceClient = new RemotePrintServiceClient(this);
- mServiceDead = true;
}
public ComponentName getComponentName() {
@@ -157,7 +156,7 @@ final class RemotePrintService implements DeathRecipient {
private void handleBinderDied() {
mPrintService.asBinder().unlinkToDeath(this, 0);
mPrintService = null;
- mServiceDead = true;
+ mServiceDied = true;
mCallbacks.onServiceDied(this);
}
@@ -171,7 +170,7 @@ final class RemotePrintService implements DeathRecipient {
if (!isBound()) {
// The service is dead and neither has active jobs nor discovery
// session, so ensure we are unbound since the service has no work.
- if (mServiceDead && !mHasPrinterDiscoverySession) {
+ if (mServiceDied && !mHasPrinterDiscoverySession) {
ensureUnbound();
return;
}
@@ -286,7 +285,7 @@ final class RemotePrintService implements DeathRecipient {
if (!isBound()) {
// The service is dead and neither has active jobs nor discovery
// session, so ensure we are unbound since the service has no work.
- if (mServiceDead && !mHasActivePrintJobs) {
+ if (mServiceDied && !mHasActivePrintJobs) {
ensureUnbound();
return;
}
@@ -556,15 +555,15 @@ final class RemotePrintService implements DeathRecipient {
return;
}
// If the service died and there is a discovery session, recreate it.
- if (mServiceDead && mHasPrinterDiscoverySession) {
+ if (mServiceDied && mHasPrinterDiscoverySession) {
handleCreatePrinterDiscoverySession();
}
// If the service died and there is discovery started, restart it.
- if (mServiceDead && mDiscoveryPriorityList != null) {
+ if (mServiceDied && mDiscoveryPriorityList != null) {
handleStartPrinterDiscovery(mDiscoveryPriorityList);
}
// If the service died and printers were tracked, start tracking.
- if (mServiceDead && mTrackedPrinterList != null) {
+ if (mServiceDied && mTrackedPrinterList != null) {
final int trackedPrinterCount = mTrackedPrinterList.size();
for (int i = 0; i < trackedPrinterCount; i++) {
handleStartPrinterStateTracking(mTrackedPrinterList.get(i));
@@ -581,7 +580,7 @@ final class RemotePrintService implements DeathRecipient {
if (!mHasPrinterDiscoverySession && !mHasActivePrintJobs) {
ensureUnbound();
}
- mServiceDead = false;
+ mServiceDied = false;
}
@Override
diff --git a/services/java/com/android/server/print/UserState.java b/services/java/com/android/server/print/UserState.java
index fd4a3a4..8c21827 100644
--- a/services/java/com/android/server/print/UserState.java
+++ b/services/java/com/android/server/print/UserState.java
@@ -1007,12 +1007,25 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks {
mHandler.obtainMessage(
SessionHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION,
service).sendToTarget();
- // If there are some observers that started discovery - tell the service.
- if (mDiscoveryObservers.getRegisteredCallbackCount() > 0) {
+ // Start printer discovery if necessary.
+ if (!mStartedPrinterDiscoveryTokens.isEmpty()) {
mHandler.obtainMessage(
SessionHandler.MSG_START_PRINTER_DISCOVERY,
service).sendToTarget();
}
+ // Start tracking printers if necessary
+ final int trackedPrinterCount = mStateTrackedPrinters.size();
+ for (int i = 0; i < trackedPrinterCount; i++) {
+ PrinterId printerId = mStateTrackedPrinters.get(i);
+ if (printerId.getServiceName().equals(service.getComponentName())) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = service;
+ args.arg2 = printerId;
+ mHandler.obtainMessage(SessionHandler
+ .MSG_START_PRINTER_STATE_TRACKING, args)
+ .sendToTarget();
+ }
+ }
}
public void dump(PrintWriter pw, String prefix) {
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 9d26670..e330f8b 100644
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -416,6 +416,7 @@ public class WindowManagerService extends IWindowManager.Stub
int mFocusedStackLayer;
final float[] mTmpFloats = new float[9];
+ final Rect mTmpContentRect = new Rect();
boolean mDisplayReady;
boolean mSafeMode;
@@ -8172,9 +8173,8 @@ public class WindowManagerService extends IWindowManager.Stub
mScreenRect.set(0, 0, dw, dh);
}
- Rect contentRect = new Rect();
- mPolicy.getContentRectLw(contentRect);
- displayContent.setStackBoxSize(contentRect);
+ mPolicy.getContentRectLw(mTmpContentRect);
+ displayContent.setStackBoxSize(mTmpContentRect);
int seq = mLayoutSeq+1;
if (seq < 0) seq = 0;