diff options
13 files changed, 137 insertions, 25 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index b4d8942..eeb5283 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -1345,6 +1345,15 @@ class ContextImpl extends Context { public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { + sendOrderedBroadcastAsUser(intent, user, receiverPermission, AppOpsManager.OP_NONE, + resultReceiver, scheduler, initialCode, initialData, initialExtras); + } + + @Override + public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, + String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + Handler scheduler, + int initialCode, String initialData, Bundle initialExtras) { IIntentReceiver rd = null; if (resultReceiver != null) { if (mPackageInfo != null) { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index a059e48..a364e68 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -1499,6 +1499,17 @@ public abstract class Context { @Nullable Bundle initialExtras); /** + * Similar to above but takes an appOp as well, to enforce restrictions. + * @see #sendOrderedBroadcastAsUser(Intent, UserHandle, String, + * BroadcastReceiver, Handler, int, String, Bundle) + * @hide + */ + public abstract void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, + @Nullable String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + @Nullable Handler scheduler, int initialCode, @Nullable String initialData, + @Nullable Bundle initialExtras); + + /** * Perform a {@link #sendBroadcast(Intent)} that is "sticky," meaning the * Intent you are sending stays around after the broadcast is complete, * so that others can quickly retrieve that data through the return diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 93f6cdf..c66355b 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -418,6 +418,16 @@ public class ContextWrapper extends Context { scheduler, initialCode, initialData, initialExtras); } + /** @hide */ + @Override + public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, + String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + Handler scheduler, + int initialCode, String initialData, Bundle initialExtras) { + mBase.sendOrderedBroadcastAsUser(intent, user, receiverPermission, appOp, resultReceiver, + scheduler, initialCode, initialData, initialExtras); + } + @Override public void sendStickyBroadcast(Intent intent) { mBase.sendStickyBroadcast(intent); diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index cf0caed..af45fa0 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -531,7 +531,8 @@ public abstract class BatteryStats implements Parcelable { public final static class HistoryItem implements Parcelable { public HistoryItem next; - + + // The time of this event in milliseconds, as per SystemClock.elapsedRealtime(). public long time; public static final byte CMD_UPDATE = 0; // These can be written as deltas @@ -645,7 +646,7 @@ public abstract class BatteryStats implements Parcelable { public int eventCode; public HistoryTag eventTag; - // Only set for CMD_CURRENT_TIME. + // Only set for CMD_CURRENT_TIME or CMD_RESET, as per System.currentTimeMillis(). public long currentTime; // Meta-data when reading. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index d09bb88..d063168 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2900,6 +2900,7 @@ public final class Settings { MOVED_TO_GLOBAL.add(Settings.Global.SET_GLOBAL_HTTP_PROXY); MOVED_TO_GLOBAL.add(Settings.Global.DEFAULT_DNS_SERVER); MOVED_TO_GLOBAL.add(Settings.Global.PREFERRED_NETWORK_MODE); + MOVED_TO_GLOBAL.add(Settings.Global.WEBVIEW_DATA_REDUCTION_PROXY_KEY); } /** @hide */ @@ -5330,6 +5331,13 @@ public final class Settings { */ public static final String USE_GOOGLE_MAIL = "use_google_mail"; + /** + * Webview Data reduction proxy key. + * @hide + */ + public static final String WEBVIEW_DATA_REDUCTION_PROXY_KEY = + "webview_data_reduction_proxy_key"; + /** * Whether Wifi display is enabled/disabled * 0=disabled. 1=enabled. diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 956c86d..8428f66 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -235,7 +235,8 @@ public final class BatteryStatsImpl extends BatteryStats { int mWakeLockNesting; boolean mWakeLockImportant; - public boolean mRecordAllWakeLocks; + boolean mRecordAllWakeLocks; + boolean mNoAutoReset; int mScreenState = Display.STATE_UNKNOWN; StopwatchTimer mScreenOnTimer; @@ -2314,9 +2315,6 @@ public final class BatteryStatsImpl extends BatteryStats { } } - private String mInitialAcquireWakeName; - private int mInitialAcquireWakeUid = -1; - public void setRecordAllWakeLocksLocked(boolean enabled) { mRecordAllWakeLocks = enabled; if (!enabled) { @@ -2325,6 +2323,13 @@ public final class BatteryStatsImpl extends BatteryStats { } } + public void setNoAutoReset(boolean enabled) { + mNoAutoReset = enabled; + } + + private String mInitialAcquireWakeName; + private int mInitialAcquireWakeUid = -1; + public void noteStartWakeLocked(int uid, int pid, String name, String historyName, int type, boolean unimportantForLogging, long elapsedRealtime, long uptime) { uid = mapUid(uid); @@ -2355,6 +2360,7 @@ public final class BatteryStatsImpl extends BatteryStats { } else if (mRecordAllWakeLocks) { if (mActiveEvents.updateState(HistoryItem.EVENT_WAKE_LOCK_START, historyName, uid, 0)) { + mWakeLockNesting++; return; } addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_WAKE_LOCK_START, @@ -5942,9 +5948,9 @@ public final class BatteryStatsImpl extends BatteryStats { // we have gone through a significant charge (from a very low // level to a now very high level). boolean reset = false; - if (oldStatus == BatteryManager.BATTERY_STATUS_FULL + if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL || level >= 90 - || (mDischargeCurrentLevel < 20 && level >= 80)) { + || (mDischargeCurrentLevel < 20 && level >= 80))) { doWrite = true; resetAllStatsLocked(); mDischargeStartLevel = level; diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index bf58918..9279758 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -367,7 +367,6 @@ void TextLayoutShaper::computeValues(const SkPaint* paint, const UChar* chars, bool forceLTR = false; bool forceRTL = false; - ALOGD("computeValues dirFlags=%d", dirFlags); switch (dirFlags & kBidi_Mask) { case kBidi_LTR: bidiReq = 0; break; // no ICU constant, canonical LTR level case kBidi_RTL: bidiReq = 1; break; // no ICU constant, canonical RTL level diff --git a/core/res/res/values/styles_quantum.xml b/core/res/res/values/styles_quantum.xml index a49b89a..d04bddf 100644 --- a/core/res/res/values/styles_quantum.xml +++ b/core/res/res/values/styles_quantum.xml @@ -427,7 +427,10 @@ please see styles_device_defaults.xml. <item name="paddingEnd">8dp</item> </style> - <style name="Widget.Quantum.CheckedTextView" parent="Widget.CheckedTextView"/> + <style name="Widget.Quantum.CheckedTextView" parent="Widget.CheckedTextView"> + <item name="drawablePadding">4dip</item> + </style> + <style name="Widget.Quantum.TextSelectHandle" parent="Widget.TextSelectHandle"/> <style name="Widget.Quantum.TextSuggestionsPopupWindow" parent="Widget.TextSuggestionsPopupWindow"/> <style name="Widget.Quantum.AbsListView" parent="Widget.AbsListView"/> @@ -441,10 +444,12 @@ please see styles_device_defaults.xml. <style name="Widget.Quantum.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox"> <item name="background">?attr/selectableItemBackground</item> + <item name="drawablePadding">4dip</item> </style> <style name="Widget.Quantum.CompoundButton.RadioButton" parent="Widget.CompoundButton.RadioButton"> <item name="background">?attr/selectableItemBackground</item> + <item name="drawablePadding">4dip</item> </style> <style name="Widget.Quantum.CompoundButton.Star" parent="Widget.CompoundButton.Star"> diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 908bfbd..249422b 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -623,8 +623,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub pw.println(" --charged: only output data since last charged."); pw.println(" --reset: reset the stats, clearing all current data."); pw.println(" --write: force write current collected stats to disk."); - pw.println(" --enable: enable an option: full-wake-history."); - pw.println(" --disable: disable an option: full-wake-history."); + pw.println(" --enable: enable an option: full-wake-history, no-auto-reset."); + pw.println(" --disable: disable an option: full-wake-history, no-auto-reset."); pw.println(" -h: print this help text."); pw.println(" <package.name>: optional name of package to filter output by."); } @@ -640,6 +640,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub synchronized (mStats) { mStats.setRecordAllWakeLocksLocked(enable); } + } else if ("no-auto-reset".equals(args[i])) { + synchronized (mStats) { + mStats.setNoAutoReset(enable); + } } else { pw.println("Unknown enable/disable option: " + args[i]); dumpHelp(pw); diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index a39c116..c1b9a33 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -24,11 +24,14 @@ import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.Manifest; +import android.app.admin.DevicePolicyManager; import android.app.trust.ITrustListener; import android.app.trust.ITrustManager; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; @@ -46,6 +49,7 @@ import android.service.trust.TrustAgentService; import android.util.ArraySet; import android.util.AttributeSet; import android.util.Slog; +import android.util.SparseBooleanArray; import android.util.Xml; import java.io.IOException; @@ -81,6 +85,8 @@ public class TrustManagerService extends SystemService { private final ArraySet<AgentInfo> mActiveAgents = new ArraySet<AgentInfo>(); private final ArrayList<ITrustListener> mTrustListeners = new ArrayList<ITrustListener>(); + private final DevicePolicyReceiver mDevicePolicyReceiver = new DevicePolicyReceiver(); + private final SparseBooleanArray mUserHasAuthenticatedSinceBoot = new SparseBooleanArray(); private final Context mContext; private UserManager mUserManager; @@ -105,8 +111,8 @@ public class TrustManagerService extends SystemService { @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY && !isSafeMode()) { - // Listen for package changes mPackageMonitor.register(mContext, mHandler.getLooper(), UserHandle.ALL, true); + mDevicePolicyReceiver.register(mContext); refreshAgentList(); } } @@ -158,8 +164,13 @@ public class TrustManagerService extends SystemService { mObsoleteAgents.addAll(mActiveAgents); for (UserInfo userInfo : userInfos) { + int disabledFeatures = lockPatternUtils.getDevicePolicyManager() + .getKeyguardDisabledFeatures(null, userInfo.id); + boolean disableTrustAgents = + (disabledFeatures & DevicePolicyManager.KEYGUARD_DISABLE_TRUST_AGENTS) != 0; + List<ComponentName> enabledAgents = lockPatternUtils.getEnabledTrustAgents(userInfo.id); - if (enabledAgents == null) { + if (disableTrustAgents || enabledAgents == null) { continue; } List<ResolveInfo> resolveInfos = pm.queryIntentServicesAsUser(TRUST_AGENT_INTENT, @@ -259,6 +270,9 @@ public class TrustManagerService extends SystemService { // Agent dispatch and aggregation private boolean aggregateIsTrusted(int userId) { + if (!mUserHasAuthenticatedSinceBoot.get(userId)) { + return false; + } for (int i = 0; i < mActiveAgents.size(); i++) { AgentInfo info = mActiveAgents.valueAt(i); if (info.userId == userId) { @@ -277,6 +291,11 @@ public class TrustManagerService extends SystemService { info.agent.onUnlockAttempt(successful); } } + + if (successful && !mUserHasAuthenticatedSinceBoot.get(userId)) { + mUserHasAuthenticatedSinceBoot.put(userId, true); + updateTrust(userId); + } } // Listeners @@ -384,4 +403,24 @@ public class TrustManagerService extends SystemService { return true; } }; + + private class DevicePolicyReceiver extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED.equals( + intent.getAction())) { + refreshAgentList(); + } + } + + public void register(Context context) { + context.registerReceiverAsUser(this, + UserHandle.ALL, + new IntentFilter( + DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED), + null /* permission */, + null /* scheduler */); + } + } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index a0c59cc..edbbc9f 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1214,18 +1214,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mAppOpsService = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); - if (mDeviceOwner.hasDeviceOwner()) { - try { - mAppOpsService.setDeviceOwner(mDeviceOwner.getDeviceOwnerPackageName()); - } catch (RemoteException e) { - Log.w(LOG_TAG, "Unable to notify AppOpsService of DeviceOwner", e); + if (mDeviceOwner != null) { + if (mDeviceOwner.hasDeviceOwner()) { + try { + mAppOpsService.setDeviceOwner(mDeviceOwner.getDeviceOwnerPackageName()); + } catch (RemoteException e) { + Log.w(LOG_TAG, "Unable to notify AppOpsService of DeviceOwner", e); + } } - } - for (Integer i : mDeviceOwner.getProfileOwnerKeys()) { - try { - mAppOpsService.setProfileOwner(mDeviceOwner.getProfileOwnerName(i), i); - } catch (RemoteException e) { - Log.w(LOG_TAG, "Unable to notify AppOpsService of ProfileOwner", e); + for (Integer i : mDeviceOwner.getProfileOwnerKeys()) { + try { + mAppOpsService.setProfileOwner(mDeviceOwner.getProfileOwnerName(i), i); + } catch (RemoteException e) { + Log.w(LOG_TAG, "Unable to notify AppOpsService of ProfileOwner", e); + } } } } diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index 0d9cd18..c162bf2 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -350,7 +350,17 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @hide */ + @Override + public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, + String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + Handler scheduler, + int initialCode, String initialData, Bundle initialExtras) { + throw new UnsupportedOperationException(); + } + @Override + public void sendStickyBroadcast(Intent intent) { throw new UnsupportedOperationException(); } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index fde4e1a..d31239b 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -1284,6 +1284,14 @@ public final class BridgeContext extends Context { } @Override + public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, + String receiverPermission, int appOp, BroadcastReceiver resultReceiver, + Handler scheduler, + int initialCode, String initialData, Bundle initialExtras) { + // pass + } + + @Override public void sendStickyBroadcast(Intent arg0) { // pass |