Merge "Fix issues 6512411 and 6512951 in ManageApplications." into jb-dev

This commit is contained in:
Dianne Hackborn
2012-05-17 18:15:44 -07:00
committed by Android (Google) Code Review

View File

@@ -42,6 +42,7 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.preference.PreferenceActivity;
import android.preference.PreferenceFrameLayout;
import android.provider.Settings;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.PagerTabStrip;
@@ -55,17 +56,13 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.view.inputmethod.InputMethodManager;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TextView;
import com.android.internal.app.IMediaContainerService;
@@ -122,6 +119,11 @@ final class CanBeOnSdCardChecker {
}
}
interface AppClickListener {
void onItemClick(ManageApplications.TabInfo tab, AdapterView<?> parent,
View view, int position, long id);
}
/**
* Activity to pick an application that will be used to display installation information and
* options to uninstall/delete user data for system applications. This activity
@@ -129,7 +131,7 @@ final class CanBeOnSdCardChecker {
* intent.
*/
public class ManageApplications extends Fragment implements
OnItemClickListener, DialogInterface.OnClickListener,
AppClickListener, DialogInterface.OnClickListener,
DialogInterface.OnDismissListener {
static final String TAG = "ManageApplications";
@@ -174,11 +176,10 @@ public class ManageApplications extends Fragment implements
public static class TabInfo implements OnItemClickListener {
public final ManageApplications mOwner;
public final ApplicationsState mApplicationsState;
public final IMediaContainerService mContainerService;
public final CharSequence mLabel;
public final int mListType;
public final int mFilter;
public final OnItemClickListener mClickListener;
public final AppClickListener mClickListener;
public final CharSequence mInvalidSizeStr;
public final CharSequence mComputingSizeStr;
private final Bundle mSavedInstanceState;
@@ -187,6 +188,8 @@ public class ManageApplications extends Fragment implements
public LayoutInflater mInflater;
public View mRootView;
private IMediaContainerService mContainerService;
private View mLoadingContainer;
private View mListContainer;
@@ -200,6 +203,7 @@ public class ManageApplications extends Fragment implements
private TextView mStorageChartLabel;
private TextView mUsedStorageText;
private TextView mFreeStorageText;
private long mFreeStorage = 0, mAppStorage = 0, mTotalStorage = 0;
private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
final Runnable mRunningProcessesAvail = new Runnable() {
@@ -209,12 +213,10 @@ public class ManageApplications extends Fragment implements
};
public TabInfo(ManageApplications owner, ApplicationsState apps,
IMediaContainerService containerService,
CharSequence label, int listType, OnItemClickListener clickListener,
CharSequence label, int listType, AppClickListener clickListener,
Bundle savedInstanceState) {
mOwner = owner;
mApplicationsState = apps;
mContainerService = containerService;
mLabel = label;
mListType = listType;
switch (listType) {
@@ -228,6 +230,11 @@ public class ManageApplications extends Fragment implements
mSavedInstanceState = savedInstanceState;
}
public void setContainerService(IMediaContainerService containerService) {
mContainerService = containerService;
updateStorageUsage();
}
public View build(LayoutInflater inflater, ViewGroup contentParent, View contentChild) {
if (mRootView != null) {
return mRootView;
@@ -260,6 +267,14 @@ public class ManageApplications extends Fragment implements
mUsedStorageText = (TextView)mListContainer.findViewById(R.id.usedStorageText);
mFreeStorageText = (TextView)mListContainer.findViewById(R.id.freeStorageText);
Utils.prepareCustomPreferencesList(contentParent, contentChild, mListView, false);
if (mFilter == FILTER_APPS_SDCARD) {
mStorageChartLabel.setText(mOwner.getActivity().getText(
R.string.sd_card_storage));
} else {
mStorageChartLabel.setText(mOwner.getActivity().getText(
R.string.internal_storage));
}
applyCurrentStorage();
}
mRunningProcessesView = (RunningProcessesView)mRootView.findViewById(
R.id.running_processes);
@@ -270,6 +285,15 @@ public class ManageApplications extends Fragment implements
return mRootView;
}
public void detachView() {
if (mRootView != null) {
ViewGroup group = (ViewGroup)mRootView.getParent();
if (group != null) {
group.removeView(mRootView);
}
}
}
public void resume(int sortOrder) {
if (mApplications != null) {
mApplications.resume(sortOrder);
@@ -295,27 +319,22 @@ public class ManageApplications extends Fragment implements
}
void updateStorageUsage() {
// Fragment view not yet created?
if (mRootView == null) return;
// Make sure a callback didn't come at an inopportune time.
if (mOwner.getActivity() == null) return;
// Doesn't make sense for stuff that is not an app list.
if (mApplications == null) return;
long freeStorage = 0;
long appStorage = 0;
long totalStorage = 0;
CharSequence newLabel = null;
mFreeStorage = 0;
mAppStorage = 0;
mTotalStorage = 0;
if (mFilter == FILTER_APPS_SDCARD) {
newLabel = mOwner.getActivity().getText(R.string.sd_card_storage);
if (mContainerService != null) {
try {
final long[] stats = mContainerService.getFileSystemStats(
Environment.getExternalStorageDirectory().getPath());
totalStorage = stats[0];
freeStorage = stats[1];
mTotalStorage = stats[0];
mFreeStorage = stats[1];
} catch (RemoteException e) {
Log.w(TAG, "Problem in container service", e);
}
@@ -325,18 +344,16 @@ public class ManageApplications extends Fragment implements
final int N = mApplications.getCount();
for (int i=0; i<N; i++) {
ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
appStorage += ae.externalCodeSize + ae.externalDataSize;
mAppStorage += ae.externalCodeSize + ae.externalDataSize;
}
}
} else {
newLabel = mOwner.getActivity().getText(R.string.internal_storage);
if (mContainerService != null) {
try {
final long[] stats = mContainerService.getFileSystemStats(
Environment.getDataDirectory().getPath());
totalStorage = stats[0];
freeStorage = stats[1];
mTotalStorage = stats[0];
mFreeStorage = stats[1];
} catch (RemoteException e) {
Log.w(TAG, "Problem in container service", e);
}
@@ -347,21 +364,27 @@ public class ManageApplications extends Fragment implements
final int N = mApplications.getCount();
for (int i=0; i<N; i++) {
ApplicationsState.AppEntry ae = mApplications.getAppEntry(i);
appStorage += ae.codeSize + ae.dataSize;
mAppStorage += ae.codeSize + ae.dataSize;
if (emulatedStorage) {
appStorage += ae.externalCodeSize + ae.externalDataSize;
mAppStorage += ae.externalCodeSize + ae.externalDataSize;
}
}
}
freeStorage += mApplicationsState.sumCacheSizes();
mFreeStorage += mApplicationsState.sumCacheSizes();
}
if (newLabel != null) {
mStorageChartLabel.setText(newLabel);
applyCurrentStorage();
}
void applyCurrentStorage() {
// If view hierarchy is not yet created, no views to update.
if (mRootView == null) {
return;
}
if (totalStorage > 0) {
mColorBar.setRatios((totalStorage-freeStorage-appStorage)/(float)totalStorage,
appStorage/(float)totalStorage, freeStorage/(float)totalStorage);
long usedStorage = totalStorage - freeStorage;
if (mTotalStorage > 0) {
mColorBar.setRatios((mTotalStorage-mFreeStorage-mAppStorage)/(float)mTotalStorage,
mAppStorage/(float)mTotalStorage, mFreeStorage/(float)mTotalStorage);
long usedStorage = mTotalStorage - mFreeStorage;
if (mLastUsedStorage != usedStorage) {
mLastUsedStorage = usedStorage;
String sizeStr = Formatter.formatShortFileSize(
@@ -369,10 +392,10 @@ public class ManageApplications extends Fragment implements
mUsedStorageText.setText(mOwner.getActivity().getResources().getString(
R.string.service_foreground_processes, sizeStr));
}
if (mLastFreeStorage != freeStorage) {
mLastFreeStorage = freeStorage;
if (mLastFreeStorage != mFreeStorage) {
mLastFreeStorage = mFreeStorage;
String sizeStr = Formatter.formatShortFileSize(
mOwner.getActivity(), freeStorage);
mOwner.getActivity(), mFreeStorage);
mFreeStorageText.setText(mOwner.getActivity().getResources().getString(
R.string.service_background_processes, sizeStr));
}
@@ -391,7 +414,7 @@ public class ManageApplications extends Fragment implements
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mClickListener.onItemClick(parent, view, position, id);
mClickListener.onItemClick(this, parent, view, position, id);
}
void handleRunningProcessesAvail() {
@@ -711,6 +734,7 @@ public class ManageApplications extends Fragment implements
if (mLastSortMode == SORT_ORDER_SIZE) {
rebuild(false);
}
mTab.updateStorageUsage();
}
public int getCount() {
@@ -825,24 +849,24 @@ public class ManageApplications extends Fragment implements
mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
mComputingSizeStr = getActivity().getText(R.string.computing_size);
TabInfo tab = new TabInfo(this, mApplicationsState, mContainerService,
TabInfo tab = new TabInfo(this, mApplicationsState,
getActivity().getString(R.string.filter_apps_third_party),
LIST_TYPE_DOWNLOADED, this, savedInstanceState);
mTabs.add(tab);
if (!Environment.isExternalStorageEmulated()) {
tab = new TabInfo(this, mApplicationsState, mContainerService,
tab = new TabInfo(this, mApplicationsState,
getActivity().getString(R.string.filter_apps_onsdcard),
LIST_TYPE_SDCARD, this, savedInstanceState);
mTabs.add(tab);
}
tab = new TabInfo(this, mApplicationsState, mContainerService,
tab = new TabInfo(this, mApplicationsState,
getActivity().getString(R.string.filter_apps_running),
LIST_TYPE_RUNNING, this, savedInstanceState);
mTabs.add(tab);
tab = new TabInfo(this, mApplicationsState, mContainerService,
tab = new TabInfo(this, mApplicationsState,
getActivity().getString(R.string.filter_apps_all),
LIST_TYPE_ALL, this, savedInstanceState);
mTabs.add(tab);
@@ -866,6 +890,12 @@ public class ManageApplications extends Fragment implements
PagerTabStrip tabs = (PagerTabStrip) rootView.findViewById(R.id.tabs);
tabs.setTabIndicatorColorResource(android.R.color.holo_blue_light);
// We have to do this now because PreferenceFrameLayout looks at it
// only when the view is added.
if (container instanceof PreferenceFrameLayout) {
((PreferenceFrameLayout.LayoutParams) rootView.getLayoutParams()).removeBorders = true;
}
if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
buildResetDialog();
}
@@ -918,6 +948,17 @@ public class ManageApplications extends Fragment implements
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
// We are going to keep the tab data structures around, but they
// are no longer attached to their view hierarchy.
for (int i=0; i<mTabs.size(); i++) {
mTabs.get(i).detachView();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == INSTALLED_APP_DETAILS && mCurrentPkgName != null) {
@@ -1129,10 +1170,10 @@ public class ManageApplications extends Fragment implements
return true;
}
public void onItemClick(AdapterView<?> parent, View view, int position,
public void onItemClick(TabInfo tab, AdapterView<?> parent, View view, int position,
long id) {
if (mCurTab != null && mCurTab.mApplications != null) {
ApplicationsState.AppEntry entry = mCurTab.mApplications.getAppEntry(position);
if (tab.mApplications != null && tab.mApplications.getCount() > position) {
ApplicationsState.AppEntry entry = tab.mApplications.getAppEntry(position);
mCurrentPkgName = entry.info.packageName;
startApplicationDetailsActivity();
}
@@ -1170,8 +1211,8 @@ public class ManageApplications extends Fragment implements
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mContainerService = IMediaContainerService.Stub.asInterface(service);
if (mCurTab != null) {
mCurTab.updateStorageUsage();
for (int i=0; i<mTabs.size(); i++) {
mTabs.get(i).setContainerService(mContainerService);
}
}