diff options
Diffstat (limited to 'services/java')
22 files changed, 351 insertions, 97 deletions
diff --git a/services/java/Android.mk b/services/java/Android.mk index c756d29..e70a6c9 100644 --- a/services/java/Android.mk +++ b/services/java/Android.mk @@ -11,7 +11,7 @@ LOCAL_SRC_FILES := \ LOCAL_MODULE:= services -LOCAL_JAVA_LIBRARIES := android.policy +LOCAL_JAVA_LIBRARIES := android.policy telephony-common LOCAL_NO_EMMA_INSTRUMENT := true LOCAL_NO_EMMA_COMPILE := true diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index f4e43ff..f9c432b 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -819,7 +819,10 @@ class AppWidgetServiceImpl { return; } - int bitmapMemoryUsage = views.estimateMemoryUsage(); + int bitmapMemoryUsage = 0; + if (views != null) { + bitmapMemoryUsage = views.estimateMemoryUsage(); + } if (bitmapMemoryUsage > mMaxWidgetBitmapMemory) { throw new IllegalArgumentException("RemoteViews for widget update exceeds maximum" + " bitmap memory usage (used: " + bitmapMemoryUsage + ", max: " + diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 7bbc8b5..86ada40 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -77,6 +77,7 @@ import android.util.SparseIntArray; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.server.am.BatteryStatsService; import com.android.server.connectivity.Tethering; import com.android.server.connectivity.Vpn; @@ -1008,7 +1009,7 @@ private NetworkStateTracker makeWimaxStateTracker() { try { if (!ConnectivityManager.isNetworkTypeValid(networkType) || mNetConfigs[networkType] == null) { - return Phone.APN_REQUEST_FAILED; + return PhoneConstants.APN_REQUEST_FAILED; } FeatureUser f = new FeatureUser(networkType, feature, binder); @@ -1027,7 +1028,7 @@ private NetworkStateTracker makeWimaxStateTracker() { uidRules = mUidRules.get(Binder.getCallingUid(), RULE_ALLOW_ALL); } if (networkMetered && (uidRules & RULE_REJECT_METERED) != 0) { - return Phone.APN_REQUEST_FAILED; + return PhoneConstants.APN_REQUEST_FAILED; } NetworkStateTracker network = mNetTrackers[usedNetworkType]; @@ -1039,7 +1040,7 @@ private NetworkStateTracker makeWimaxStateTracker() { if (ni.isAvailable() == false) { if (!TextUtils.equals(feature,Phone.FEATURE_ENABLE_DUN_ALWAYS)) { if (DBG) log("special network not available ni=" + ni.getTypeName()); - return Phone.APN_TYPE_NOT_AVAILABLE; + return PhoneConstants.APN_TYPE_NOT_AVAILABLE; } else { // else make the attempt anyway - probably giving REQUEST_STARTED below if (DBG) { @@ -1088,10 +1089,10 @@ private NetworkStateTracker makeWimaxStateTracker() { } finally { Binder.restoreCallingIdentity(token); } - return Phone.APN_ALREADY_ACTIVE; + return PhoneConstants.APN_ALREADY_ACTIVE; } if (VDBG) log("special network already connecting"); - return Phone.APN_REQUEST_STARTED; + return PhoneConstants.APN_REQUEST_STARTED; } // check if the radio in play can make another contact @@ -1102,7 +1103,7 @@ private NetworkStateTracker makeWimaxStateTracker() { feature); } network.reconnect(); - return Phone.APN_REQUEST_STARTED; + return PhoneConstants.APN_REQUEST_STARTED; } else { // need to remember this unsupported request so we respond appropriately on stop synchronized(this) { @@ -1115,7 +1116,7 @@ private NetworkStateTracker makeWimaxStateTracker() { return -1; } } - return Phone.APN_TYPE_NOT_AVAILABLE; + return PhoneConstants.APN_TYPE_NOT_AVAILABLE; } finally { if (DBG) { final long execTime = SystemClock.elapsedRealtime() - startTime; @@ -2037,7 +2038,7 @@ private NetworkStateTracker makeWimaxStateTracker() { // @see bug/4455071 /** Notify TetheringService if interface name has been changed. */ if (TextUtils.equals(mNetTrackers[netType].getNetworkInfo().getReason(), - Phone.REASON_LINK_PROPERTIES_CHANGED)) { + PhoneConstants.REASON_LINK_PROPERTIES_CHANGED)) { if (isTetheringSupported()) { mTethering.handleTetherIfaceChange(); } @@ -2489,6 +2490,11 @@ private NetworkStateTracker makeWimaxStateTracker() { // @see bug/4455071 handleConnectivityChange(info.getType(), false); break; + case NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED: + info = (NetworkInfo) msg.obj; + type = info.getType(); + updateNetworkSettings(mNetTrackers[type]); + break; case EVENT_CLEAR_NET_TRANSITION_WAKELOCK: String causedBy = null; synchronized (ConnectivityService.this) { diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index 7609613..ea19d6e 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -1691,6 +1691,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // Note: we can only do the wipe via ExternalStorageFormatter if the volume is not emulated. if ((forceExtWipe || wipeExtRequested) && !Environment.isExternalStorageEmulated()) { Intent intent = new Intent(ExternalStorageFormatter.FORMAT_AND_FACTORY_RESET); + intent.putExtra(ExternalStorageFormatter.EXTRA_ALWAYS_RESET, true); intent.setComponent(ExternalStorageFormatter.COMPONENT_NAME); mWakeLock.acquire(10000); mContext.startService(intent); diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java index 2918dbc..8c1581c 100644 --- a/services/java/com/android/server/LocationManagerService.java +++ b/services/java/com/android/server/LocationManagerService.java @@ -32,6 +32,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.content.res.Resources; +import android.database.ContentObserver; import android.database.Cursor; import android.location.Address; import android.location.Criteria; @@ -79,6 +80,8 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Observable; @@ -109,6 +112,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run private static final String INSTALL_LOCATION_PROVIDER = android.Manifest.permission.INSTALL_LOCATION_PROVIDER; + private static final String BLACKLIST_CONFIG_NAME = "locationPackagePrefixBlacklist"; + private static final String WHITELIST_CONFIG_NAME = "locationPackagePrefixWhitelist"; + // Location Providers may sometimes deliver location updates // slightly faster that requested - provide grace period so // we don't unnecessarily filter events that are otherwise on @@ -193,6 +199,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run private int mNetworkState = LocationProvider.TEMPORARILY_UNAVAILABLE; + // for prefix blacklist + private String[] mWhitelist = new String[0]; + private String[] mBlacklist = new String[0]; + // for Settings change notification private ContentQueryMap mSettings; @@ -205,20 +215,23 @@ public class LocationManagerService extends ILocationManager.Stub implements Run final PendingIntent mPendingIntent; final Object mKey; final HashMap<String,UpdateRecord> mUpdateRecords = new HashMap<String,UpdateRecord>(); + final String mPackageName; int mPendingBroadcasts; String mRequiredPermissions; - Receiver(ILocationListener listener) { + Receiver(ILocationListener listener, String packageName) { mListener = listener; mPendingIntent = null; mKey = listener.asBinder(); + mPackageName = packageName; } - Receiver(PendingIntent intent) { + Receiver(PendingIntent intent, String packageName) { mPendingIntent = intent; mListener = null; mKey = intent; + mPackageName = packageName; } @Override @@ -601,6 +614,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run // Load providers loadProviders(); + loadBlacklist(); // Register for Network (Wifi or Mobile) updates IntentFilter intentFilter = new IntentFilter(); @@ -1110,11 +1124,11 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } - private Receiver getReceiver(ILocationListener listener) { + private Receiver getReceiver(ILocationListener listener, String packageName) { IBinder binder = listener.asBinder(); Receiver receiver = mReceivers.get(binder); if (receiver == null) { - receiver = new Receiver(listener); + receiver = new Receiver(listener, packageName); mReceivers.put(binder, receiver); try { @@ -1129,10 +1143,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run return receiver; } - private Receiver getReceiver(PendingIntent intent) { + private Receiver getReceiver(PendingIntent intent, String packageName) { Receiver receiver = mReceivers.get(intent); if (receiver == null) { - receiver = new Receiver(intent); + receiver = new Receiver(intent, packageName); mReceivers.put(intent, receiver); } return receiver; @@ -1157,7 +1171,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } public void requestLocationUpdates(String provider, Criteria criteria, - long minTime, float minDistance, boolean singleShot, ILocationListener listener) { + long minTime, float minDistance, boolean singleShot, ILocationListener listener, + String packageName) { + checkPackageName(Binder.getCallingUid(), packageName); if (criteria != null) { // FIXME - should we consider using multiple providers simultaneously // rather than only the best one? @@ -1170,7 +1186,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run try { synchronized (mLock) { requestLocationUpdatesLocked(provider, minTime, minDistance, singleShot, - getReceiver(listener)); + getReceiver(listener, packageName)); } } catch (SecurityException se) { throw se; @@ -1194,7 +1210,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } public void requestLocationUpdatesPI(String provider, Criteria criteria, - long minTime, float minDistance, boolean singleShot, PendingIntent intent) { + long minTime, float minDistance, boolean singleShot, PendingIntent intent, + String packageName) { + checkPackageName(Binder.getCallingUid(), packageName); validatePendingIntent(intent); if (criteria != null) { // FIXME - should we consider using multiple providers simultaneously @@ -1208,7 +1226,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run try { synchronized (mLock) { requestLocationUpdatesLocked(provider, minTime, minDistance, singleShot, - getReceiver(intent)); + getReceiver(intent, packageName)); } } catch (SecurityException se) { throw se; @@ -1270,10 +1288,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } - public void removeUpdates(ILocationListener listener) { + public void removeUpdates(ILocationListener listener, String packageName) { try { synchronized (mLock) { - removeUpdatesLocked(getReceiver(listener)); + removeUpdatesLocked(getReceiver(listener, packageName)); } } catch (SecurityException se) { throw se; @@ -1284,10 +1302,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } - public void removeUpdatesPI(PendingIntent intent) { + public void removeUpdatesPI(PendingIntent intent, String packageName) { try { synchronized (mLock) { - removeUpdatesLocked(getReceiver(intent)); + removeUpdatesLocked(getReceiver(intent, packageName)); } } catch (SecurityException se) { throw se; @@ -1446,15 +1464,17 @@ public class LocationManagerService extends ILocationManager.Stub implements Run final long mExpiration; final PendingIntent mIntent; final Location mLocation; + final String mPackageName; public ProximityAlert(int uid, double latitude, double longitude, - float radius, long expiration, PendingIntent intent) { + float radius, long expiration, PendingIntent intent, String packageName) { mUid = uid; mLatitude = latitude; mLongitude = longitude; mRadius = radius; mExpiration = expiration; mIntent = intent; + mPackageName = packageName; mLocation = new Location(""); mLocation.setLatitude(latitude); @@ -1522,6 +1542,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run PendingIntent intent = alert.getIntent(); long expiration = alert.getExpiration(); + if (inBlacklist(alert.mPackageName)) { + continue; + } + if ((expiration == -1) || (now <= expiration)) { boolean entered = mProximitiesEntered.contains(alert); boolean inProximity = @@ -1632,11 +1656,12 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } public void addProximityAlert(double latitude, double longitude, - float radius, long expiration, PendingIntent intent) { + float radius, long expiration, PendingIntent intent, String packageName) { validatePendingIntent(intent); try { synchronized (mLock) { - addProximityAlertLocked(latitude, longitude, radius, expiration, intent); + addProximityAlertLocked(latitude, longitude, radius, expiration, intent, + packageName); } } catch (SecurityException se) { throw se; @@ -1648,7 +1673,7 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } private void addProximityAlertLocked(double latitude, double longitude, - float radius, long expiration, PendingIntent intent) { + float radius, long expiration, PendingIntent intent, String packageName) { if (LOCAL_LOGV) { Slog.v(TAG, "addProximityAlert: latitude = " + latitude + ", longitude = " + longitude + @@ -1656,6 +1681,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run ", intent = " + intent); } + checkPackageName(Binder.getCallingUid(), packageName); + // Require ability to access all providers for now if (!isAllowedProviderSafe(LocationManager.GPS_PROVIDER) || !isAllowedProviderSafe(LocationManager.NETWORK_PROVIDER)) { @@ -1666,12 +1693,12 @@ public class LocationManagerService extends ILocationManager.Stub implements Run expiration += System.currentTimeMillis(); } ProximityAlert alert = new ProximityAlert(Binder.getCallingUid(), - latitude, longitude, radius, expiration, intent); + latitude, longitude, radius, expiration, intent, packageName); mProximityAlerts.put(intent, alert); if (mProximityReceiver == null) { mProximityListener = new ProximityListener(); - mProximityReceiver = new Receiver(mProximityListener); + mProximityReceiver = new Receiver(mProximityListener, packageName); for (int i = mProviders.size() - 1; i >= 0; i--) { LocationProviderInterface provider = mProviders.get(i); @@ -1787,13 +1814,13 @@ public class LocationManagerService extends ILocationManager.Stub implements Run return isAllowedBySettingsLocked(provider); } - public Location getLastKnownLocation(String provider) { + public Location getLastKnownLocation(String provider, String packageName) { if (LOCAL_LOGV) { Slog.v(TAG, "getLastKnownLocation: " + provider); } try { synchronized (mLock) { - return _getLastKnownLocationLocked(provider); + return _getLastKnownLocationLocked(provider, packageName); } } catch (SecurityException se) { throw se; @@ -1803,8 +1830,9 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } - private Location _getLastKnownLocationLocked(String provider) { + private Location _getLastKnownLocationLocked(String provider, String packageName) { checkPermissionsSafe(provider, null); + checkPackageName(Binder.getCallingUid(), packageName); LocationProviderInterface p = mProvidersByName.get(provider); if (p == null) { @@ -1815,6 +1843,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run return null; } + if (inBlacklist(packageName)) { + return null; + } + return mLastKnownLocation.get(provider); } @@ -1877,6 +1909,10 @@ public class LocationManagerService extends ILocationManager.Stub implements Run Receiver receiver = r.mReceiver; boolean receiverDead = false; + if (inBlacklist(receiver.mPackageName)) { + continue; + } + Location lastLoc = r.mLastFixBroadcast; if ((lastLoc == null) || shouldBroadcastSafe(location, lastLoc, r)) { if (lastLoc == null) { @@ -2315,6 +2351,113 @@ public class LocationManagerService extends ILocationManager.Stub implements Run } } + public class BlacklistObserver extends ContentObserver { + public BlacklistObserver(Handler handler) { + super(handler); + } + @Override + public void onChange(boolean selfChange) { + reloadBlacklist(); + } + } + + private void loadBlacklist() { + // Register for changes + BlacklistObserver observer = new BlacklistObserver(mLocationHandler); + mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor( + BLACKLIST_CONFIG_NAME), false, observer); + mContext.getContentResolver().registerContentObserver(Settings.Secure.getUriFor( + WHITELIST_CONFIG_NAME), false, observer); + reloadBlacklist(); + } + + private void reloadBlacklist() { + String blacklist[] = getStringArray(BLACKLIST_CONFIG_NAME); + String whitelist[] = getStringArray(WHITELIST_CONFIG_NAME); + synchronized (mLock) { + mWhitelist = whitelist; + Slog.i(TAG, "whitelist: " + arrayToString(mWhitelist)); + mBlacklist = blacklist; + Slog.i(TAG, "blacklist: " + arrayToString(mBlacklist)); + } + } + + private static String arrayToString(String[] array) { + StringBuilder s = new StringBuilder(); + s.append('['); + boolean first = true; + for (String a : array) { + if (!first) s.append(','); + first = false; + s.append(a); + } + s.append(']'); + return s.toString(); + } + + private String[] getStringArray(String key) { + String flatString = Settings.Secure.getString(mContext.getContentResolver(), key); + if (flatString == null) { + return new String[0]; + } + String[] splitStrings = flatString.split(","); + ArrayList<String> result = new ArrayList<String>(); + for (String pkg : splitStrings) { + pkg = pkg.trim(); + if (pkg.isEmpty()) { + continue; + } + result.add(pkg); + } + return result.toArray(new String[result.size()]); + } + + /** + * Return true if in blacklist, and not in whitelist. + */ + private boolean inBlacklist(String packageName) { + synchronized (mLock) { + for (String black : mBlacklist) { + if (packageName.startsWith(black)) { + if (inWhitelist(packageName)) { + continue; + } else { + if (LOCAL_LOGV) Log.d(TAG, "dropping location (blacklisted): " + + packageName + " matches " + black); + return true; + } + } + } + } + return false; + } + + /** + * Return true if any of packages are in whitelist + */ + private boolean inWhitelist(String pkg) { + synchronized (mLock) { + for (String white : mWhitelist) { + if (pkg.startsWith(white)) return true; + } + } + return false; + } + + private void checkPackageName(int uid, String packageName) { + if (packageName == null) { + throw new SecurityException("packageName cannot be null"); + } + String[] packages = mPackageManager.getPackagesForUid(uid); + if (packages == null) { + throw new SecurityException("invalid UID " + uid); + } + for (String pkg : packages) { + if (packageName.equals(pkg)) return; + } + throw new SecurityException("invalid package name"); + } + private void log(String log) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Slog.d(TAG, log); @@ -2346,6 +2489,8 @@ public class LocationManagerService extends ILocationManager.Stub implements Run j.getValue().dump(pw, " "); } } + pw.println(" Package blacklist:" + arrayToString(mBlacklist)); + pw.println(" Package whitelist:" + arrayToString(mWhitelist)); pw.println(" Records by Provider:"); for (Map.Entry<String, ArrayList<UpdateRecord>> i : mRecordsByProvider.entrySet()) { diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index 1482d22..04267a3 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -1221,6 +1221,7 @@ class MountService extends IMountService.Stub for(MountServiceBinderListener bl : mListeners) { if (bl.mListener == listener) { mListeners.remove(mListeners.indexOf(bl)); + listener.asBinder().unlinkToDeath(bl, 0); return; } } diff --git a/services/java/com/android/server/NsdService.java b/services/java/com/android/server/NsdService.java index 6ad8bd0..87843d9 100644 --- a/services/java/com/android/server/NsdService.java +++ b/services/java/com/android/server/NsdService.java @@ -110,8 +110,8 @@ public class NsdService extends INsdManager.Stub { private final EnabledState mEnabledState = new EnabledState(); @Override - protected String getMessageInfo(Message msg) { - return cmdToString(msg.what); + protected String getWhatToString(int what) { + return cmdToString(what); } /** @@ -144,7 +144,7 @@ public class NsdService extends INsdManager.Stub { } else { setInitialState(mDisabledState); } - setProcessedMessagesSize(25); + setLogRecSize(25); registerForNsdSetting(); } diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 24c59a5..888ec69 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -1165,6 +1165,8 @@ public class PowerManagerService extends IPowerManager.Stub ? "SCREEN_BRIGHT_BIT " : "") + (((state & SCREEN_ON_BIT) != 0) ? "SCREEN_ON_BIT " : "") + + (((state & BUTTON_BRIGHT_BIT) != 0) + ? "BUTTON_BRIGHT_BIT " : "") + (((state & BATTERY_LOW_BIT) != 0) ? "BATTERY_LOW_BIT " : ""); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 9dd4a91..e55e7fe 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -83,7 +83,7 @@ class ServerThread extends Thread { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis()); - Looper.prepare(); + Looper.prepareMainLooper(); android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); @@ -114,6 +114,8 @@ class ServerThread extends Thread { : Integer.parseInt(factoryTestStr); final boolean headless = "1".equals(SystemProperties.get("ro.config.headless", "0")); + AccountManagerService accountManager = null; + ContentService contentService = null; LightsService lights = null; PowerManagerService power = null; BatteryService battery = null; @@ -190,14 +192,14 @@ class ServerThread extends Thread { // The AccountManager must come before the ContentService try { Slog.i(TAG, "Account Manager"); - ServiceManager.addService(Context.ACCOUNT_SERVICE, - new AccountManagerService(context)); + accountManager = new AccountManagerService(context); + ServiceManager.addService(Context.ACCOUNT_SERVICE, accountManager); } catch (Throwable e) { Slog.e(TAG, "Failure starting Account Manager", e); } Slog.i(TAG, "Content Manager"); - ContentService.main(context, + contentService = ContentService.main(context, factoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL); Slog.i(TAG, "System Content Providers"); @@ -466,6 +468,20 @@ class ServerThread extends Thread { } try { + if (accountManager != null) + accountManager.systemReady(); + } catch (Throwable e) { + reportWtf("making Account Manager Service ready", e); + } + + try { + if (contentService != null) + contentService.systemReady(); + } catch (Throwable e) { + reportWtf("making Content Service ready", e); + } + + try { Slog.i(TAG, "Notification Manager"); notification = new NotificationManagerService(context, statusBar, lights); ServiceManager.addService(Context.NOTIFICATION_SERVICE, notification); diff --git a/services/java/com/android/server/TelephonyRegistry.java b/services/java/com/android/server/TelephonyRegistry.java index 1b1638a..c23a1d9 100644 --- a/services/java/com/android/server/TelephonyRegistry.java +++ b/services/java/com/android/server/TelephonyRegistry.java @@ -44,6 +44,7 @@ import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.IPhoneStateListener; import com.android.internal.telephony.DefaultPhoneNotifier; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.TelephonyIntents; import com.android.server.am.BatteryStatsService; @@ -622,7 +623,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } Intent intent = new Intent(TelephonyManager.ACTION_PHONE_STATE_CHANGED); - intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertCallState(state).toString()); + intent.putExtra(PhoneConstants.STATE_KEY, + DefaultPhoneNotifier.convertCallState(state).toString()); if (!TextUtils.isEmpty(incomingNumber)) { intent.putExtra(TelephonyManager.EXTRA_INCOMING_NUMBER, incomingNumber); } @@ -637,34 +639,35 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { // status bar takes care of that after taking into account all of the // required info. Intent intent = new Intent(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED); - intent.putExtra(Phone.STATE_KEY, DefaultPhoneNotifier.convertDataState(state).toString()); + intent.putExtra(PhoneConstants.STATE_KEY, + DefaultPhoneNotifier.convertDataState(state).toString()); if (!isDataConnectivityPossible) { - intent.putExtra(Phone.NETWORK_UNAVAILABLE_KEY, true); + intent.putExtra(PhoneConstants.NETWORK_UNAVAILABLE_KEY, true); } if (reason != null) { - intent.putExtra(Phone.STATE_CHANGE_REASON_KEY, reason); + intent.putExtra(PhoneConstants.STATE_CHANGE_REASON_KEY, reason); } if (linkProperties != null) { - intent.putExtra(Phone.DATA_LINK_PROPERTIES_KEY, linkProperties); + intent.putExtra(PhoneConstants.DATA_LINK_PROPERTIES_KEY, linkProperties); String iface = linkProperties.getInterfaceName(); if (iface != null) { - intent.putExtra(Phone.DATA_IFACE_NAME_KEY, iface); + intent.putExtra(PhoneConstants.DATA_IFACE_NAME_KEY, iface); } } if (linkCapabilities != null) { - intent.putExtra(Phone.DATA_LINK_CAPABILITIES_KEY, linkCapabilities); + intent.putExtra(PhoneConstants.DATA_LINK_CAPABILITIES_KEY, linkCapabilities); } - if (roaming) intent.putExtra(Phone.DATA_NETWORK_ROAMING_KEY, true); + if (roaming) intent.putExtra(PhoneConstants.DATA_NETWORK_ROAMING_KEY, true); - intent.putExtra(Phone.DATA_APN_KEY, apn); - intent.putExtra(Phone.DATA_APN_TYPE_KEY, apnType); + intent.putExtra(PhoneConstants.DATA_APN_KEY, apn); + intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); mContext.sendStickyBroadcast(intent); } private void broadcastDataConnectionFailed(String reason, String apnType) { Intent intent = new Intent(TelephonyIntents.ACTION_DATA_CONNECTION_FAILED); - intent.putExtra(Phone.FAILURE_REASON_KEY, reason); - intent.putExtra(Phone.DATA_APN_TYPE_KEY, apnType); + intent.putExtra(PhoneConstants.FAILURE_REASON_KEY, reason); + intent.putExtra(PhoneConstants.DATA_APN_TYPE_KEY, apnType); mContext.sendStickyBroadcast(intent); } diff --git a/services/java/com/android/server/VibratorService.java b/services/java/com/android/server/VibratorService.java index b609867..72fde11 100755 --- a/services/java/com/android/server/VibratorService.java +++ b/services/java/com/android/server/VibratorService.java @@ -441,7 +441,7 @@ public class VibratorService extends IVibratorService.Stub private void delay(long duration) { if (duration > 0) { - long bedtime = SystemClock.uptimeMillis(); + long bedtime = duration + SystemClock.uptimeMillis(); do { try { this.wait(duration); @@ -451,8 +451,7 @@ public class VibratorService extends IVibratorService.Stub if (mDone) { break; } - duration = duration - - SystemClock.uptimeMillis() - bedtime; + duration = bedtime - SystemClock.uptimeMillis(); } while (duration > 0); } } diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index d97d335..8a08277 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -45,6 +45,7 @@ import android.os.RemoteException; import android.os.FileObserver; import android.os.ParcelFileDescriptor; import android.os.RemoteCallbackList; +import android.os.SELinux; import android.os.ServiceManager; import android.os.SystemClock; import android.os.UserId; @@ -639,8 +640,12 @@ class WallpaperManagerService extends IWallpaperManager.Stub { FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH, -1, -1); } - ParcelFileDescriptor fd = ParcelFileDescriptor.open(new File(dir, WALLPAPER), + File file = new File(dir, WALLPAPER); + ParcelFileDescriptor fd = ParcelFileDescriptor.open(file, MODE_CREATE|MODE_READ_WRITE); + if (!SELinux.restorecon(file)) { + return null; + } wallpaper.name = name; return fd; } catch (FileNotFoundException e) { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 95d3c41..73deef0 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -106,6 +106,7 @@ import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteCallbackList; import android.os.RemoteException; +import android.os.SELinux; import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemClock; @@ -1820,7 +1821,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (cr.binding != null && cr.binding.service != null && cr.binding.service.app != null && cr.binding.service.app.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cr.binding.service.app, oomAdj, + updateLruProcessInternalLocked(cr.binding.service.app, false, updateActivityTime, i+1); } } @@ -1828,7 +1829,7 @@ public final class ActivityManagerService extends ActivityManagerNative for (int j=app.conProviders.size()-1; j>=0; j--) { ContentProviderRecord cpr = app.conProviders.get(j).provider; if (cpr.proc != null && cpr.proc.lruSeq != mLruSeq) { - updateLruProcessInternalLocked(cpr.proc, oomAdj, + updateLruProcessInternalLocked(cpr.proc, false, updateActivityTime, i+1); } } @@ -2053,7 +2054,7 @@ public final class ActivityManagerService extends ActivityManagerNative // the PID of the new process, or else throw a RuntimeException. Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread", app.processName, uid, uid, gids, debugFlags, - app.info.targetSdkVersion, null); + app.info.targetSdkVersion, null, null); BatteryStatsImpl bs = app.batteryStats.getBatteryStats(); synchronized (bs) { @@ -3032,7 +3033,12 @@ public final class ActivityManagerService extends ActivityManagerNative File tracesFile = new File(tracesPath); try { File tracesDir = tracesFile.getParentFile(); - if (!tracesDir.exists()) tracesFile.mkdirs(); + if (!tracesDir.exists()) { + tracesFile.mkdirs(); + if (!SELinux.restorecon(tracesDir)) { + return null; + } + } FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x if (clearTraces && tracesFile.exists()) tracesFile.delete(); @@ -3136,7 +3142,12 @@ public final class ActivityManagerService extends ActivityManagerNative final File tracesDir = tracesFile.getParentFile(); final File tracesTmp = new File(tracesDir, "__tmp__"); try { - if (!tracesDir.exists()) tracesFile.mkdirs(); + if (!tracesDir.exists()) { + tracesFile.mkdirs(); + if (!SELinux.restorecon(tracesDir.getPath())) { + return; + } + } FileUtils.setPermissions(tracesDir.getPath(), 0775, -1, -1); // drwxrwxr-x if (tracesFile.exists()) { diff --git a/services/java/com/android/server/am/DeviceMonitor.java b/services/java/com/android/server/am/DeviceMonitor.java index 5f3b0ce..21e7252 100644 --- a/services/java/com/android/server/am/DeviceMonitor.java +++ b/services/java/com/android/server/am/DeviceMonitor.java @@ -16,6 +16,7 @@ package com.android.server.am; +import android.os.SELinux; import android.util.Slog; import java.io.*; @@ -80,6 +81,9 @@ class DeviceMonitor { if (!BASE.isDirectory() && !BASE.mkdirs()) { throw new AssertionError("Couldn't create " + BASE + "."); } + if (!SELinux.restorecon(BASE)) { + throw new AssertionError("Couldn't restorecon " + BASE + "."); + } } private static final File[] PATHS = { diff --git a/services/java/com/android/server/am/ProviderMap.java b/services/java/com/android/server/am/ProviderMap.java index d148ec3..e4608a2 100644 --- a/services/java/com/android/server/am/ProviderMap.java +++ b/services/java/com/android/server/am/ProviderMap.java @@ -127,7 +127,12 @@ public class ProviderMap { Slog.i(TAG, "Removing from providersByName name=" + name + " user=" + (optionalUserId == -1 ? Binder.getOrigCallingUser() : optionalUserId)); - getProvidersByName(optionalUserId).remove(name); + HashMap<String, ContentProviderRecord> map = getProvidersByName(optionalUserId); + // map returned by getProvidersByName wouldn't be null + map.remove(name); + if (map.size() == 0) { + mProvidersByNamePerUser.remove(optionalUserId); + } } } @@ -141,7 +146,12 @@ public class ProviderMap { Slog.i(TAG, "Removing from providersByClass name=" + name + " user=" + (optionalUserId == -1 ? Binder.getOrigCallingUser() : optionalUserId)); - getProvidersByClass(optionalUserId).remove(name); + HashMap<ComponentName, ContentProviderRecord> map = getProvidersByClass(optionalUserId); + // map returned by getProvidersByClass wouldn't be null + map.remove(name); + if (map.size() == 0) { + mProvidersByClassPerUser.remove(optionalUserId); + } } } diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 88a0ccb..682ecf8 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -47,6 +47,7 @@ import android.provider.Settings; import android.util.Log; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import com.android.internal.util.IState; import com.android.internal.util.State; import com.android.internal.util.StateMachine; @@ -1190,7 +1191,7 @@ public class Tethering extends INetworkManagementEventObserver.Stub { boolean retValue = true; if (apnType == ConnectivityManager.TYPE_NONE) return false; if (apnType != mMobileApnReserved) turnOffUpstreamMobileConnection(); - int result = Phone.APN_REQUEST_FAILED; + int result = PhoneConstants.APN_REQUEST_FAILED; String enableString = enableString(apnType); if (enableString == null) return false; try { @@ -1199,14 +1200,14 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } catch (Exception e) { } switch (result) { - case Phone.APN_ALREADY_ACTIVE: - case Phone.APN_REQUEST_STARTED: + case PhoneConstants.APN_ALREADY_ACTIVE: + case PhoneConstants.APN_REQUEST_STARTED: mMobileApnReserved = apnType; Message m = obtainMessage(CMD_CELL_CONNECTION_RENEW); m.arg1 = ++mCurrentConnectionSequence; sendMessageDelayed(m, CELL_CONNECTION_RENEW_MS); break; - case Phone.APN_REQUEST_FAILED: + case PhoneConstants.APN_REQUEST_FAILED: default: retValue = false; break; diff --git a/services/java/com/android/server/location/GpsLocationProvider.java b/services/java/com/android/server/location/GpsLocationProvider.java index ce53499..4ad6140 100755 --- a/services/java/com/android/server/location/GpsLocationProvider.java +++ b/services/java/com/android/server/location/GpsLocationProvider.java @@ -60,6 +60,7 @@ import com.android.internal.app.IBatteryStats; import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.telephony.Phone; +import com.android.internal.telephony.PhoneConstants; import java.io.File; import java.io.FileInputStream; @@ -1285,8 +1286,8 @@ public class GpsLocationProvider implements LocationProviderInterface { int result = mConnMgr.startUsingNetworkFeature( ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL); mAGpsDataConnectionIpAddr = ipaddr; - if (result == Phone.APN_ALREADY_ACTIVE) { - if (DEBUG) Log.d(TAG, "Phone.APN_ALREADY_ACTIVE"); + if (result == PhoneConstants.APN_ALREADY_ACTIVE) { + if (DEBUG) Log.d(TAG, "PhoneConstants.APN_ALREADY_ACTIVE"); if (mAGpsApn != null) { Log.d(TAG, "mAGpsDataConnectionIpAddr " + mAGpsDataConnectionIpAddr); if (mAGpsDataConnectionIpAddr != 0xffffffff) { @@ -1300,12 +1301,12 @@ public class GpsLocationProvider implements LocationProviderInterface { native_agps_data_conn_open(mAGpsApn); mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN; } else { - Log.e(TAG, "mAGpsApn not set when receiving Phone.APN_ALREADY_ACTIVE"); + Log.e(TAG, "mAGpsApn not set when receiving PhoneConstants.APN_ALREADY_ACTIVE"); mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED; native_agps_data_conn_failed(); } - } else if (result == Phone.APN_REQUEST_STARTED) { - if (DEBUG) Log.d(TAG, "Phone.APN_REQUEST_STARTED"); + } else if (result == PhoneConstants.APN_REQUEST_STARTED) { + if (DEBUG) Log.d(TAG, "PhoneConstants.APN_REQUEST_STARTED"); // Nothing to do here } else { if (DEBUG) Log.d(TAG, "startUsingNetworkFeature failed"); diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 3501e47..f914271 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -96,6 +96,7 @@ import android.os.Parcel; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.RemoteException; +import android.os.SELinux; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; @@ -143,6 +144,7 @@ import java.util.Set; import libcore.io.ErrnoException; import libcore.io.IoUtils; import libcore.io.Libcore; +import libcore.io.StructStat; /** * Keep track of all those .apks everywhere. @@ -293,8 +295,6 @@ public class PackageManagerService extends IPackageManager.Stub { File mScanningPath; int mLastScanError; - final int[] mOutPermissions = new int[3]; - // ---------------------------------------------------------------- // Keys are String (package name), values are Package. This also serves @@ -3761,14 +3761,18 @@ public class PackageManagerService extends IPackageManager.Stub { boolean uidError = false; if (dataPath.exists()) { - // XXX should really do this check for each user. - mOutPermissions[1] = 0; - FileUtils.getPermissions(dataPath.getPath(), mOutPermissions); + int currentUid = 0; + try { + StructStat stat = Libcore.os.stat(dataPath.getPath()); + currentUid = stat.st_uid; + } catch (ErrnoException e) { + Slog.e(TAG, "Couldn't stat path " + dataPath.getPath(), e); + } // If we have mismatched owners for the data path, we have a problem. - if (mOutPermissions[1] != pkg.applicationInfo.uid) { + if (currentUid != pkg.applicationInfo.uid) { boolean recovered = false; - if (mOutPermissions[1] == 0) { + if (currentUid == 0) { // The directory somehow became owned by root. Wow. // This is probably because the system was stopped while // installd was in the middle of messing with its libs @@ -3797,7 +3801,7 @@ public class PackageManagerService extends IPackageManager.Stub { ? "System package " : "Third party package "; String msg = prefix + pkg.packageName + " has changed from uid: " - + mOutPermissions[1] + " to " + + currentUid + " to " + pkg.applicationInfo.uid + "; old data erased"; reportSettingsProblem(Log.WARN, msg); recovered = true; @@ -3829,11 +3833,11 @@ public class PackageManagerService extends IPackageManager.Stub { if (!recovered) { pkg.applicationInfo.dataDir = "/mismatched_uid/settings_" + pkg.applicationInfo.uid + "/fs_" - + mOutPermissions[1]; + + currentUid; pkg.applicationInfo.nativeLibraryDir = pkg.applicationInfo.dataDir; String msg = "Package " + pkg.packageName + " has mismatched uid: " - + mOutPermissions[1] + " on disk, " + + currentUid + " on disk, " + pkg.applicationInfo.uid + " in settings"; // writer synchronized (mPackages) { @@ -6418,6 +6422,10 @@ public class PackageManagerService extends IPackageManager.Stub { return false; } + if (!SELinux.restorecon(newCodeFile)) { + return false; + } + return true; } } @@ -7399,6 +7407,9 @@ public class PackageManagerService extends IPackageManager.Stub { FileUtils.setPermissions( tmpPackageFile.getCanonicalPath(), FileUtils.S_IRUSR|FileUtils.S_IWUSR, -1, -1); + if (!SELinux.restorecon(tmpPackageFile)) { + return null; + } } catch (IOException e) { Slog.e(TAG, "Trouble getting the canoncical path for a temp file."); return null; @@ -8833,7 +8844,7 @@ public class PackageManagerService extends IPackageManager.Stub { // little while. mHandler.post(new Runnable() { public void run() { - updateExternalMediaStatusInner(mediaStatus, reportStatus); + updateExternalMediaStatusInner(mediaStatus, reportStatus, true); } }); } @@ -8843,7 +8854,7 @@ public class PackageManagerService extends IPackageManager.Stub { * Should block until all the ASEC containers are finished being scanned. */ public void scanAvailableAsecs() { - updateExternalMediaStatusInner(true, false); + updateExternalMediaStatusInner(true, false, false); } /* @@ -8852,7 +8863,8 @@ public class PackageManagerService extends IPackageManager.Stub { * Please note that we always have to report status if reportStatus has been * set to true especially when unloading packages. */ - private void updateExternalMediaStatusInner(boolean isMounted, boolean reportStatus) { + private void updateExternalMediaStatusInner(boolean isMounted, boolean reportStatus, + boolean externalStorage) { // Collection of uids int uidArr[] = null; // Collection of stale containers @@ -8890,6 +8902,14 @@ public class PackageManagerService extends IPackageManager.Stub { continue; } + /* + * Skip packages that are not external if we're unmounting + * external storage. + */ + if (externalStorage && !isMounted && !isExternal(ps)) { + continue; + } + final AsecInstallArgs args = new AsecInstallArgs(cid, isForwardLocked(ps)); // The package status is changed only if the code path // matches between settings and the container id. diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index d031686..120b650 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -1241,7 +1241,7 @@ final class Settings { // Avoid any application that has a space in its path // or that is handled by the system. - if (dataPath.indexOf(" ") >= 0 || ai.uid <= Process.FIRST_APPLICATION_UID) + if (dataPath.indexOf(" ") >= 0 || ai.uid < Process.FIRST_APPLICATION_UID) continue; // we store on each line the following information for now: diff --git a/services/java/com/android/server/pm/ShutdownThread.java b/services/java/com/android/server/pm/ShutdownThread.java index 69406c8..3675d41 100644 --- a/services/java/com/android/server/pm/ShutdownThread.java +++ b/services/java/com/android/server/pm/ShutdownThread.java @@ -84,6 +84,8 @@ public final class ShutdownThread extends Thread { private PowerManager.WakeLock mCpuWakeLock; private PowerManager.WakeLock mScreenWakeLock; private Handler mHandler; + + private static AlertDialog sConfirmDialog; private ShutdownThread() { } @@ -124,7 +126,10 @@ public final class ShutdownThread extends Thread { if (confirm) { final CloseDialogReceiver closer = new CloseDialogReceiver(context); - final AlertDialog dialog = new AlertDialog.Builder(context) + if (sConfirmDialog != null) { + sConfirmDialog.dismiss(); + } + sConfirmDialog = new AlertDialog.Builder(context) .setTitle(mRebootSafeMode ? com.android.internal.R.string.reboot_safemode_title : com.android.internal.R.string.power_off) @@ -136,10 +141,10 @@ public final class ShutdownThread extends Thread { }) .setNegativeButton(com.android.internal.R.string.no, null) .create(); - closer.dialog = dialog; - dialog.setOnDismissListener(closer); - dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); - dialog.show(); + closer.dialog = sConfirmDialog; + sConfirmDialog.setOnDismissListener(closer); + sConfirmDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG); + sConfirmDialog.show(); } else { beginShutdownSequence(context); } diff --git a/services/java/com/android/server/usb/UsbSettingsManager.java b/services/java/com/android/server/usb/UsbSettingsManager.java index 7dde340..9b3459b 100644 --- a/services/java/com/android/server/usb/UsbSettingsManager.java +++ b/services/java/com/android/server/usb/UsbSettingsManager.java @@ -545,6 +545,10 @@ class UsbSettingsManager { defaultPackage = mDevicePreferenceMap.get(new DeviceFilter(device)); } + // Send broadcast to running activity with registered intent + mContext.sendBroadcast(intent); + + // Start activity with registered intent resolveActivity(intent, matches, defaultPackage, device, null); } diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index db3b2bd..62cf711 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -32,6 +32,13 @@ import java.util.ArrayList; public class WindowAnimator { private static final String TAG = "WindowAnimator"; + // mForceHiding states. + private static final int KEYGUARD_NOT_SHOWN = 0; + private static final int KEYGUARD_ANIMATING_IN = 1; + private static final int KEYGUARD_SHOWN = 2; + private static final int KEYGUARD_ANIMATING_OUT = 3; + int mForceHiding; + final WindowManagerService mService; final Context mContext; final WindowManagerPolicy mPolicy; @@ -39,7 +46,6 @@ public class WindowAnimator { ArrayList<WindowStateAnimator> mWinAnimators = new ArrayList<WindowStateAnimator>(); boolean mAnimating; - boolean mForceHiding; WindowState mWindowAnimationBackground; int mWindowAnimationBackgroundColor; int mAdjResult; @@ -279,8 +285,16 @@ public class WindowAnimator { } mService.mFocusMayChange = true; } - if (win.isReadyForDisplay() && winAnimator.mAnimationIsEntrance) { - mForceHiding = true; + if (win.isReadyForDisplay()) { + if (nowAnimating) { + if (winAnimator.mAnimationIsEntrance) { + mForceHiding = KEYGUARD_ANIMATING_IN; + } else { + mForceHiding = KEYGUARD_ANIMATING_OUT; + } + } else { + mForceHiding = KEYGUARD_SHOWN; + } } if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(TAG, "Force hide " + mForceHiding @@ -292,9 +306,12 @@ public class WindowAnimator { + " hidden=" + win.mRootToken.hidden + " anim=" + win.mWinAnimator.mAnimation); } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) { + final boolean hideWhenLocked = + (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0; final boolean changed; - if (mForceHiding && (!winAnimator.isAnimating() - || (winAnimator.mAttrFlags & FLAG_SHOW_WHEN_LOCKED) == 0)) { + if (((mForceHiding == KEYGUARD_ANIMATING_IN) + && (!winAnimator.isAnimating() || hideWhenLocked)) + || ((mForceHiding == KEYGUARD_SHOWN) && hideWhenLocked)) { changed = win.hideLw(false, false); if (WindowManagerService.DEBUG_VISIBILITY && changed) Slog.v(TAG, "Now policy hidden: " + win); @@ -411,7 +428,7 @@ public class WindowAnimator { } private void performAnimationsLocked() { - mForceHiding = false; + mForceHiding = KEYGUARD_NOT_SHOWN; mDetachedWallpaper = null; mWindowAnimationBackground = null; mWindowAnimationBackgroundColor = 0; |
