diff options
23 files changed, 227 insertions, 42 deletions
diff --git a/api/current.txt b/api/current.txt index c9585aae7e30..c4160443380f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -576,6 +576,7 @@ package android { field public static final int fontFamily = 16843692; // 0x10103ac field public static final int fontFeatureSettings = 16843959; // 0x10104b7 field public static final int footerDividersEnabled = 16843311; // 0x101022f + field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524 field public static final int foreground = 16843017; // 0x1010109 field public static final int foregroundGravity = 16843264; // 0x1010200 field public static final int foregroundTint = 16843885; // 0x101046d @@ -42345,6 +42346,7 @@ package android.view { method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int); method protected deprecated boolean fitSystemWindows(android.graphics.Rect); method public android.view.View focusSearch(int); + method public void forceHasOverlappingRendering(boolean); method public void forceLayout(); method public static int generateViewId(); method public java.lang.CharSequence getAccessibilityClassName(); @@ -42390,6 +42392,7 @@ package android.view { method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point); method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); + method public final boolean getHasOverlappingRendering(); method public final int getHeight(); method public void getHitRect(android.graphics.Rect); method public int getHorizontalFadingEdgeLength(); @@ -66449,3 +66452,4 @@ package org.xmlpull.v1.sax2 { } } + diff --git a/api/system-current.txt b/api/system-current.txt index f0dc02afbb1c..e372d98a92a1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -671,6 +671,7 @@ package android { field public static final int fontFamily = 16843692; // 0x10103ac field public static final int fontFeatureSettings = 16843959; // 0x10104b7 field public static final int footerDividersEnabled = 16843311; // 0x101022f + field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524 field public static final int foreground = 16843017; // 0x1010109 field public static final int foregroundGravity = 16843264; // 0x1010200 field public static final int foregroundTint = 16843885; // 0x101046d @@ -45071,6 +45072,7 @@ package android.view { method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int); method protected deprecated boolean fitSystemWindows(android.graphics.Rect); method public android.view.View focusSearch(int); + method public void forceHasOverlappingRendering(boolean); method public void forceLayout(); method public static int generateViewId(); method public java.lang.CharSequence getAccessibilityClassName(); @@ -45116,6 +45118,7 @@ package android.view { method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point); method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); + method public final boolean getHasOverlappingRendering(); method public final int getHeight(); method public void getHitRect(android.graphics.Rect); method public int getHorizontalFadingEdgeLength(); @@ -69513,3 +69516,4 @@ package org.xmlpull.v1.sax2 { } } + diff --git a/api/test-current.txt b/api/test-current.txt index da4f87376f51..e4153f126cb8 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -576,6 +576,7 @@ package android { field public static final int fontFamily = 16843692; // 0x10103ac field public static final int fontFeatureSettings = 16843959; // 0x10104b7 field public static final int footerDividersEnabled = 16843311; // 0x101022f + field public static final int forceHasOverlappingRendering = 16844068; // 0x1010524 field public static final int foreground = 16843017; // 0x1010109 field public static final int foregroundGravity = 16843264; // 0x1010200 field public static final int foregroundTint = 16843885; // 0x101046d @@ -42419,6 +42420,7 @@ package android.view { method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int); method protected deprecated boolean fitSystemWindows(android.graphics.Rect); method public android.view.View focusSearch(int); + method public void forceHasOverlappingRendering(boolean); method public void forceLayout(); method public static int generateViewId(); method public java.lang.CharSequence getAccessibilityClassName(); @@ -42464,6 +42466,7 @@ package android.view { method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point); method public final boolean getGlobalVisibleRect(android.graphics.Rect); method public android.os.Handler getHandler(); + method public final boolean getHasOverlappingRendering(); method public final int getHeight(); method public void getHitRect(android.graphics.Rect); method public int getHorizontalFadingEdgeLength(); @@ -66523,3 +66526,4 @@ package org.xmlpull.v1.sax2 { } } + diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 4e6735acf1e1..6811aedadaa0 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -2429,7 +2429,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * 1 PFLAG3_SCROLL_INDICATOR_START * 1 PFLAG3_SCROLL_INDICATOR_END * 1 PFLAG3_ASSIST_BLOCKED - * 1111111 PFLAG3_POINTER_ICON_MASK + * 1 PFLAG3_POINTER_ICON_NULL + * 1 PFLAG3_POINTER_ICON_VALUE_START + * 11111111 PFLAG3_POINTER_ICON_MASK + * 1 PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE + * 1 PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED * |-------|-------|-------|-------| */ @@ -2518,8 +2522,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ static final int PFLAG3_SCROLL_INDICATOR_END = 0x2000; - /* End of masks for mPrivateFlags3 */ - static final int DRAG_MASK = PFLAG2_DRAG_CAN_ACCEPT | PFLAG2_DRAG_HOVERED; static final int SCROLL_INDICATORS_NONE = 0x0000; @@ -2651,6 +2653,23 @@ public class View implements Drawable.Callback, KeyEvent.Callback, private static final int PFLAG3_POINTER_ICON_VALUE_START = 2 << PFLAG3_POINTER_ICON_LSHIFT; /** + * Whether this view has rendered elements that overlap (see {@link + * #hasOverlappingRendering()}, {@link #forceHasOverlappingRendering(boolean)}, and + * {@link #getHasOverlappingRendering()} ). The value in this bit is only valid when + * PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED has been set. Otherwise, the value is + * determined by whatever {@link #hasOverlappingRendering()} returns. + */ + private static final int PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE = 0x800000; + + /** + * Whether {@link #forceHasOverlappingRendering(boolean)} has been called. When true, value + * in PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE is valid. + */ + private static final int PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED = 0x1000000; + + /* End of masks for mPrivateFlags3 */ + + /** * Always allow a user to over-scroll this view, provided it is a * view that can scroll. * @@ -4516,6 +4535,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } } break; + case R.styleable.View_forceHasOverlappingRendering: + if (a.peekValue(attr) != null) { + forceHasOverlappingRendering(a.getBoolean(attr, true)); + } + break; + } } @@ -12116,6 +12141,42 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Sets the behavior for overlapping rendering for this view (see {@link + * #hasOverlappingRendering()} for more details on this behavior). Calling this method + * is an alternative to overriding {@link #hasOverlappingRendering()} in a subclass, + * providing the value which is then used internally. That is, when {@link + * #forceHasOverlappingRendering(boolean)} is called, the value of {@link + * #hasOverlappingRendering()} is ignored and the value passed into this method is used + * instead. + * + * @param hasOverlappingRendering The value for overlapping rendering to be used internally + * instead of that returned by {@link #hasOverlappingRendering()}. + * + * @attr ref android.R.styleable#View_forceHasOverlappingRendering + */ + public void forceHasOverlappingRendering(boolean hasOverlappingRendering) { + mPrivateFlags3 |= PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED; + if (hasOverlappingRendering) { + mPrivateFlags3 |= PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE; + } else { + mPrivateFlags3 &= ~PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE; + } + } + + /** + * Returns the value for overlapping rendering that is used internally. This is either + * the value passed into {@link #forceHasOverlappingRendering(boolean)}, if called, or + * the return value of {@link #hasOverlappingRendering()}, otherwise. + * + * @return The value for overlapping rendering being used internally. + */ + public final boolean getHasOverlappingRendering() { + return (mPrivateFlags3 & PFLAG3_HAS_OVERLAPPING_RENDERING_FORCED) != 0 ? + (mPrivateFlags3 & PFLAG3_OVERLAPPING_RENDERING_FORCED_VALUE) != 0 : + hasOverlappingRendering(); + } + + /** * Returns whether this View has content which overlaps. * * <p>This function, intended to be overridden by specific View types, is an optimization when @@ -12131,6 +12192,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * necessitates that a View return true if it uses the methods internally without passing the * {@link Canvas#CLIP_TO_LAYER_SAVE_FLAG}.</p> * + * <p><strong>Note:</strong> The return value of this method is ignored if {@link + * #forceHasOverlappingRendering(boolean)} has been called on this view.</p> + * * @return true if the content in this view might overlap, false otherwise. */ @ViewDebug.ExportedProperty(category = "drawing") @@ -16566,7 +16630,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, */ void setDisplayListProperties(RenderNode renderNode) { if (renderNode != null) { - renderNode.setHasOverlappingRendering(hasOverlappingRendering()); + renderNode.setHasOverlappingRendering(getHasOverlappingRendering()); renderNode.setClipToBounds(mParent instanceof ViewGroup && ((ViewGroup) mParent).getClipChildren()); diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java index 10027b6a723a..5e8f4a250816 100644 --- a/core/java/com/android/internal/backup/LocalTransport.java +++ b/core/java/com/android/internal/backup/LocalTransport.java @@ -27,7 +27,6 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.os.SELinux; import android.system.ErrnoException; import android.system.Os; import android.system.StructStat; diff --git a/core/java/com/android/internal/view/menu/ActionMenuItemView.java b/core/java/com/android/internal/view/menu/ActionMenuItemView.java index bd97e5d47714..4738f5ed5817 100644 --- a/core/java/com/android/internal/view/menu/ActionMenuItemView.java +++ b/core/java/com/android/internal/view/menu/ActionMenuItemView.java @@ -346,16 +346,6 @@ public class ActionMenuItemView extends TextView } return false; } - - @Override - protected boolean onForwardingStopped() { - final ShowableListMenu popup = getPopup(); - if (popup != null) { - popup.dismiss(); - return true; - } - return false; - } } public static abstract class PopupCallback { diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index a52c4e5ffbf4..00eb81a8ed98 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2846,6 +2846,11 @@ i <!-- Pointer icon of a hand sign while grabbing something. --> <enum name="grabbing" value="1021" /> </attr> + + <!-- Whether this view has elements that may overlap when drawn. See + {@link android.view.View#forceHasOverlappingRendering(boolean)}. --> + <attr name="forceHasOverlappingRendering" format="boolean" /> + </declare-styleable> <!-- Attributes that can be assigned to a tag for a particular View. --> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 7fd5456e5a96..ac29f92fe5d3 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2710,6 +2710,7 @@ <public type="attr" name="popupEnterTransition" /> <public type="attr" name="popupExitTransition" /> <public type="attr" name="minimalHeight" /> + <public type="attr" name="forceHasOverlappingRendering" /> <public type="style" name="Theme.Material.Light.DialogWhenLarge.DarkActionBar" /> <public type="style" name="Widget.Material.SeekBar.Discrete" /> diff --git a/libs/hwui/JankTracker.cpp b/libs/hwui/JankTracker.cpp index 2246cf9c1948..76e587e162b6 100644 --- a/libs/hwui/JankTracker.cpp +++ b/libs/hwui/JankTracker.cpp @@ -244,7 +244,7 @@ void JankTracker::addFrame(const FrameInfo& frame) { int64_t totalDuration = frame[FrameInfoIndex::FrameCompleted] - frame[FrameInfoIndex::IntendedVsync]; uint32_t framebucket = frameCountIndexForFrameTime( - totalDuration, mData->frameCounts.size()); + totalDuration, mData->frameCounts.size() - 1); // Keep the fast path as fast as possible. if (CC_LIKELY(totalDuration < mFrameInterval)) { mData->frameCounts[framebucket]++; diff --git a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java index e6b22e6ed73f..7ad4a094b327 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Metrics.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Metrics.java @@ -30,6 +30,7 @@ import android.net.Uri; import android.provider.DocumentsContract; import android.util.Log; +import com.android.documentsui.State.ActionType; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; @@ -502,7 +503,7 @@ public final class Metrics { * @param name The name of the histogram. * @param bucket The bucket to increment. */ - private static void logHistogram(Context context, String name, int bucket) { + private static void logHistogram(Context context, String name, @ActionType int bucket) { if (DEBUG) Log.d(TAG, name + ": " + bucket); MetricsLogger.histogram(context, name, bucket); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java index 35da8cc6357b..8b4f40ef38be 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java +++ b/packages/DocumentsUI/src/com/android/documentsui/RootsFragment.java @@ -17,6 +17,7 @@ package com.android.documentsui; import static com.android.documentsui.Shared.DEBUG; +import static com.android.documentsui.State.ACTION_OPEN_TREE; import android.app.Fragment; import android.app.FragmentManager; @@ -117,7 +118,7 @@ public class RootsFragment extends Fragment { Intent handlerAppIntent = getArguments().getParcelable(EXTRA_INCLUDE_APPS); - mAdapter = new RootsAdapter(context, result, handlerAppIntent); + mAdapter = new RootsAdapter(context, result, handlerAppIntent, state); mList.setAdapter(mAdapter); onCurrentRootChanged(); @@ -308,8 +309,8 @@ public class RootsFragment extends Fragment { * @param handlerAppIntent When not null, apps capable of handling the original * intent will be included in list of roots (in special section at bottom). */ - public RootsAdapter( - Context context, Collection<RootInfo> roots, @Nullable Intent handlerAppIntent) { + public RootsAdapter(Context context, Collection<RootInfo> roots, + @Nullable Intent handlerAppIntent, State state) { super(context, 0); final List<RootItem> libraries = new ArrayList<>(); @@ -320,7 +321,8 @@ public class RootsFragment extends Fragment { if (root.isHome() && Shared.isHomeRootHidden(context)) { continue; - } else if (root.isAdvanced() && Shared.areAdvancedRootsHidden(context)) { + } else if (root.isAdvanced() + && Shared.areAdvancedRootsHidden(context, state)) { continue; } else if (root.isLibrary()) { if (DEBUG) Log.d(TAG, "Adding " + root + " as library."); diff --git a/packages/DocumentsUI/src/com/android/documentsui/Shared.java b/packages/DocumentsUI/src/com/android/documentsui/Shared.java index d21afee93434..655359a70c24 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/Shared.java +++ b/packages/DocumentsUI/src/com/android/documentsui/Shared.java @@ -22,6 +22,11 @@ import android.text.TextUtils; import android.text.format.DateUtils; import android.text.format.Time; import android.view.WindowManager; + +import com.android.documentsui.State.ActionType; + +import static com.android.documentsui.State.ACTION_OPEN_TREE; + import android.app.AlertDialog; import java.text.Collator; @@ -179,8 +184,9 @@ public final class Shared { /* * Indicates if the advanced roots should be hidden. */ - public static boolean areAdvancedRootsHidden(Context context) { - return context.getResources().getBoolean(R.bool.advanced_roots_hidden); + public static boolean areAdvancedRootsHidden(Context context, State state) { + return context.getResources().getBoolean(R.bool.advanced_roots_hidden) + && state.action != ACTION_OPEN_TREE; } } diff --git a/packages/DocumentsUI/src/com/android/documentsui/State.java b/packages/DocumentsUI/src/com/android/documentsui/State.java index 16b7660e8ba4..534a483474d3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/State.java +++ b/packages/DocumentsUI/src/com/android/documentsui/State.java @@ -43,10 +43,19 @@ public class State implements android.os.Parcelable { private static final String TAG = "State"; + @IntDef(flag = true, value = { + ACTION_BROWSE, + ACTION_PICK_COPY_DESTINATION, + ACTION_OPEN, + ACTION_CREATE, + ACTION_GET_CONTENT, + ACTION_OPEN_TREE + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ActionType {} // File manager and related private picking activity. public static final int ACTION_BROWSE = 1; public static final int ACTION_PICK_COPY_DESTINATION = 2; - // All public picking activities public static final int ACTION_OPEN = 3; public static final int ACTION_CREATE = 4; @@ -69,7 +78,7 @@ public class State implements android.os.Parcelable { public static final int SORT_ORDER_LAST_MODIFIED = 2; public static final int SORT_ORDER_SIZE = 3; - public int action; + public @ActionType int action; public String[] acceptMimes; /** Derived from local preferences */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 12035b9314e3..023c4d07d708 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -789,8 +789,9 @@ public class NotificationPanelView extends PanelView implements } private boolean isInQsArea(float x, float y) { - return (x >= mQsContainer.getX() && x <= mQsContainer.getX() + mQsContainer.getWidth()) && - (y <= mNotificationStackScroller.getBottomMostNotificationBottom() + return (x >= mQsDensityContainer.getX() + && x <= mQsDensityContainer.getX() + mQsDensityContainer.getWidth()) + && (y <= mNotificationStackScroller.getBottomMostNotificationBottom() || y <= mQsContainer.getY() + mQsContainer.getHeight()); } @@ -1337,7 +1338,8 @@ public class NotificationPanelView extends PanelView implements return false; } View header = mKeyguardShowing ? mKeyguardStatusBar : mQsContainer.getHeader(); - boolean onHeader = x >= header.getX() && x <= header.getX() + header.getWidth() + boolean onHeader = x >= mQsDensityContainer.getX() + && x <= mQsDensityContainer.getX() + mQsDensityContainer.getWidth() && y >= header.getTop() && y <= header.getBottom(); if (mQsExpanded) { return onHeader || (yDiff < 0 && isInQsArea(x, y)); diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 291e7a7befc5..6288b56d1f1d 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -1818,7 +1818,7 @@ public class BackupManagerService { File initSentinel = new File(stateDir, INIT_SENTINEL_FILE_NAME); if (initSentinel.exists()) { synchronized (mQueueLock) { - mPendingInits.add(transportName); + mPendingInits.add(name); // TODO: pick a better starting time than now + 1 minute long delay = 1000 * 60; // one minute, in milliseconds @@ -2316,6 +2316,25 @@ public class BackupManagerService { } } + // What name is this transport registered under...? + private String getTransportName(IBackupTransport transport) { + if (MORE_DEBUG) { + Slog.v(TAG, "Searching for transport name of " + transport); + } + synchronized (mTransports) { + final int N = mTransports.size(); + for (int i = 0; i < N; i++) { + if (mTransports.valueAt(i).equals(transport)) { + if (MORE_DEBUG) { + Slog.v(TAG, " Name found: " + mTransports.keyAt(i)); + } + return mTransports.keyAt(i); + } + } + } + return null; + } + // fire off a backup agent, blocking until it attaches or times out IBackupAgent bindToAgentSynchronous(ApplicationInfo app, int mode) { IBackupAgent agent = null; @@ -2921,7 +2940,15 @@ public class BackupManagerService { if (MORE_DEBUG) Slog.d(TAG, "Server requires init; rerunning"); addBackupTrace("init required; rerunning"); try { - mPendingInits.add(mTransport.transportDirName()); + final String name = getTransportName(mTransport); + if (name != null) { + mPendingInits.add(name); + } else { + if (DEBUG) { + Slog.w(TAG, "Couldn't find name of transport " + mTransport + + " for init"); + } + } } catch (Exception e) { Slog.w(TAG, "Failed to query transport name heading for init", e); // swallow it and proceed; we don't rely on this diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 5b4a96d65ecc..a9ef1d60ebf6 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -4787,6 +4787,8 @@ final class ActivityStack { " Task id #" + task.taskId + "\n" + " mFullscreen=" + task.mFullscreen + "\n" + " mBounds=" + task.mBounds + "\n" + + " mMinimalWidth=" + task.mMinimalWidth + "\n" + + " mMinimalHeight=" + task.mMinimalHeight + "\n" + " mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds); if (printed) { header = null; diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index ffa3b5b2e2e8..3d420471ea82 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -1224,7 +1224,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub // WiFi keeps an accumulated total of stats, unlike Bluetooth. // Keep the last WiFi stats so we can compute a delta. @GuardedBy("mExternalStatsLock") - private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0); + private WifiActivityEnergyInfo mLastInfo = + new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0); @GuardedBy("mExternalStatsLock") private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 5263c3707929..6df36e4b053f 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -2196,7 +2196,13 @@ public class UserManagerService extends IUserManager.Stub { } private void removeUserState(final int userHandle) { - mContext.getSystemService(StorageManager.class).destroyUserKey(userHandle); + try { + mContext.getSystemService(StorageManager.class).destroyUserKey(userHandle); + } catch (IllegalStateException e) { + // This may be simply because the user was partially created. + Slog.i(LOG_TAG, + "Destroying key for user " + userHandle + " failed, continuing anyway", e); + } // Cleanup package manager settings mPm.cleanUpUser(this, userHandle); diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index 06851eeb7f20..1ce4ade8241e 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -694,7 +694,7 @@ public abstract class Conference extends Conferenceable { if (mPreviousExtraKeys != null) { List<String> toRemove = new ArrayList<String>(); for (String oldKey : mPreviousExtraKeys) { - if (!extras.containsKey(oldKey)) { + if (extras == null || !extras.containsKey(oldKey)) { toRemove.add(oldKey); } } @@ -710,7 +710,9 @@ public abstract class Conference extends Conferenceable { mPreviousExtraKeys = new ArraySet<String>(); } mPreviousExtraKeys.clear(); - mPreviousExtraKeys.addAll(extras.keySet()); + if (extras != null) { + mPreviousExtraKeys.addAll(extras.keySet()); + } } /** diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 310c957c94fa..d83cdb8fa148 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -1887,7 +1887,7 @@ public abstract class Connection extends Conferenceable { if (mPreviousExtraKeys != null) { List<String> toRemove = new ArrayList<String>(); for (String oldKey : mPreviousExtraKeys) { - if (!extras.containsKey(oldKey)) { + if (extras == null || !extras.containsKey(oldKey)) { toRemove.add(oldKey); } } @@ -1902,7 +1902,9 @@ public abstract class Connection extends Conferenceable { mPreviousExtraKeys = new ArraySet<String>(); } mPreviousExtraKeys.clear(); - mPreviousExtraKeys.addAll(extras.keySet()); + if (extras != null) { + mPreviousExtraKeys.addAll(extras.keySet()); + } } /** @@ -2317,7 +2319,7 @@ public abstract class Connection extends Conferenceable { */ public void sendConnectionEvent(String event, Bundle extras) { for (Listener l : mListeners) { - l.onConnectionEvent(this, event, null); + l.onConnectionEvent(this, event, extras); } } } diff --git a/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java b/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java index 035317ea402b..4c38c9bbe2cd 100644 --- a/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java +++ b/wifi/java/android/net/wifi/WifiActivityEnergyInfo.java @@ -19,6 +19,8 @@ package android.net.wifi; import android.os.Parcel; import android.os.Parcelable; +import java.util.Arrays; + /** * Record of energy and activity information from controller and * underlying wifi stack state. Timestamp the record with elapsed @@ -44,6 +46,11 @@ public final class WifiActivityEnergyInfo implements Parcelable { /** * @hide */ + public long[] mControllerTxTimePerLevelMs; + + /** + * @hide + */ public long mControllerRxTimeMs; /** @@ -62,10 +69,12 @@ public final class WifiActivityEnergyInfo implements Parcelable { public static final int STACK_STATE_STATE_IDLE = 3; public WifiActivityEnergyInfo(long timestamp, int stackState, - long txTime, long rxTime, long idleTime, long energyUsed) { + long txTime, long[] txTimePerLevel, long rxTime, long idleTime, + long energyUsed) { mTimestamp = timestamp; mStackState = stackState; mControllerTxTimeMs = txTime; + mControllerTxTimePerLevelMs = txTimePerLevel; mControllerRxTimeMs = rxTime; mControllerIdleTimeMs = idleTime; mControllerEnergyUsed = energyUsed; @@ -77,6 +86,7 @@ public final class WifiActivityEnergyInfo implements Parcelable { + " timestamp=" + mTimestamp + " mStackState=" + mStackState + " mControllerTxTimeMs=" + mControllerTxTimeMs + + " mControllerTxTimePerLevelMs=" + Arrays.toString(mControllerTxTimePerLevelMs) + " mControllerRxTimeMs=" + mControllerRxTimeMs + " mControllerIdleTimeMs=" + mControllerIdleTimeMs + " mControllerEnergyUsed=" + mControllerEnergyUsed @@ -89,11 +99,12 @@ public final class WifiActivityEnergyInfo implements Parcelable { long timestamp = in.readLong(); int stackState = in.readInt(); long txTime = in.readLong(); + long[] txTimePerLevel = in.createLongArray(); long rxTime = in.readLong(); long idleTime = in.readLong(); long energyUsed = in.readLong(); return new WifiActivityEnergyInfo(timestamp, stackState, - txTime, rxTime, idleTime, energyUsed); + txTime, txTimePerLevel, rxTime, idleTime, energyUsed); } public WifiActivityEnergyInfo[] newArray(int size) { return new WifiActivityEnergyInfo[size]; @@ -104,6 +115,7 @@ public final class WifiActivityEnergyInfo implements Parcelable { out.writeLong(mTimestamp); out.writeInt(mStackState); out.writeLong(mControllerTxTimeMs); + out.writeLongArray(mControllerTxTimePerLevelMs); out.writeLong(mControllerRxTimeMs); out.writeLong(mControllerIdleTimeMs); out.writeLong(mControllerEnergyUsed); @@ -128,6 +140,16 @@ public final class WifiActivityEnergyInfo implements Parcelable { } /** + * @return tx time at power level provided in ms + */ + public long getControllerTxTimeMillisAtLevel(int level) { + if (level < mControllerTxTimePerLevelMs.length) { + return mControllerTxTimePerLevelMs[level]; + } + return 0; + } + + /** * @return rx time in ms */ public long getControllerRxTimeMillis() { diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 06dea072f2ed..fb2bdd455c62 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -938,6 +938,15 @@ public class WifiConfiguration implements Parcelable { private boolean mSeenInLastQualifiedNetworkSelection; /** + * Boolean indicating if we have ever successfully connected to this network. + * + * This value will be set to true upon a successful connection. + * This value will be set to false if a previous value was not stored in the config or if + * the credentials are updated (ex. a password change). + */ + private boolean mHasEverConnected; + + /** * set whether this network is visible in latest Qualified Network Selection * @param seen value set to candidate */ @@ -1027,7 +1036,18 @@ public class WifiConfiguration implements Parcelable { return QUALITY_NETWORK_SELECTION_STATUS[mStatus]; } - private NetworkSelectionStatus() {}; + public void setHasEverConnected(boolean value) { + mHasEverConnected = value; + } + + public boolean getHasEverConnected() { + return mHasEverConnected; + } + + private NetworkSelectionStatus() { + // previously stored configs will not have this parameter, so we default to false. + mHasEverConnected = false; + }; /** * @param reason specific error reason @@ -1226,6 +1246,7 @@ public class WifiConfiguration implements Parcelable { mNetworkSelectionBSSID = source.mNetworkSelectionBSSID; setConnectChoice(source.getConnectChoice()); setConnectChoiceTimestamp(source.getConnectChoiceTimestamp()); + setHasEverConnected(source.getHasEverConnected()); } public void writeToParcel(Parcel dest) { @@ -1244,6 +1265,7 @@ public class WifiConfiguration implements Parcelable { } else { dest.writeInt(CONNECT_CHOICE_NOT_EXISTS); } + dest.writeInt(getHasEverConnected() ? 1 : 0); } public void readFromParcel(Parcel in) { @@ -1262,6 +1284,7 @@ public class WifiConfiguration implements Parcelable { setConnectChoice(null); setConnectChoiceTimestamp(INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP); } + setHasEverConnected(in.readInt() != 0); } } @@ -1389,6 +1412,8 @@ public class WifiConfiguration implements Parcelable { sbuf.append(" connect choice set time: ").append(mNetworkSelectionStatus .getConnectChoiceTimestamp()); } + sbuf.append(" hasEverConnected: ") + .append(mNetworkSelectionStatus.getHasEverConnected()).append("\n"); if (this.numAssociation > 0) { sbuf.append(" numAssociation ").append(this.numAssociation).append("\n"); diff --git a/wifi/java/android/net/wifi/WifiLinkLayerStats.java b/wifi/java/android/net/wifi/WifiLinkLayerStats.java index 1de4fd834fcd..edd400b56238 100644 --- a/wifi/java/android/net/wifi/WifiLinkLayerStats.java +++ b/wifi/java/android/net/wifi/WifiLinkLayerStats.java @@ -19,6 +19,8 @@ package android.net.wifi; import android.os.Parcelable; import android.os.Parcel; +import java.util.Arrays; + /** * A class representing link layer statistics collected over a Wifi Interface. */ @@ -101,6 +103,8 @@ public class WifiLinkLayerStats implements Parcelable { /** {@hide} */ public int tx_time; /** {@hide} */ + public int[] tx_time_per_level; + /** {@hide} */ public int rx_time; /** {@hide} */ public int on_time_scan; @@ -141,9 +145,10 @@ public class WifiLinkLayerStats implements Parcelable { .append(" lost=").append(Long.toString(this.lostmpdu_vo)) .append(" retries=").append(Long.toString(this.retries_vo)).append('\n'); sbuf.append(" on_time : ").append(Integer.toString(this.on_time)) - .append(" tx_time=").append(Integer.toString(this.tx_time)) .append(" rx_time=").append(Integer.toString(this.rx_time)) - .append(" scan_time=").append(Integer.toString(this.on_time_scan)).append('\n'); + .append(" scan_time=").append(Integer.toString(this.on_time_scan)).append('\n') + .append(" tx_time=").append(Integer.toString(this.tx_time)) + .append(" tx_time_per_level=" + Arrays.toString(tx_time_per_level)); return sbuf.toString(); } @@ -179,6 +184,7 @@ public class WifiLinkLayerStats implements Parcelable { dest.writeString(BSSID); dest.writeInt(on_time); dest.writeInt(tx_time); + dest.writeIntArray(tx_time_per_level); dest.writeInt(rx_time); dest.writeInt(on_time_scan); } @@ -192,6 +198,7 @@ public class WifiLinkLayerStats implements Parcelable { stats.BSSID = in.readString(); stats.on_time = in.readInt(); stats.tx_time = in.readInt(); + stats.tx_time_per_level = in.createIntArray(); stats.rx_time = in.readInt(); stats.on_time_scan = in.readInt(); return stats; |