summaryrefslogtreecommitdiffstats
path: root/src/com/android
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2010-10-20 16:01:50 -0700
committerDianne Hackborn <hackbod@google.com>2010-10-20 16:54:41 -0700
commitd2be882d8f2e5acd8a5806c649ba4640249cf4ba (patch)
treec2c1c2547fe332e95ef277343b92b8a5d4015c87 /src/com/android
parent916adce02d5b37038cd78d11a8c884237684f9a8 (diff)
downloadpackages_apps_settings-d2be882d8f2e5acd8a5806c649ba4640249cf4ba.zip
packages_apps_settings-d2be882d8f2e5acd8a5806c649ba4640249cf4ba.tar.gz
packages_apps_settings-d2be882d8f2e5acd8a5806c649ba4640249cf4ba.tar.bz2
Fix issue #3114356: Storage visualization in Manage Apps is confusing
Also fixes issue #3097388: If you launch Manage Applications when SD card app info isn't available, incomplete information gets cached Change-Id: If3377a965653590e5bc1df25e38764a83e96b820
Diffstat (limited to 'src/com/android')
-rw-r--r--src/com/android/settings/applications/ApplicationsState.java96
-rw-r--r--src/com/android/settings/applications/LinearColorBar.java32
-rw-r--r--src/com/android/settings/applications/ManageApplications.java21
-rw-r--r--src/com/android/settings/fuelgauge/BatteryHistoryChart.java2
4 files changed, 119 insertions, 32 deletions
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 9515624..c08ae5a 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -21,6 +21,7 @@ import android.os.SystemClock;
import android.text.format.Formatter;
import android.util.Log;
+import java.io.File;
import java.text.Collator;
import java.text.Normalizer;
import java.text.Normalizer.Form;
@@ -66,14 +67,17 @@ public class ApplicationsState {
}
public static class AppEntry {
- final String label;
+ final File apkFile;
final long id;
+ String label;
long size;
long cacheSize;
long codeSize;
long dataSize;
+ boolean mounted;
+
String getNormalizedLabel() {
if (normalizedLabel != null) {
return normalizedLabel;
@@ -92,12 +96,47 @@ public class ApplicationsState {
String normalizedLabel;
AppEntry(Context context, ApplicationInfo info, long id) {
- CharSequence label = info.loadLabel(context.getPackageManager());
- this.label = label != null ? label.toString() : info.packageName;
+ apkFile = new File(info.sourceDir);
this.id = id;
this.info = info;
this.size = SIZE_UNKNOWN;
this.sizeStale = true;
+ ensureLabel(context);
+ }
+
+ void ensureLabel(Context context) {
+ if (this.label == null || !this.mounted) {
+ if (!this.apkFile.exists()) {
+ this.mounted = false;
+ this.label = info.packageName;
+ } else {
+ this.mounted = true;
+ CharSequence label = info.loadLabel(context.getPackageManager());
+ this.label = label != null ? label.toString() : info.packageName;
+ }
+ }
+ }
+
+ boolean ensureIconLocked(Context context, PackageManager pm) {
+ if (this.icon == null) {
+ if (this.apkFile.exists()) {
+ this.icon = this.info.loadIcon(pm);
+ return true;
+ } else {
+ this.mounted = false;
+ this.icon = context.getResources().getDrawable(
+ com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon);
+ }
+ } else if (!this.mounted) {
+ // If the app wasn't mounted but is now mounted, reload
+ // its icon.
+ if (this.apkFile.exists()) {
+ this.mounted = true;
+ this.icon = this.info.loadIcon(pm);
+ return true;
+ }
+ }
+ return false;
}
}
@@ -217,9 +256,11 @@ public class ApplicationsState {
return;
}
boolean avail = Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(actionStr);
- for (String pkgName : pkgList) {
- if (avail) addPackage(pkgName);
- else removePackage(pkgName);
+ if (avail) {
+ for (String pkgName : pkgList) {
+ removePackage(pkgName);
+ addPackage(pkgName);
+ }
}
}
}
@@ -312,6 +353,13 @@ public class ApplicationsState {
for (int i=0; i<mAppEntries.size(); i++) {
mAppEntries.get(i).sizeStale = true;
}
+ for (int i=0; i<mApplications.size(); i++) {
+ final ApplicationInfo info = mApplications.get(i);
+ final AppEntry entry = mEntriesMap.get(info.packageName);
+ if (entry != null) {
+ entry.info = info;
+ }
+ }
mCurComputingSizePkg = null;
if (!mBackgroundHandler.hasMessages(BackgroundHandler.MSG_LOAD_ENTRIES)) {
mBackgroundHandler.sendEmptyMessage(BackgroundHandler.MSG_LOAD_ENTRIES);
@@ -391,6 +439,7 @@ public class ApplicationsState {
if (filter == null || filter.filterApp(info)) {
synchronized (mEntriesMap) {
AppEntry entry = getEntryLocked(info);
+ entry.ensureLabel(mContext);
if (DEBUG) Log.i(TAG, "Using " + info.packageName + ": " + entry);
filteredApps.add(entry);
}
@@ -438,12 +487,10 @@ public class ApplicationsState {
return;
}
synchronized (entry) {
- if (entry.icon == null) {
- entry.icon = entry.info.loadIcon(mPm);
- }
+ entry.ensureIconLocked(mContext, mPm);
}
}
-
+
void requestSize(String packageName) {
synchronized (mEntriesMap) {
AppEntry entry = mEntriesMap.get(packageName);
@@ -453,6 +500,16 @@ public class ApplicationsState {
}
}
+ long sumCacheSizes() {
+ long sum = 0;
+ synchronized (mEntriesMap) {
+ for (int i=mAppEntries.size()-1; i>=0; i--) {
+ sum += mAppEntries.get(i).cacheSize;
+ }
+ }
+ return sum;
+ }
+
int indexOfApplicationInfoLocked(String pkgName) {
for (int i=mApplications.size()-1; i>=0; i--) {
if (mApplications.get(i).packageName.equals(pkgName)) {
@@ -630,16 +687,17 @@ public class ApplicationsState {
synchronized (mEntriesMap) {
for (int i=0; i<mAppEntries.size() && numDone<2; i++) {
AppEntry entry = mAppEntries.get(i);
- if (entry.icon == null) {
- if (!mRunning) {
- mRunning = true;
- Message m = mMainHandler.obtainMessage(
- MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
- mMainHandler.sendMessage(m);
- }
- numDone++;
+ if (entry.icon == null || !entry.mounted) {
synchronized (entry) {
- entry.icon = entry.info.loadIcon(mPm);
+ if (entry.ensureIconLocked(mContext, mPm)) {
+ if (!mRunning) {
+ mRunning = true;
+ Message m = mMainHandler.obtainMessage(
+ MainHandler.MSG_RUNNING_STATE_CHANGED, 1);
+ mMainHandler.sendMessage(m);
+ }
+ numDone++;
+ }
}
}
}
diff --git a/src/com/android/settings/applications/LinearColorBar.java b/src/com/android/settings/applications/LinearColorBar.java
index 74164c4..0b9f7b0 100644
--- a/src/com/android/settings/applications/LinearColorBar.java
+++ b/src/com/android/settings/applications/LinearColorBar.java
@@ -16,7 +16,7 @@ import android.widget.LinearLayout;
public class LinearColorBar extends LinearLayout {
static final int LEFT_COLOR = 0xffa0a0a0;
- static final int MIDDLE_COLOR = 0xff7070ff;
+ static final int MIDDLE_COLOR = 0xffa0a0a0;
static final int RIGHT_COLOR = 0xffa0c0a0;
private float mRedRatio;
@@ -47,6 +47,7 @@ public class LinearColorBar extends LinearLayout {
? 2 : 1;
mEdgeGradientPaint.setStrokeWidth(mLineWidth);
mEdgeGradientPaint.setAntiAlias(true);
+
}
public void setRatios(float red, float yellow, float green) {
@@ -111,22 +112,33 @@ public class LinearColorBar extends LinearLayout {
mColorPath.reset();
mEdgePath.reset();
if (indicatorLeft < indicatorRight) {
+ final int midTopY = mRect.top;
+ final int midBottomY = 0;
+ final int xoff = 2;
mColorPath.moveTo(indicatorLeft, mRect.top);
- mColorPath.lineTo(-1, 0);
- mColorPath.lineTo(width, 0);
- mColorPath.lineTo(indicatorRight, mRect.top);
+ mColorPath.cubicTo(indicatorLeft, midBottomY,
+ -xoff, midTopY,
+ -xoff, 0);
+ mColorPath.lineTo(width+xoff-1, 0);
+ mColorPath.cubicTo(width+xoff-1, midTopY,
+ indicatorRight, midBottomY,
+ indicatorRight, mRect.top);
mColorPath.close();
- float lineOffset = mLineWidth+.5f;
- mEdgePath.moveTo(indicatorLeft+lineOffset, mRect.top);
- mEdgePath.lineTo(-1+lineOffset, 0);
- mEdgePath.moveTo(indicatorRight-lineOffset, mRect.top);
- mEdgePath.lineTo(width-lineOffset, 0);
+ final float lineOffset = mLineWidth+.5f;
+ mEdgePath.moveTo(-xoff+lineOffset, 0);
+ mEdgePath.cubicTo(-xoff+lineOffset, midTopY,
+ indicatorLeft+lineOffset, midBottomY,
+ indicatorLeft+lineOffset, mRect.top);
+ mEdgePath.moveTo(width+xoff-1-lineOffset, 0);
+ mEdgePath.cubicTo(width+xoff-1-lineOffset, midTopY,
+ indicatorRight-lineOffset, midBottomY,
+ indicatorRight-lineOffset, mRect.top);
}
mLastInterestingLeft = indicatorLeft;
mLastInterestingRight = indicatorRight;
}
- if (!mColorPath.isEmpty()) {
+ if (!mEdgePath.isEmpty()) {
canvas.drawPath(mEdgePath, mEdgeGradientPaint);
canvas.drawPath(mColorPath, mColorGradientPaint);
}
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index b4cd26e..345766e 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -36,6 +36,7 @@ import android.os.StatFs;
import android.provider.Settings;
import android.text.format.Formatter;
import android.util.Log;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
@@ -43,6 +44,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.AnimationUtils;
+import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
@@ -57,7 +59,6 @@ import android.widget.AdapterView.OnItemClickListener;
import java.util.ArrayList;
import java.util.Comparator;
-import java.util.List;
final class CanBeOnSdCardChecker {
final IPackageManager mPm;
@@ -118,7 +119,7 @@ public class ManageApplications extends TabActivity implements
// constant value that can be used to check return code from sub activity.
private static final int INSTALLED_APP_DETAILS = 1;
-
+
// sort order that can be changed through the menu can be sorted alphabetically
// or size(descending)
private static final int MENU_OPTIONS_BASE = 0;
@@ -676,6 +677,18 @@ public class ManageApplications extends TabActivity implements
}
return true;
}
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_SEARCH && event.isTracking()) {
+ if (mCurView != VIEW_RUNNING) {
+ ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
+ .showSoftInputUnchecked(0, null);
+ }
+ return true;
+ }
+ return super.onKeyUp(keyCode, event);
+ }
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
@@ -738,8 +751,8 @@ public class ManageApplications extends TabActivity implements
for (int i=0; i<N; i++) {
ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);
appStorage += ae.codeSize + ae.dataSize;
- freeStorage += ae.cacheSize;
}
+ freeStorage += mApplicationsState.sumCacheSizes();
}
if (newLabel != null) {
mStorageChartLabel.setText(newLabel);
@@ -831,6 +844,8 @@ public class ManageApplications extends TabActivity implements
} else if (TAB_SDCARD.equalsIgnoreCase(tabId)) {
newOption = FILTER_APPS_SDCARD;
} else if (TAB_RUNNING.equalsIgnoreCase(tabId)) {
+ ((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
+ .hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
selectView(VIEW_RUNNING);
return;
} else {
diff --git a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
index f3e0056..23107da 100644
--- a/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
+++ b/src/com/android/settings/fuelgauge/BatteryHistoryChart.java
@@ -285,6 +285,8 @@ public class BatteryHistoryChart extends View {
}
}
+ a.recycle();
+
mTextPaint.setColor(textColor.getDefaultColor());
mTextPaint.setTextSize(textSize);