diff options
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 Binary files differindex 2eef7b5..00d0ec4 100644 --- a/core/res/res/drawable-hdpi/ic_contact_picture.png +++ b/core/res/res/drawable-hdpi/ic_contact_picture.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/core/res/res/drawable-hdpi/toast_frame.9.png b/core/res/res/drawable-hdpi/toast_frame.9.png Binary files differindex ad2cb5a..ca65994 100644 --- a/core/res/res/drawable-hdpi/toast_frame.9.png +++ b/core/res/res/drawable-hdpi/toast_frame.9.png diff --git a/core/res/res/drawable-hdpi/toast_frame_holo.9.png b/core/res/res/drawable-hdpi/toast_frame_holo.9.png Binary files differindex 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 diff --git a/core/res/res/drawable-mdpi/ic_contact_picture.png b/core/res/res/drawable-mdpi/ic_contact_picture.png Binary files differindex 6c7cb61..771cb6b 100644 --- a/core/res/res/drawable-mdpi/ic_contact_picture.png +++ b/core/res/res/drawable-mdpi/ic_contact_picture.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/core/res/res/drawable-mdpi/stat_notify_more.png b/core/res/res/drawable-mdpi/stat_notify_more.png Binary files differindex ca9e09e..52b40f8 100644 --- a/core/res/res/drawable-mdpi/stat_notify_more.png +++ b/core/res/res/drawable-mdpi/stat_notify_more.png diff --git a/core/res/res/drawable-mdpi/toast_frame.9.png b/core/res/res/drawable-mdpi/toast_frame.9.png Binary files differindex b9105de..9e93fe7 100644 --- a/core/res/res/drawable-mdpi/toast_frame.9.png +++ b/core/res/res/drawable-mdpi/toast_frame.9.png diff --git a/core/res/res/drawable-mdpi/toast_frame_holo.9.png b/core/res/res/drawable-mdpi/toast_frame_holo.9.png Binary files differindex 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 diff --git a/core/res/res/drawable-xhdpi/ic_contact_picture.png b/core/res/res/drawable-xhdpi/ic_contact_picture.png Binary files differindex 1a2bfde..bdba57b 100644 --- a/core/res/res/drawable-xhdpi/ic_contact_picture.png +++ b/core/res/res/drawable-xhdpi/ic_contact_picture.png 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 Binary files differindex 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 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 Binary files differindex 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 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 Binary files differindex 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 diff --git a/core/res/res/drawable-xhdpi/toast_frame.9.png b/core/res/res/drawable-xhdpi/toast_frame.9.png Binary files differindex 9f39a77..1f63420 100644 --- a/core/res/res/drawable-xhdpi/toast_frame.9.png +++ b/core/res/res/drawable-xhdpi/toast_frame.9.png diff --git a/core/res/res/drawable-xhdpi/toast_frame_holo.9.png b/core/res/res/drawable-xhdpi/toast_frame_holo.9.png Binary files differindex 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 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; |
