diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-05-17 18:05:17 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2012-05-17 18:15:28 -0700 |
commit | a4af18755e0a344c628e4ddc4ece793d3401e6fb (patch) | |
tree | e270239784f110a76d6503289cb232deacd94b99 /src | |
parent | a8e3ab89d625f620047c96d9fb066b42bf47c256 (diff) | |
download | packages_apps_settings-a4af18755e0a344c628e4ddc4ece793d3401e6fb.zip packages_apps_settings-a4af18755e0a344c628e4ddc4ece793d3401e6fb.tar.gz packages_apps_settings-a4af18755e0a344c628e4ddc4ece793d3401e6fb.tar.bz2 |
Fix issues 6512411 and 6512951 in ManageApplications.
6512411 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
6512951 Settings crash while returning from App info screen
Also fix padding around the UI, and display of storage use.
Change-Id: Ibfcfe1a4a80f25f81ba2cabbb2e3d60aaa9ac04e
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/settings/applications/ManageApplications.java | 135 |
1 files changed, 88 insertions, 47 deletions
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java index 1448dfd..88eaef1 100644 --- a/src/com/android/settings/applications/ManageApplications.java +++ b/src/com/android/settings/applications/ManageApplications.java @@ -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(); } @@ -919,6 +949,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) { mApplicationsState.requestSize(mCurrentPkgName); @@ -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); } } |