summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/core/java/com/android/server/AnyMotionDetector.java61
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java3
-rw-r--r--services/core/java/com/android/server/am/BroadcastQueue.java10
-rw-r--r--services/core/java/com/android/server/am/CoreSettingsObserver.java1
-rw-r--r--services/core/java/com/android/server/display/AutomaticBrightnessController.java21
-rw-r--r--services/core/java/com/android/server/display/DisplayPowerController.java25
-rw-r--r--services/core/java/com/android/server/display/HysteresisLevels.java104
-rw-r--r--services/core/java/com/android/server/lights/LightsService.java10
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java20
-rw-r--r--services/core/java/com/android/server/notification/NotificationManagerService.java3
-rw-r--r--services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java28
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java16
-rw-r--r--services/core/java/com/android/server/policy/PhoneWindowManager.java137
-rw-r--r--services/core/java/com/android/server/power/PowerManagerService.java10
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java6
-rw-r--r--services/java/com/android/server/SystemServer.java32
16 files changed, 399 insertions, 88 deletions
diff --git a/services/core/java/com/android/server/AnyMotionDetector.java b/services/core/java/com/android/server/AnyMotionDetector.java
index f93c716ae162..d56492521276 100644
--- a/services/core/java/com/android/server/AnyMotionDetector.java
+++ b/services/core/java/com/android/server/AnyMotionDetector.java
@@ -97,6 +97,15 @@ public class AnyMotionDetector {
/** True if an orientation measurement is in progress. */
private boolean mMeasurementInProgress;
+ /** True if sendMessageDelayed() for the mMeasurementTimeout callback has been scheduled */
+ private boolean mMeasurementTimeoutIsActive;
+
+ /** True if sendMessageDelayed() for the mWakelockTimeout callback has been scheduled */
+ private boolean mWakelockTimeoutIsActive;
+
+ /** True if sendMessageDelayed() for the mSensorRestart callback has been scheduled */
+ private boolean mSensorRestartIsActive;
+
/** The most recent gravity vector. */
private Vector3 mCurrentGravityVector = null;
@@ -118,6 +127,9 @@ public class AnyMotionDetector {
mSensorManager = sm;
mAccelSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mMeasurementInProgress = false;
+ mMeasurementTimeoutIsActive = false;
+ mWakelockTimeoutIsActive = false;
+ mSensorRestartIsActive = false;
mState = STATE_INACTIVE;
mCallback = callback;
mThresholdAngle = thresholdAngle;
@@ -146,6 +158,7 @@ public class AnyMotionDetector {
mWakeLock.acquire();
Message wakelockTimeoutMsg = Message.obtain(mHandler, mWakelockTimeout);
mHandler.sendMessageDelayed(wakelockTimeoutMsg, WAKELOCK_TIMEOUT_MILLIS);
+ mWakelockTimeoutIsActive = true;
startOrientationMeasurementLocked();
}
}
@@ -157,17 +170,20 @@ public class AnyMotionDetector {
mState = STATE_INACTIVE;
if (DEBUG) Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE.");
}
+ mHandler.removeCallbacks(mMeasurementTimeout);
+ mHandler.removeCallbacks(mSensorRestart);
+ mMeasurementTimeoutIsActive = false;
+ mSensorRestartIsActive = false;
if (mMeasurementInProgress) {
mMeasurementInProgress = false;
mSensorManager.unregisterListener(mListener);
}
- mHandler.removeCallbacks(mMeasurementTimeout);
- mHandler.removeCallbacks(mSensorRestart);
mCurrentGravityVector = null;
mPreviousGravityVector = null;
if (mWakeLock.isHeld()) {
- mWakeLock.release();
mHandler.removeCallbacks(mWakelockTimeout);
+ mWakelockTimeoutIsActive = false;
+ mWakeLock.release();
}
}
}
@@ -183,6 +199,7 @@ public class AnyMotionDetector {
}
Message measurementTimeoutMsg = Message.obtain(mHandler, mMeasurementTimeout);
mHandler.sendMessageDelayed(measurementTimeoutMsg, ACCELEROMETER_DATA_TIMEOUT_MILLIS);
+ mMeasurementTimeoutIsActive = true;
}
}
@@ -191,8 +208,9 @@ public class AnyMotionDetector {
mMeasurementInProgress);
int status = RESULT_UNKNOWN;
if (mMeasurementInProgress) {
- mSensorManager.unregisterListener(mListener);
mHandler.removeCallbacks(mMeasurementTimeout);
+ mMeasurementTimeoutIsActive = false;
+ mSensorManager.unregisterListener(mListener);
mMeasurementInProgress = false;
mPreviousGravityVector = mCurrentGravityVector;
mCurrentGravityVector = mRunningStats.getRunningAverage();
@@ -213,8 +231,9 @@ public class AnyMotionDetector {
if (DEBUG) Slog.d(TAG, "getStationaryStatus() returned " + status);
if (status != RESULT_UNKNOWN) {
if (mWakeLock.isHeld()) {
- mWakeLock.release();
mHandler.removeCallbacks(mWakelockTimeout);
+ mWakelockTimeoutIsActive = false;
+ mWakeLock.release();
}
if (DEBUG) {
Slog.d(TAG, "Moved from STATE_ACTIVE to STATE_INACTIVE. status = " + status);
@@ -230,6 +249,7 @@ public class AnyMotionDetector {
" milliseconds.");
Message msg = Message.obtain(mHandler, mSensorRestart);
mHandler.sendMessageDelayed(msg, ORIENTATION_MEASUREMENT_INTERVAL_MILLIS);
+ mSensorRestartIsActive = true;
}
}
return status;
@@ -283,6 +303,7 @@ public class AnyMotionDetector {
}
if (status != RESULT_UNKNOWN) {
mHandler.removeCallbacks(mWakelockTimeout);
+ mWakelockTimeoutIsActive = false;
mCallback.onAnyMotionResult(status);
}
}
@@ -296,7 +317,10 @@ public class AnyMotionDetector {
@Override
public void run() {
synchronized (mLock) {
- startOrientationMeasurementLocked();
+ if (mSensorRestartIsActive == true) {
+ mSensorRestartIsActive = false;
+ startOrientationMeasurementLocked();
+ }
}
}
};
@@ -306,14 +330,18 @@ public class AnyMotionDetector {
public void run() {
int status = RESULT_UNKNOWN;
synchronized (mLock) {
- if (DEBUG) Slog.i(TAG, "mMeasurementTimeout. Failed to collect sufficient accel " +
- "data within " + ACCELEROMETER_DATA_TIMEOUT_MILLIS + " ms. Stopping " +
- "orientation measurement.");
- status = stopOrientationMeasurementLocked();
- }
- if (status != RESULT_UNKNOWN) {
- mHandler.removeCallbacks(mWakelockTimeout);
- mCallback.onAnyMotionResult(status);
+ if (mMeasurementTimeoutIsActive == true) {
+ mMeasurementTimeoutIsActive = false;
+ if (DEBUG) Slog.i(TAG, "mMeasurementTimeout. Failed to collect sufficient accel " +
+ "data within " + ACCELEROMETER_DATA_TIMEOUT_MILLIS + " ms. Stopping " +
+ "orientation measurement.");
+ status = stopOrientationMeasurementLocked();
+ if (status != RESULT_UNKNOWN) {
+ mHandler.removeCallbacks(mWakelockTimeout);
+ mWakelockTimeoutIsActive = false;
+ mCallback.onAnyMotionResult(status);
+ }
+ }
}
}
};
@@ -322,7 +350,10 @@ public class AnyMotionDetector {
@Override
public void run() {
synchronized (mLock) {
- stop();
+ if (mWakelockTimeoutIsActive == true) {
+ mWakelockTimeoutIsActive = false;
+ stop();
+ }
}
}
};
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 85d2981aaa96..eccfb6d514ce 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2313,6 +2313,9 @@ public final class ActivityManagerService extends ActivityManagerNative
} break;
case VR_MODE_CHANGE_MSG: {
VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
+ if (vrService == null) {
+ break;
+ }
final ActivityRecord r = (ActivityRecord) msg.obj;
boolean vrMode;
ComponentName requestedPackage;
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index 8b8e2c4097c2..7873b7aeda28 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -226,12 +226,13 @@ public final class BroadcastQueue {
}
public final boolean replaceParallelBroadcastLocked(BroadcastRecord r) {
+ final Intent intent = r.intent;
for (int i = mParallelBroadcasts.size() - 1; i >= 0; i--) {
final Intent curIntent = mParallelBroadcasts.get(i).intent;
- if (r.intent.filterEquals(curIntent)) {
+ if (intent.filterEquals(curIntent)) {
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"***** DROPPING PARALLEL ["
- + mQueueName + "]: " + r.intent);
+ + mQueueName + "]: " + intent);
mParallelBroadcasts.set(i, r);
return true;
}
@@ -240,11 +241,12 @@ public final class BroadcastQueue {
}
public final boolean replaceOrderedBroadcastLocked(BroadcastRecord r) {
+ final Intent intent = r.intent;
for (int i = mOrderedBroadcasts.size() - 1; i > 0; i--) {
- if (r.intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
+ if (intent.filterEquals(mOrderedBroadcasts.get(i).intent)) {
if (DEBUG_BROADCAST) Slog.v(TAG_BROADCAST,
"***** DROPPING ORDERED ["
- + mQueueName + "]: " + r.intent);
+ + mQueueName + "]: " + intent);
mOrderedBroadcasts.set(i, r);
return true;
}
diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java
index 9dd07a9a9f90..73a17c613c4d 100644
--- a/services/core/java/com/android/server/am/CoreSettingsObserver.java
+++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java
@@ -42,6 +42,7 @@ final class CoreSettingsObserver extends ContentObserver {
String, Class<?>>();
static {
sSecureSettingToTypeMap.put(Settings.Secure.LONG_PRESS_TIMEOUT, int.class);
+ sSecureSettingToTypeMap.put(Settings.Secure.MULTI_PRESS_TIMEOUT, int.class);
// add other secure settings here...
sSystemSettingToTypeMap.put(Settings.System.TIME_12_24, String.class);
diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
index 15ae846186fa..a3febd63e2ed 100644
--- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java
+++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java
@@ -50,13 +50,7 @@ class AutomaticBrightnessController {
// If true, enables the use of the screen auto-brightness adjustment setting.
private static final boolean USE_SCREEN_AUTO_BRIGHTNESS_ADJUSTMENT = true;
- // Hysteresis constraints for brightening or darkening.
- // The recent lux must have changed by at least this fraction relative to the
- // current ambient lux before a change will be considered.
- private static final float BRIGHTENING_LIGHT_HYSTERESIS = 0.10f;
- private static final float DARKENING_LIGHT_HYSTERESIS = 0.20f;
-
- // How long the current sensor reading is assumed to be valid beyond the current time.
+ // How long the current sensor reading is assumed to be valid beyond the current time.
// This provides a bit of prediction, as well as ensures that the weight for the last sample is
// non-zero, which in turn ensures that the total weight is non-zero.
private static final long AMBIENT_LIGHT_PREDICTION_TIME_MILLIS = 100;
@@ -71,7 +65,7 @@ class AutomaticBrightnessController {
private static final int MSG_UPDATE_AMBIENT_LUX = 1;
private static final int MSG_BRIGHTNESS_ADJUSTMENT_SAMPLE = 2;
- // Callbacks for requesting updates to the the display's power state
+ // Callbacks for requesting updates to the display's power state
private final Callbacks mCallbacks;
// The sensor manager.
@@ -115,6 +109,9 @@ class AutomaticBrightnessController {
// weighting values positive.
private final int mWeightingIntercept;
+ // accessor object for determining thresholds to change brightness dynamically
+ private final HysteresisLevels mDynamicHysteresis;
+
// Amount of time to delay auto-brightness after screen on while waiting for
// the light sensor to warm-up in milliseconds.
// May be 0 if no warm-up is required.
@@ -190,7 +187,8 @@ class AutomaticBrightnessController {
int brightnessMin, int brightnessMax, float dozeScaleFactor,
int lightSensorRate, long brighteningLightDebounceConfig,
long darkeningLightDebounceConfig, boolean resetAmbientLuxAfterWarmUpConfig,
- int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma ) {
+ int ambientLightHorizon, float autoBrightnessAdjustmentMaxGamma,
+ HysteresisLevels dynamicHysteresis) {
mCallbacks = callbacks;
mTwilight = LocalServices.getService(TwilightManager.class);
mSensorManager = sensorManager;
@@ -206,6 +204,7 @@ class AutomaticBrightnessController {
mAmbientLightHorizon = ambientLightHorizon;
mWeightingIntercept = ambientLightHorizon;
mScreenAutoBrightnessAdjustmentMaxGamma = autoBrightnessAdjustmentMaxGamma;
+ mDynamicHysteresis = dynamicHysteresis;
mHandler = new AutomaticBrightnessHandler(looper);
mAmbientLightRingBuffer =
@@ -344,8 +343,8 @@ class AutomaticBrightnessController {
private void setAmbientLux(float lux) {
mAmbientLux = lux;
- mBrighteningLuxThreshold = mAmbientLux * (1.0f + BRIGHTENING_LIGHT_HYSTERESIS);
- mDarkeningLuxThreshold = mAmbientLux * (1.0f - DARKENING_LIGHT_HYSTERESIS);
+ mBrighteningLuxThreshold = mDynamicHysteresis.getBrighteningThreshold(lux);
+ mDarkeningLuxThreshold = mDynamicHysteresis.getDarkeningThreshold(lux);
}
private float calculateAmbientLux(long now) {
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 61af8edebb83..df5def9ad9b9 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -72,7 +72,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
private static final String TAG = "DisplayPowerController";
private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked";
- private static boolean DEBUG = false;
+ private static final boolean DEBUG = false;
private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false;
// If true, uses the color fade on animation.
@@ -102,9 +102,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
// Trigger proximity if distance is less than 5 cm.
private static final float TYPICAL_PROXIMITY_THRESHOLD = 5.0f;
- // Brightness animation ramp rate in brightness units per second.
- private static final int BRIGHTNESS_RAMP_RATE_SLOW = 40;
-
private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0;
private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1;
private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
@@ -243,8 +240,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
private boolean mAppliedDimming;
private boolean mAppliedLowPower;
- // Brightness ramp rate fast.
+ // Brightness animation ramp rates in brightness units per second
private final int mBrightnessRampRateFast;
+ private final int mBrightnessRampRateSlow;
// The controller for the automatic brightness level.
private AutomaticBrightnessController mAutomaticBrightnessController;
@@ -307,6 +305,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
mBrightnessRampRateFast = resources.getInteger(
com.android.internal.R.integer.config_brightness_ramp_rate_fast);
+ mBrightnessRampRateSlow = resources.getInteger(
+ com.android.internal.R.integer.config_brightness_ramp_rate_slow);
int lightSensorRate = resources.getInteger(
com.android.internal.R.integer.config_autoBrightnessLightSensorRate);
@@ -322,6 +322,15 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
com.android.internal.R.fraction.config_autoBrightnessAdjustmentMaxGamma,
1, 1);
+ int[] brightLevels = resources.getIntArray(
+ com.android.internal.R.array.config_dynamicHysteresisBrightLevels);
+ int[] darkLevels = resources.getIntArray(
+ com.android.internal.R.array.config_dynamicHysteresisDarkLevels);
+ int[] luxLevels = resources.getIntArray(
+ com.android.internal.R.array.config_dynamicHysteresisLuxLevels);
+ HysteresisLevels dynamicHysteresis = new HysteresisLevels(
+ brightLevels, darkLevels, luxLevels);
+
if (mUseSoftwareAutoBrightnessConfig) {
int[] lux = resources.getIntArray(
com.android.internal.R.array.config_autoBrightnessLevels);
@@ -358,8 +367,8 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
lightSensorWarmUpTimeConfig, screenBrightnessRangeMinimum,
mScreenBrightnessRangeMaximum, dozeScaleFactor, lightSensorRate,
brighteningLightDebounce, darkeningLightDebounce,
- autoBrightnessResetAmbientLuxAfterWarmUp,
- ambientLightHorizon, autoBrightnessAdjustmentMaxGamma);
+ autoBrightnessResetAmbientLuxAfterWarmUp, ambientLightHorizon,
+ autoBrightnessAdjustmentMaxGamma, dynamicHysteresis);
}
}
@@ -703,7 +712,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call
if (!mPendingScreenOff) {
if (state == Display.STATE_ON || state == Display.STATE_DOZE) {
animateScreenBrightness(brightness,
- slowChange ? BRIGHTNESS_RAMP_RATE_SLOW : mBrightnessRampRateFast);
+ slowChange ? mBrightnessRampRateSlow : mBrightnessRampRateFast);
} else {
animateScreenBrightness(brightness, 0);
}
diff --git a/services/core/java/com/android/server/display/HysteresisLevels.java b/services/core/java/com/android/server/display/HysteresisLevels.java
new file mode 100644
index 000000000000..b06222563811
--- /dev/null
+++ b/services/core/java/com/android/server/display/HysteresisLevels.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.display;
+
+import android.util.Slog;
+
+/**
+ * A helper class for handling access to illuminance hysteresis level values.
+ */
+final class HysteresisLevels {
+ private static final String TAG = "HysteresisLevels";
+
+ // Default hysteresis constraints for brightening or darkening.
+ // The recent lux must have changed by at least this fraction relative to the
+ // current ambient lux before a change will be considered.
+ private static final float DEFAULT_BRIGHTENING_HYSTERESIS = 0.10f;
+ private static final float DEFAULT_DARKENING_HYSTERESIS = 0.20f;
+
+ private static final boolean DEBUG = false;
+
+ private final float[] mBrightLevels;
+ private final float[] mDarkLevels;
+ private final float[] mLuxLevels;
+
+ /**
+ * Creates a {@code HysteresisLevels} object with the given equal-length
+ * integer arrays.
+ * @param brightLevels an array of brightening hysteresis constraint constants
+ * @param darkLevels an array of darkening hysteresis constraint constants
+ * @param luxLevels a monotonically increasing array of illuminance
+ * thresholds in units of lux
+ */
+ public HysteresisLevels(int[] brightLevels, int[] darkLevels, int[] luxLevels) {
+ if (brightLevels.length != darkLevels.length || darkLevels.length != luxLevels.length + 1) {
+ throw new IllegalArgumentException("Mismatch between hysteresis array lengths.");
+ }
+ mBrightLevels = setArrayFormat(brightLevels, 1000.0f);
+ mDarkLevels = setArrayFormat(darkLevels, 1000.0f);
+ mLuxLevels = setArrayFormat(luxLevels, 1.0f);
+ }
+
+ /**
+ * Return the brightening hysteresis threshold for the given lux level.
+ */
+ public float getBrighteningThreshold(float lux) {
+ float brightConstant = getReferenceLevel(lux, mBrightLevels);
+ float brightThreshold = lux * (1.0f + brightConstant);
+ if (DEBUG) {
+ Slog.d(TAG, "bright hysteresis constant=: " + brightConstant + ", threshold="
+ + brightThreshold + ", lux=" + lux);
+ }
+ return brightThreshold;
+ }
+
+ /**
+ * Return the darkening hysteresis threshold for the given lux level.
+ */
+ public float getDarkeningThreshold(float lux) {
+ float darkConstant = getReferenceLevel(lux, mDarkLevels);
+ float darkThreshold = lux * (1.0f - darkConstant);
+ if (DEBUG) {
+ Slog.d(TAG, "dark hysteresis constant=: " + darkConstant + ", threshold="
+ + darkThreshold + ", lux=" + lux);
+ }
+ return darkThreshold;
+ }
+
+ /**
+ * Return the hysteresis constant for the closest lux threshold value to the
+ * current illuminance from the given array.
+ */
+ private float getReferenceLevel(float lux, float[] referenceLevels) {
+ int index = 0;
+ while (mLuxLevels.length > index && lux >= mLuxLevels[index]) {
+ ++index;
+ }
+ return referenceLevels[index];
+ }
+
+ /**
+ * Return a float array where each i-th element equals {@code configArray[i]/divideFactor}.
+ */
+ private float[] setArrayFormat(int[] configArray, float divideFactor) {
+ float[] levelArray = new float[configArray.length];
+ for (int index = 0; levelArray.length > index; ++index) {
+ levelArray[index] = (float)configArray[index] / divideFactor;
+ }
+ return levelArray;
+ }
+}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index 07048a491543..ca6481792dfe 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -172,10 +172,12 @@ public class LightsService extends SystemService {
if (phase == PHASE_SYSTEM_SERVICES_READY) {
IVrManager vrManager =
(IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE);
- try {
- vrManager.registerListener(mVrStateCallbacks);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+ if (vrManager != null) {
+ try {
+ vrManager.registerListener(mVrStateCallbacks);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+ }
}
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index d479bfc181da..7545959fcce5 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -1020,7 +1020,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
*/
private void notifyOverLimitNL(NetworkTemplate template) {
if (!mOverLimitNotified.contains(template)) {
- mContext.startActivity(buildNetworkOverLimitIntent(template));
+ mContext.startActivity(buildNetworkOverLimitIntent(mContext.getResources(), template));
mOverLimitNotified.add(template);
}
}
@@ -1066,7 +1066,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
builder.setDeleteIntent(PendingIntent.getBroadcast(
mContext, 0, snoozeIntent, PendingIntent.FLAG_UPDATE_CURRENT));
- final Intent viewIntent = buildViewDataUsageIntent(policy.template);
+ final Intent viewIntent = buildViewDataUsageIntent(res, policy.template);
builder.setContentIntent(PendingIntent.getActivity(
mContext, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT));
@@ -1102,7 +1102,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
builder.setContentTitle(title);
builder.setContentText(body);
- final Intent intent = buildNetworkOverLimitIntent(policy.template);
+ final Intent intent = buildNetworkOverLimitIntent(res, policy.template);
builder.setContentIntent(PendingIntent.getActivity(
mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
break;
@@ -1137,7 +1137,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
builder.setContentTitle(title);
builder.setContentText(body);
- final Intent intent = buildViewDataUsageIntent(policy.template);
+ final Intent intent = buildViewDataUsageIntent(res, policy.template);
builder.setContentIntent(PendingIntent.getActivity(
mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT));
break;
@@ -3594,19 +3594,19 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
return intent;
}
- private static Intent buildNetworkOverLimitIntent(NetworkTemplate template) {
+ private static Intent buildNetworkOverLimitIntent(Resources res, NetworkTemplate template) {
final Intent intent = new Intent();
- intent.setComponent(new ComponentName(
- "com.android.systemui", "com.android.systemui.net.NetworkOverLimitActivity"));
+ intent.setComponent(ComponentName.unflattenFromString(
+ res.getString(R.string.config_networkOverLimitComponent)));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(EXTRA_NETWORK_TEMPLATE, template);
return intent;
}
- private static Intent buildViewDataUsageIntent(NetworkTemplate template) {
+ private static Intent buildViewDataUsageIntent(Resources res, NetworkTemplate template) {
final Intent intent = new Intent();
- intent.setComponent(new ComponentName(
- "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity"));
+ intent.setComponent(ComponentName.unflattenFromString(
+ res.getString(R.string.config_dataUsageSummaryComponent)));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(EXTRA_NETWORK_TEMPLATE, template);
return intent;
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index eb85f191304e..b1468f182fd3 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -140,7 +140,6 @@ import com.android.server.lights.LightsManager;
import com.android.server.notification.ManagedServices.ManagedServiceInfo;
import com.android.server.policy.PhoneWindowManager;
import com.android.server.statusbar.StatusBarManagerInternal;
-import com.android.server.vr.VrManagerInternal;
import com.android.server.notification.ManagedServices.UserProfiles;
import libcore.io.IoUtils;
@@ -232,7 +231,6 @@ public class NotificationManagerService extends SystemService {
AudioManagerInternal mAudioManagerInternal;
@Nullable StatusBarManagerInternal mStatusBar;
Vibrator mVibrator;
- private VrManagerInternal mVrManagerInternal;
private WindowManagerInternal mWindowManagerInternal;
final IBinder mForegroundToken = new Binder();
@@ -1128,7 +1126,6 @@ public class NotificationManagerService extends SystemService {
// Grab our optional AudioService
mAudioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
mAudioManagerInternal = getLocalService(AudioManagerInternal.class);
- mVrManagerInternal = getLocalService(VrManagerInternal.class);
mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
mZenModeHelper.onSystemReady();
} else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index ded85f3da3d6..5016ec0d4be0 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -150,6 +150,10 @@ final class DefaultPermissionGrantPolicy {
private static final int MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS = 1;
+ private static final String ACTION_TWINNING =
+ "com.google.android.clockwork.intent.TWINNING_SETTINGS";
+ private static final String ACTION_TRACK = "com.android.fitness.TRACK";
+
private final PackageManagerService mService;
private final Handler mHandler;
@@ -603,8 +607,9 @@ final class DefaultPermissionGrantPolicy {
grantRuntimePermissionsLPw(musicPackage, STORAGE_PERMISSIONS, userId);
}
- // Android Wear Home
+ // Watches
if (mService.hasSystemFeature(PackageManager.FEATURE_WATCH, 0)) {
+ // Home application on watches
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory(Intent.CATEGORY_HOME_MAIN);
@@ -621,6 +626,27 @@ final class DefaultPermissionGrantPolicy {
grantRuntimePermissionsLPw(wearHomePackage, LOCATION_PERMISSIONS, false,
userId);
}
+
+ // Twinning on watches
+ Intent twinningIntent = new Intent(ACTION_TWINNING);
+ PackageParser.Package twinningPackage = getDefaultSystemHandlerActivityPackageLPr(
+ twinningIntent, userId);
+
+ if (twinningPackage != null
+ && doesPackageSupportRuntimePermissions(twinningPackage)) {
+ grantRuntimePermissionsLPw(twinningPackage, PHONE_PERMISSIONS, false, userId);
+ grantRuntimePermissionsLPw(twinningPackage, SMS_PERMISSIONS, false, userId);
+ }
+
+ // Fitness tracking on watches
+ Intent trackIntent = new Intent(ACTION_TRACK);
+ PackageParser.Package trackPackage = getDefaultSystemHandlerActivityPackageLPr(
+ trackIntent, userId);
+ if (trackPackage != null
+ && doesPackageSupportRuntimePermissions(trackPackage)) {
+ grantRuntimePermissionsLPw(trackPackage, SENSORS_PERMISSIONS, false, userId);
+ grantRuntimePermissionsLPw(trackPackage, LOCATION_PERMISSIONS, false, userId);
+ }
}
// Print Spooler
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index c360c901d485..8419b98d3bc9 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -463,6 +463,12 @@ public class PackageManagerService extends IPackageManager.Stub {
private static final String PACKAGE_SCHEME = "package";
private static final String VENDOR_OVERLAY_DIR = "/vendor/overlay";
+ /**
+ * If VENDOR_OVERLAY_SKU_PROPERTY is set, search for runtime resource overlay APKs in
+ * VENDOR_OVERLAY_DIR/<value of VENDOR_OVERLAY_SKU_PROPERTY> rather than in
+ * VENDOR_OVERLAY_DIR.
+ */
+ private static final String VENDOR_OVERLAY_SKU_PROPERTY = "ro.boot.vendor.overlay.sku";
private static int DEFAULT_EPHEMERAL_HASH_PREFIX_MASK = 0xFFFFF000;
private static int DEFAULT_EPHEMERAL_HASH_PREFIX_COUNT = 5;
@@ -2268,8 +2274,14 @@ public class PackageManagerService extends IPackageManager.Stub {
// Collect vendor overlay packages.
// (Do this before scanning any apps.)
// For security and version matching reason, only consider
- // overlay packages if they reside in VENDOR_OVERLAY_DIR.
- File vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
+ // overlay packages if they reside in the right directory.
+ File vendorOverlayDir;
+ String overlaySkuDir = SystemProperties.get(VENDOR_OVERLAY_SKU_PROPERTY);
+ if (!overlaySkuDir.isEmpty()) {
+ vendorOverlayDir = new File(VENDOR_OVERLAY_DIR, overlaySkuDir);
+ } else {
+ vendorOverlayDir = new File(VENDOR_OVERLAY_DIR);
+ }
scanDirTracedLI(vendorOverlayDir, mDefParseFlags
| PackageParser.PARSE_IS_SYSTEM
| PackageParser.PARSE_IS_SYSTEM_DIR
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 3ec3ceaf544f..46a236d331fa 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -202,6 +202,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static final int MULTI_PRESS_POWER_THEATER_MODE = 1;
static final int MULTI_PRESS_POWER_BRIGHTNESS_BOOST = 2;
+ // Number of presses needed before we induce panic press behavior on the back button
+ static final int PANIC_PRESS_BACK_COUNT = 4;
+ static final int PANIC_PRESS_BACK_NOTHING = 0;
+ static final int PANIC_PRESS_BACK_HOME = 1;
+
// These need to match the documentation/constant in
// core/res/res/values/config.xml
static final int LONG_PRESS_HOME_NOTHING = 0;
@@ -411,6 +416,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
volatile boolean mBackKeyHandled;
volatile boolean mBeganFromNonInteractive;
volatile int mPowerKeyPressCounter;
+ volatile int mBackKeyPressCounter;
volatile boolean mEndCallKeyHandled;
volatile boolean mCameraGestureTriggeredDuringGoingToSleep;
volatile boolean mGoingToSleep;
@@ -469,6 +475,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
int mDoublePressOnPowerBehavior;
int mTriplePressOnPowerBehavior;
int mLongPressOnBackBehavior;
+ int mPanicPressOnBackBehavior;
int mShortPressOnSleepBehavior;
int mShortPressWindowBehavior;
boolean mAwake;
@@ -642,6 +649,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// (See Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR.)
int mIncallPowerBehavior;
+ // Behavior of Back button while in-call and screen on
+ int mIncallBackBehavior;
+
Display mDisplay;
private int mDisplayRotation;
@@ -731,6 +741,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
private static final int MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU = 17;
private static final int MSG_BACK_LONG_PRESS = 18;
private static final int MSG_DISPOSE_INPUT_CONSUMER = 19;
+ private static final int MSG_BACK_DELAYED_PRESS = 20;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_STATUS = 0;
private static final int MSG_REQUEST_TRANSIENT_BARS_ARG_NAVIGATION = 1;
@@ -797,10 +808,15 @@ public class PhoneWindowManager implements WindowManagerPolicy {
break;
case MSG_BACK_LONG_PRESS:
backLongPress();
+ finishBackKeyPress();
break;
case MSG_DISPOSE_INPUT_CONSUMER:
disposeInputConsumer((InputConsumer) msg.obj);
break;
+ case MSG_BACK_DELAYED_PRESS:
+ backMultiPressAction((Long) msg.obj, msg.arg1);
+ finishBackKeyPress();
+ break;
}
}
}
@@ -827,6 +843,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR), false, this,
+ UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.WAKE_GESTURE_ENABLED), false, this,
UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.System.getUriFor(
@@ -1015,6 +1034,73 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void interceptBackKeyDown() {
+ // Reset back key state for long press
+ mBackKeyHandled = false;
+
+ // Cancel multi-press detection timeout.
+ if (hasPanicPressOnBackBehavior()) {
+ if (mBackKeyPressCounter != 0
+ && mBackKeyPressCounter < PANIC_PRESS_BACK_COUNT) {
+ mHandler.removeMessages(MSG_BACK_DELAYED_PRESS);
+ }
+ }
+
+ if (hasLongPressOnBackBehavior()) {
+ Message msg = mHandler.obtainMessage(MSG_BACK_LONG_PRESS);
+ msg.setAsynchronous(true);
+ mHandler.sendMessageDelayed(msg,
+ ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
+ }
+ }
+
+ // returns true if the key was handled and should not be passed to the user
+ private boolean interceptBackKeyUp(KeyEvent event) {
+ // Cache handled state
+ boolean handled = mBackKeyHandled;
+
+ if (hasPanicPressOnBackBehavior()) {
+ // Check for back key panic press
+ ++mBackKeyPressCounter;
+
+ final long eventTime = event.getDownTime();
+
+ if (mBackKeyPressCounter <= PANIC_PRESS_BACK_COUNT) {
+ // This could be a multi-press. Wait a little bit longer to confirm.
+ Message msg = mHandler.obtainMessage(MSG_BACK_DELAYED_PRESS,
+ mBackKeyPressCounter, 0, eventTime);
+ msg.setAsynchronous(true);
+ mHandler.sendMessageDelayed(msg, ViewConfiguration.getMultiPressTimeout());
+ }
+ }
+
+ // Reset back long press state
+ cancelPendingBackKeyAction();
+
+ if (mHasFeatureWatch) {
+ TelecomManager telecomManager = getTelecommService();
+
+ if (telecomManager != null) {
+ if (telecomManager.isRinging()) {
+ // Pressing back while there's a ringing incoming
+ // call should silence the ringer.
+ telecomManager.silenceRinger();
+
+ // It should not prevent navigating away
+ return false;
+ } else if (
+ (mIncallBackBehavior & Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR_HANGUP) != 0
+ && telecomManager.isInCall()) {
+ // Otherwise, if "Back button ends call" is enabled,
+ // the Back button will hang up any current active call.
+ return telecomManager.endCall();
+ }
+ }
+ }
+
+ return handled;
+ }
+
private void interceptPowerKeyDown(KeyEvent event, boolean interactive) {
// Hold a wake lock until the power key is released.
if (!mPowerKeyWakeLock.isHeld()) {
@@ -1145,6 +1231,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void finishBackKeyPress() {
+ mBackKeyPressCounter = 0;
+ }
+
private void cancelPendingPowerKeyAction() {
if (!mPowerKeyHandled) {
mPowerKeyHandled = true;
@@ -1159,6 +1249,18 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
}
+ private void backMultiPressAction(long eventTime, int count) {
+ if (count >= PANIC_PRESS_BACK_COUNT) {
+ switch (mPanicPressOnBackBehavior) {
+ case PANIC_PRESS_BACK_NOTHING:
+ break;
+ case PANIC_PRESS_BACK_HOME:
+ launchHomeFromHotKey();
+ break;
+ }
+ }
+ }
+
private void powerPress(long eventTime, boolean interactive, int count) {
if (mScreenOnEarly && !mScreenOnFully) {
Slog.i(TAG, "Suppressed redundant power key press while "
@@ -1273,8 +1375,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
case LONG_PRESS_BACK_NOTHING:
break;
case LONG_PRESS_BACK_GO_TO_VOICE_ASSIST:
- Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
- startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+ final boolean keyguardActive = mKeyguardDelegate == null
+ ? false
+ : mKeyguardDelegate.isShowing();
+ if (!keyguardActive) {
+ Intent intent = new Intent(Intent.ACTION_VOICE_ASSIST);
+ startActivityAsUser(intent, UserHandle.CURRENT_OR_SELF);
+ }
break;
}
}
@@ -1317,6 +1424,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
return mLongPressOnBackBehavior != LONG_PRESS_BACK_NOTHING;
}
+ private boolean hasPanicPressOnBackBehavior() {
+ return mPanicPressOnBackBehavior != PANIC_PRESS_BACK_NOTHING;
+ }
+
private void interceptScreenshotChord() {
if (mScreenshotChordEnabled
&& mScreenshotChordVolumeDownKeyTriggered && mScreenshotChordPowerKeyTriggered
@@ -1644,6 +1755,8 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mLongPressOnBackBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnBackBehavior);
+ mPanicPressOnBackBehavior = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_backPanicBehavior);
mShortPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_shortPressOnPowerBehavior);
@@ -1941,6 +2054,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR,
Settings.Secure.INCALL_POWER_BUTTON_BEHAVIOR_DEFAULT,
UserHandle.USER_CURRENT);
+ mIncallBackBehavior = Settings.Secure.getIntForUser(resolver,
+ Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR,
+ Settings.Secure.INCALL_BACK_BUTTON_BEHAVIOR_DEFAULT,
+ UserHandle.USER_CURRENT);
// Configure wake gesture.
boolean wakeGestureEnabledSetting = Settings.Secure.getIntForUser(resolver,
@@ -5667,20 +5784,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK: {
if (down) {
- mBackKeyHandled = false;
- if (hasLongPressOnBackBehavior()) {
- Message msg = mHandler.obtainMessage(MSG_BACK_LONG_PRESS);
- msg.setAsynchronous(true);
- mHandler.sendMessageDelayed(msg,
- ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout());
- }
+ interceptBackKeyDown();
} else {
- boolean handled = mBackKeyHandled;
-
- // Reset back key state
- cancelPendingBackKeyAction();
+ boolean handled = interceptBackKeyUp(event);
- // Don't pass back press to app if we've already handled it
+ // Don't pass back press to app if we've already handled it via long press
if (handled) {
result &= ~ACTION_PASS_TO_USER;
}
@@ -7996,6 +8104,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
pw.print(" mLockScreenTimerActive="); pw.println(mLockScreenTimerActive);
pw.print(prefix); pw.print("mEndcallBehavior="); pw.print(mEndcallBehavior);
pw.print(" mIncallPowerBehavior="); pw.print(mIncallPowerBehavior);
+ pw.print(" mIncallBackBehavior="); pw.print(mIncallBackBehavior);
pw.print(" mLongPressOnHomeBehavior="); pw.println(mLongPressOnHomeBehavior);
pw.print(prefix); pw.print("mLandscapeRotation="); pw.print(mLandscapeRotation);
pw.print(" mSeascapeRotation="); pw.println(mSeascapeRotation);
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 01288b81a6c5..554696d666c5 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -669,10 +669,12 @@ public final class PowerManagerService extends SystemService
false, mSettingsObserver, UserHandle.USER_ALL);
IVrManager vrManager =
(IVrManager) getBinderService(VrManagerService.VR_MANAGER_BINDER_SERVICE);
- try {
- vrManager.registerListener(mVrStateCallbacks);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+ if (vrManager != null) {
+ try {
+ vrManager.registerListener(mVrStateCallbacks);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Failed to register VR mode state listener: " + e);
+ }
}
// Go.
readConfigurationLocked();
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 45014ec07178..fc14444ba6ef 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -6011,8 +6011,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
updateDeviceOwnerLocked();
disableDeviceOwnerManagedSingleUserFeaturesIfNeeded();
try {
- // Reactivate backup service.
- mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true);
+ if (mInjector.getIBackupManager() != null) {
+ // Reactivate backup service.
+ mInjector.getIBackupManager().setBackupServiceActive(UserHandle.USER_SYSTEM, true);
+ }
} catch (RemoteException e) {
throw new IllegalStateException("Failed reactivating backup service.", e);
}
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 7ebdd3109a2c..0de6b7790856 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -549,9 +549,15 @@ public final class SystemServer {
false);
boolean disableTrustManager = SystemProperties.getBoolean("config.disable_trustmanager",
false);
- boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices", false);
+ boolean disableTextServices = SystemProperties.getBoolean("config.disable_textservices",
+ false);
boolean disableSamplingProfiler = SystemProperties.getBoolean("config.disable_samplingprof",
false);
+ boolean disableConsumerIr = SystemProperties.getBoolean("config.disable_consumerir", false);
+ boolean disableVrManager = SystemProperties.getBoolean("config.disable_vrmanager", false);
+ boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice",
+ false);
+
boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");
try {
@@ -575,8 +581,10 @@ public final class SystemServer {
mContentResolver = context.getContentResolver();
- Slog.i(TAG, "Camera Service");
- mSystemServiceManager.startService(CameraService.class);
+ if (!disableCameraService) {
+ Slog.i(TAG, "Camera Service");
+ mSystemServiceManager.startService(CameraService.class);
+ }
// The AccountManager must come before the ContentService
traceBeginAndSlog("StartAccountManagerService");
@@ -596,10 +604,12 @@ public final class SystemServer {
ServiceManager.addService("vibrator", vibrator);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
- traceBeginAndSlog("StartConsumerIrService");
- consumerIr = new ConsumerIrService(context);
- ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);
- Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ if (!disableConsumerIr) {
+ traceBeginAndSlog("StartConsumerIrService");
+ consumerIr = new ConsumerIrService(context);
+ ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);
+ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ }
traceBeginAndSlog("StartAlarmManagerService");
mSystemServiceManager.startService(AlarmManagerService.class);
@@ -622,9 +632,11 @@ public final class SystemServer {
ServiceManager.addService(Context.INPUT_SERVICE, inputManager);
Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
- traceBeginAndSlog("StartVrManagerService");
- mSystemServiceManager.startService(VrManagerService.class);
- Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ if (!disableVrManager) {
+ traceBeginAndSlog("StartVrManagerService");
+ mSystemServiceManager.startService(VrManagerService.class);
+ Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
+ }
mActivityManagerService.setWindowManager(wm);