Merge change 1276 into donut
* changes:
Define mime type for shortcut validation path.
diff --git a/core/java/android/app/SearchDialog.java b/core/java/android/app/SearchDialog.java
index 8fc2447..0aa5975 100644
--- a/core/java/android/app/SearchDialog.java
+++ b/core/java/android/app/SearchDialog.java
@@ -171,7 +171,7 @@
// having windows anchored by their parent but not clipped by them.
ViewGroup.LayoutParams.FILL_PARENT);
WindowManager.LayoutParams lp = theWindow.getAttributes();
- lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;
+ lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
theWindow.setAttributes(lp);
// get the view elements for local access
@@ -528,6 +528,7 @@
mSearchAutoComplete.setDropDownAnimationStyle(0); // no animation
mSearchAutoComplete.setThreshold(mSearchable.getSuggestThreshold());
+ // TODO: Use different dropdown background resource for in-app search.
if (mGlobalSearchMode) {
mSearchAutoComplete.setDropDownAlwaysVisible(true); // fill space until results come in
mSearchAutoComplete.setDropDownDismissedOnCompletion(false);
diff --git a/core/java/android/widget/AutoCompleteTextView.java b/core/java/android/widget/AutoCompleteTextView.java
index 9c10f0a..a1d16ea 100644
--- a/core/java/android/widget/AutoCompleteTextView.java
+++ b/core/java/android/widget/AutoCompleteTextView.java
@@ -208,7 +208,7 @@
&& mPopup.isShowing()
&& mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED) {
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
- mPopup.update();
+ showDropDown();
}
}
@@ -1171,9 +1171,14 @@
}
}
- // Max height available on the screen for a popup
- final int maxHeight =
- mPopup.getMaxAvailableHeight(getDropDownAnchorView(), mDropDownVerticalOffset);
+ // Max height available on the screen for a popup. If this AutoCompleteTextView has
+ // the dropDownAlwaysVisible attribute, and the input method is not currently required,
+ // we then we ask for the height ignoring any bottom decorations like the input method.
+ // Otherwise we respect the input method.
+ boolean ignoreBottomDecorations = mDropDownAlwaysVisible &&
+ mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED;
+ final int maxHeight = mPopup.getMaxAvailableHeight(
+ getDropDownAnchorView(), mDropDownVerticalOffset, ignoreBottomDecorations);
final int measuredHeight = mDropDownList.measureHeightOfChildren(MeasureSpec.UNSPECIFIED,
0, ListView.NO_POSITION, maxHeight - otherHeights, 2) + otherHeights;
@@ -1255,7 +1260,7 @@
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED);
- mPopup.update();
+ showDropDown();
}
return false;
}
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 2c9714e..acd25ee 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -25,6 +25,7 @@
import android.view.Gravity;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
+import android.view.WindowManagerImpl;
import android.view.ViewTreeObserver.OnScrollChangedListener;
import android.view.View.OnTouchListener;
import android.graphics.PixelFormat;
@@ -948,14 +949,38 @@
* shown.
*/
public int getMaxAvailableHeight(View anchor, int yOffset) {
+ return getMaxAvailableHeight(anchor, yOffset, false);
+ }
+
+ /**
+ * Returns the maximum height that is available for the popup to be
+ * completely shown, optionally ignoring any bottom decorations such as
+ * the input method. It is recommended that this height be the maximum for
+ * the popup's height, otherwise it is possible that the popup will be
+ * clipped.
+ *
+ * @param anchor The view on which the popup window must be anchored.
+ * @param yOffset y offset from the view's bottom edge
+ * @param ignoreBottomDecorations if true, the height returned will be
+ * all the way to the bottom of the display, ignoring any
+ * bottom decorations
+ * @return The maximum available height for the popup to be completely
+ * shown.
+ *
+ * @hide Pending API council approval.
+ */
+ public int getMaxAvailableHeight(View anchor, int yOffset, boolean ignoreBottomDecorations) {
final Rect displayFrame = new Rect();
anchor.getWindowVisibleDisplayFrame(displayFrame);
final int[] anchorPos = mDrawingLocation;
anchor.getLocationOnScreen(anchorPos);
- final int distanceToBottom = displayFrame.bottom -
- (anchorPos[1] + anchor.getHeight()) - yOffset;
+ int bottomEdge = displayFrame.bottom;
+ if (ignoreBottomDecorations) {
+ bottomEdge = WindowManagerImpl.getDefault().getDefaultDisplay().getHeight();
+ }
+ final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset;
final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset;
// anchorPos[1] is distance from anchor to top of screen
@@ -1116,7 +1141,7 @@
p.flags = newFlags;
update = true;
}
-
+
if (update) {
mWindowManager.updateViewLayout(mPopupView, p);
}
diff --git a/services/java/com/android/server/DeviceStorageMonitorService.java b/services/java/com/android/server/DeviceStorageMonitorService.java
index 85861bb..52e09ca 100644
--- a/services/java/com/android/server/DeviceStorageMonitorService.java
+++ b/services/java/com/android/server/DeviceStorageMonitorService.java
@@ -74,7 +74,7 @@
private boolean mLowMemFlag=false;
private Context mContext;
private ContentResolver mContentResolver;
- int mBlkSize;
+ long mBlkSize;
long mTotalMemory;
StatFs mFileStats;
private static final String DATA_PATH="/data";
@@ -251,7 +251,7 @@
//initialize block size
mBlkSize = mFileStats.getBlockSize();
//initialize total storage on device
- mTotalMemory = (mFileStats.getBlockCount()*mBlkSize)/100;
+ mTotalMemory = ((long)mFileStats.getBlockCount()*mBlkSize)/100L;
mStorageLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW);
mStorageOkIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK);
checkMemory(true);
diff --git a/services/java/com/android/server/PackageManagerService.java b/services/java/com/android/server/PackageManagerService.java
index 159bc76..a60f059 100644
--- a/services/java/com/android/server/PackageManagerService.java
+++ b/services/java/com/android/server/PackageManagerService.java
@@ -1761,8 +1761,7 @@
PackageSetting ps;
PackageSetting updatedPkg;
synchronized (mPackages) {
- ps = mSettings.peekPackageLP(pkg.packageName,
- scanFile.toString());
+ ps = mSettings.peekPackageLP(pkg.packageName);
updatedPkg = mSettings.mDisabledSysPackages.get(pkg.packageName);
}
if (updatedPkg != null) {
@@ -1771,13 +1770,21 @@
}
if ((parseFlags&PackageParser.PARSE_IS_SYSTEM) != 0) {
// Check for updated system applications here
- if ((updatedPkg != null) && (ps == null)) {
- // The system package has been updated and the code path does not match
- // Ignore entry. Just return
- Log.w(TAG, "Package:" + pkg.packageName +
- " has been updated. Ignoring the one from path:"+scanFile);
- mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
- return null;
+ if (updatedPkg != null) {
+ if ((ps != null) && (!ps.codePath.getPath().equals(scanFile.getPath()))) {
+ if (pkg.mVersionCode <= ps.versionCode) {
+ // The system package has been updated and the code path does not match
+ // Ignore entry. Just return
+ Log.w(TAG, "Package:" + pkg.packageName +
+ " has been updated. Ignoring the one from path:"+scanFile);
+ mLastScanError = PackageManager.INSTALL_FAILED_DUPLICATE_PACKAGE;
+ return null;
+ } else {
+ // Delete the older apk pointed to by ps
+ deletePackageResourcesLI(ps.name, ps.codePathString, ps.resourcePathString);
+ mSettings.enableSystemPackageLP(ps.name);
+ }
+ }
}
}
if (!collectCertificatesLI(pp, ps, pkg, scanFile, parseFlags)) {
@@ -3341,23 +3348,23 @@
String destFilePath, File destPackageFile, File destResourceFile,
PackageParser.Package pkg, boolean forwardLocked, boolean newInstall,
PackageInstalledInfo res) {
- PackageParser.Package deletedPackage;
+ PackageParser.Package oldPackage;
// First find the old package info and check signatures
synchronized(mPackages) {
- deletedPackage = mPackages.get(pkgName);
- if(checkSignaturesLP(pkg, deletedPackage) != PackageManager.SIGNATURE_MATCH) {
+ oldPackage = mPackages.get(pkgName);
+ if(checkSignaturesLP(pkg, oldPackage) != PackageManager.SIGNATURE_MATCH) {
res.returnCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
return;
}
}
- boolean sysPkg = ((deletedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
+ boolean sysPkg = ((oldPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
if(sysPkg) {
- replaceSystemPackageLI(deletedPackage,
+ replaceSystemPackageLI(oldPackage,
tmpPackageFile, destFilePath,
destPackageFile, destResourceFile, pkg, forwardLocked,
newInstall, res);
} else {
- replaceNonSystemPackageLI(deletedPackage, tmpPackageFile, destFilePath,
+ replaceNonSystemPackageLI(oldPackage, tmpPackageFile, destFilePath,
destPackageFile, destResourceFile, pkg, forwardLocked,
newInstall, res);
}
@@ -3996,7 +4003,7 @@
* Tries to delete system package.
*/
private boolean deleteSystemPackageLI(PackageParser.Package p,
- boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
+ int flags, PackageRemovedInfo outInfo) {
ApplicationInfo applicationInfo = p.applicationInfo;
//applicable for non-partially installed applications only
if (applicationInfo == null) {
@@ -4018,6 +4025,19 @@
}
// Delete the updated package
outInfo.isRemovedPackageSystemUpdate = true;
+ boolean deleteCodeAndResources = false;
+ if (ps.versionCode < p.mVersionCode) {
+ // Delete code and resources for downgrades
+ deleteCodeAndResources = true;
+ if ((flags & PackageManager.DONT_DELETE_DATA) == 0) {
+ flags &= ~PackageManager.DONT_DELETE_DATA;
+ }
+ } else {
+ // Preserve data by setting flag
+ if ((flags & PackageManager.DONT_DELETE_DATA) == 0) {
+ flags |= PackageManager.DONT_DELETE_DATA;
+ }
+ }
boolean ret = deleteInstalledPackageLI(p, deleteCodeAndResources, flags, outInfo);
if (!ret) {
return false;
@@ -4041,6 +4061,28 @@
return true;
}
+ private void deletePackageResourcesLI(String packageName,
+ String sourceDir, String publicSourceDir) {
+ File sourceFile = new File(sourceDir);
+ if (!sourceFile.exists()) {
+ Log.w(TAG, "Package source " + sourceDir + " does not exist.");
+ }
+ // Delete application's code and resources
+ sourceFile.delete();
+ final File publicSourceFile = new File(publicSourceDir);
+ if (publicSourceFile.exists()) {
+ publicSourceFile.delete();
+ }
+ if (mInstaller != null) {
+ int retCode = mInstaller.rmdex(sourceFile.toString());
+ if (retCode < 0) {
+ Log.w(TAG, "Couldn't remove dex file for package: "
+ + packageName + " at location " + sourceFile.toString() + ", retcode=" + retCode);
+ // we don't consider this to be a failure of the core package deletion
+ }
+ }
+ }
+
private boolean deleteInstalledPackageLI(PackageParser.Package p,
boolean deleteCodeAndResources, int flags, PackageRemovedInfo outInfo) {
ApplicationInfo applicationInfo = p.applicationInfo;
@@ -4048,11 +4090,6 @@
Log.w(TAG, "Package " + p.packageName + " has no applicationInfo.");
return false;
}
- // Delete application's source directory
- File sourceFile = new File(applicationInfo.sourceDir);
- if (!sourceFile.exists()) {
- Log.w(TAG, "Package source " + applicationInfo.sourceDir + " does not exist.");
- }
outInfo.uid = applicationInfo.uid;
// Delete package data from internal structures and also remove data if flag is set
@@ -4060,19 +4097,8 @@
// Delete application code and resources
if (deleteCodeAndResources) {
- sourceFile.delete();
- final File publicSourceFile = new File(applicationInfo.publicSourceDir);
- if (publicSourceFile.exists()) {
- publicSourceFile.delete();
- }
- if (mInstaller != null) {
- int retCode = mInstaller.rmdex(sourceFile.toString());
- if (retCode < 0) {
- Log.w(TAG, "Couldn't remove dex file for package: "
- + p.packageName + " at location " + sourceFile.toString() + ", retcode=" + retCode);
- // we don't consider this to be a failure of the core package deletion
- }
- }
+ deletePackageResourcesLI(applicationInfo.packageName,
+ applicationInfo.sourceDir, applicationInfo.publicSourceDir);
}
return true;
}
@@ -4120,7 +4146,7 @@
Log.i(TAG, "Removing system package:"+p.packageName);
// When an updated system application is deleted we delete the existing resources as well and
// fall back to existing code in system partition
- return deleteSystemPackageLI(p, true, flags, outInfo);
+ return deleteSystemPackageLI(p, flags, outInfo);
}
Log.i(TAG, "Removing non-system package:"+p.packageName);
return deleteInstalledPackageLI (p, deleteCodeAndResources, flags, outInfo);
@@ -5152,6 +5178,7 @@
final String resourcePathString;
private long timeStamp;
private String timeStampString = "0";
+ final int versionCode;
PackageSignatures signatures = new PackageSignatures();
@@ -5165,13 +5192,14 @@
int installStatus = PKG_INSTALL_COMPLETE;
PackageSettingBase(String name, File codePath, File resourcePath,
- int pkgFlags) {
+ int pVersionCode, int pkgFlags) {
super(pkgFlags);
this.name = name;
this.codePath = codePath;
this.codePathString = codePath.toString();
this.resourcePath = resourcePath;
this.resourcePathString = resourcePath.toString();
+ this.versionCode = pVersionCode;
}
public void setInstallStatus(int newStatus) {
@@ -5252,8 +5280,8 @@
SharedUserSetting sharedUser;
PackageSetting(String name, File codePath, File resourcePath,
- int pkgFlags) {
- super(name, codePath, resourcePath, pkgFlags);
+ int pVersionCode, int pkgFlags) {
+ super(name, codePath, resourcePath, pVersionCode, pkgFlags);
}
@Override
@@ -5351,8 +5379,8 @@
final int sharedId;
PendingPackage(String name, File codePath, File resourcePath,
- int sharedId, int pkgFlags) {
- super(name, codePath, resourcePath, pkgFlags);
+ int sharedId, int pVersionCode, int pkgFlags) {
+ super(name, codePath, resourcePath, pVersionCode, pkgFlags);
this.sharedId = sharedId;
}
}
@@ -5376,7 +5404,7 @@
int pkgFlags, boolean create, boolean add) {
final String name = pkg.packageName;
PackageSetting p = getPackageLP(name, sharedUser, codePath,
- resourcePath, pkgFlags, create, add);
+ resourcePath, pkg.mVersionCode, pkgFlags, create, add);
if (p != null) {
p.pkg = pkg;
@@ -5384,12 +5412,15 @@
return p;
}
- PackageSetting peekPackageLP(String name, String codePath) {
+ PackageSetting peekPackageLP(String name) {
+ return mPackages.get(name);
+ /*
PackageSetting p = mPackages.get(name);
if (p != null && p.codePath.getPath().equals(codePath)) {
return p;
}
return null;
+ */
}
void setInstallStatus(String pkgName, int status) {
@@ -5461,13 +5492,13 @@
p.pkg.applicationInfo.flags &= ~ApplicationInfo.FLAG_UPDATED_SYSTEM_APP;
}
PackageSetting ret = addPackageLP(name, p.codePath,
- p.resourcePath, p.userId, p.pkgFlags);
+ p.resourcePath, p.userId, p.versionCode, p.pkgFlags);
mDisabledSysPackages.remove(name);
return ret;
}
PackageSetting addPackageLP(String name, File codePath,
- File resourcePath, int uid, int pkgFlags) {
+ File resourcePath, int uid, int vc, int pkgFlags) {
PackageSetting p = mPackages.get(name);
if (p != null) {
if (p.userId == uid) {
@@ -5477,7 +5508,7 @@
"Adding duplicate package, keeping first: " + name);
return null;
}
- p = new PackageSetting(name, codePath, resourcePath, pkgFlags);
+ p = new PackageSetting(name, codePath, resourcePath, vc, pkgFlags);
p.userId = uid;
if (addUserIdLP(uid, p, name)) {
mPackages.put(name, p);
@@ -5507,7 +5538,7 @@
private PackageSetting getPackageLP(String name,
SharedUserSetting sharedUser, File codePath, File resourcePath,
- int pkgFlags, boolean create, boolean add) {
+ int vc, int pkgFlags, boolean create, boolean add) {
PackageSetting p = mPackages.get(name);
if (p != null) {
if (!p.codePath.equals(codePath)) {
@@ -5549,7 +5580,7 @@
if (!create) {
return null;
}
- p = new PackageSetting(name, codePath, resourcePath, pkgFlags);
+ p = new PackageSetting(name, codePath, resourcePath, vc, pkgFlags);
p.setTimeStamp(codePath.lastModified());
if (sharedUser != null) {
p.userId = sharedUser.userId;
@@ -5816,6 +5847,7 @@
serializer.attribute(null, "name", pkg.name);
serializer.attribute(null, "codePath", pkg.codePathString);
serializer.attribute(null, "ts", pkg.getTimeStampStr());
+ serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
if (!pkg.resourcePathString.equals(pkg.codePathString)) {
serializer.attribute(null, "resourcePath", pkg.resourcePathString);
}
@@ -5859,6 +5891,7 @@
(pkg.pkgFlags&ApplicationInfo.FLAG_SYSTEM) != 0
? "true" : "false");
serializer.attribute(null, "ts", pkg.getTimeStampStr());
+ serializer.attribute(null, "version", String.valueOf(pkg.versionCode));
if (pkg.sharedUser == null) {
serializer.attribute(null, "userId",
Integer.toString(pkg.userId));
@@ -6050,7 +6083,7 @@
if (idObj != null && idObj instanceof SharedUserSetting) {
PackageSetting p = getPackageLP(pp.name,
(SharedUserSetting)idObj, pp.codePath, pp.resourcePath,
- pp.pkgFlags, true, true);
+ pp.versionCode, pp.pkgFlags, true, true);
if (p == null) {
Log.w(TAG, "Unable to create application package for "
+ pp.name);
@@ -6169,12 +6202,20 @@
if(resourcePathStr == null) {
resourcePathStr = codePathStr;
}
+ String version = parser.getAttributeValue(null, "version");
+ int versionCode = 0;
+ if (version != null) {
+ try {
+ versionCode = Integer.parseInt(version);
+ } catch (NumberFormatException e) {
+ }
+ }
int pkgFlags = 0;
pkgFlags |= ApplicationInfo.FLAG_SYSTEM;
PackageSetting ps = new PackageSetting(name,
new File(codePathStr),
- new File(resourcePathStr), pkgFlags);
+ new File(resourcePathStr), versionCode, pkgFlags);
String timeStampStr = parser.getAttributeValue(null, "ts");
if (timeStampStr != null) {
try {
@@ -6225,12 +6266,21 @@
String timeStampStr;
long timeStamp = 0;
PackageSettingBase packageSetting = null;
+ String version = null;
+ int versionCode = 0;
try {
name = parser.getAttributeValue(null, "name");
idStr = parser.getAttributeValue(null, "userId");
sharedIdStr = parser.getAttributeValue(null, "sharedUserId");
codePathStr = parser.getAttributeValue(null, "codePath");
resourcePathStr = parser.getAttributeValue(null, "resourcePath");
+ version = parser.getAttributeValue(null, "version");
+ if (version != null) {
+ try {
+ versionCode = Integer.parseInt(version);
+ } catch (NumberFormatException e) {
+ }
+ }
systemStr = parser.getAttributeValue(null, "system");
if (systemStr != null) {
if ("true".equals(systemStr)) {
@@ -6264,7 +6314,7 @@
+ parser.getPositionDescription());
} else if (userId > 0) {
packageSetting = addPackageLP(name.intern(), new File(codePathStr),
- new File(resourcePathStr), userId, pkgFlags);
+ new File(resourcePathStr), userId, versionCode, pkgFlags);
if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name
+ ": userId=" + userId + " pkg=" + packageSetting);
if (packageSetting == null) {
@@ -6280,7 +6330,7 @@
? Integer.parseInt(sharedIdStr) : 0;
if (userId > 0) {
packageSetting = new PendingPackage(name.intern(), new File(codePathStr),
- new File(resourcePathStr), userId, pkgFlags);
+ new File(resourcePathStr), userId, versionCode, pkgFlags);
packageSetting.setTimeStamp(timeStamp, timeStampStr);
mPendingPackages.add((PendingPackage) packageSetting);
if (DEBUG_SETTINGS) Log.i(TAG, "Reading package " + name