diff options
Diffstat (limited to 'src/com/android/settings/ManageApplications.java')
-rw-r--r-- | src/com/android/settings/ManageApplications.java | 145 |
1 files changed, 87 insertions, 58 deletions
diff --git a/src/com/android/settings/ManageApplications.java b/src/com/android/settings/ManageApplications.java index 512e547e6..74957ed43 100644 --- a/src/com/android/settings/ManageApplications.java +++ b/src/com/android/settings/ManageApplications.java @@ -19,6 +19,7 @@ package com.android.settings; import com.android.settings.R; import android.app.ActivityManager; import android.app.AlertDialog; +import android.app.Dialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.content.BroadcastReceiver; @@ -31,6 +32,7 @@ import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageManager; import android.content.pm.PackageStats; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -86,8 +88,6 @@ import java.util.TreeMap; * ACTION_MANAGE_PACKAGE_STORAGE) the list is sorted per size. * If the user selects an application, extended info(like size, uninstall/clear data options, * permissions info etc.,) is displayed via the InstalledAppDetails activity. - * This activity passes the package name and size information to the - * InstalledAppDetailsActivity to avoid recomputation of the package size information. */ public class ManageApplications extends ListActivity implements OnItemClickListener, DialogInterface.OnCancelListener, @@ -95,13 +95,12 @@ public class ManageApplications extends ListActivity implements // TAG for this activity private static final String TAG = "ManageApplications"; - // log information boolean + // Log information boolean private boolean localLOGV = Config.LOGV || false; // attributes used as keys when passing values to InstalledAppDetails activity public static final String APP_PKG_PREFIX = "com.android.settings."; public static final String APP_PKG_NAME = APP_PKG_PREFIX+"ApplicationPkgName"; - public static final String APP_PKG_SIZE = APP_PKG_PREFIX+"size"; public static final String APP_CHG = APP_PKG_PREFIX+"changed"; // attribute name used in receiver for tagging names of added/deleted packages @@ -122,7 +121,7 @@ public class ManageApplications extends ListActivity implements public static final int FILTER_APPS_RUNNING = MENU_OPTIONS_BASE + 4; public static final int FILTER_OPTIONS = MENU_OPTIONS_BASE + 5; // Alert Dialog presented to user to find out the filter option - AlertDialog.Builder mAlertDlgBuilder; + AlertDialog mAlertDlg; // sort order private int mSortOrder = SORT_ORDER_ALPHA; // Filter value @@ -157,7 +156,8 @@ public class ManageApplications extends ListActivity implements private Drawable mDefaultAppIcon; // temporary dialog displayed while the application info loads - private ProgressDialog mLoadingDlg = null; + private static final int DLG_BASE = 0; + private static final int DLG_LOADING = DLG_BASE + 1; // compute index used to track the application size computations private int mComputeIndex; @@ -196,6 +196,12 @@ public class ManageApplications extends ListActivity implements // Boolean variables indicating state private boolean mLoadLabels = false; private boolean mSizesFirst = false; + // ListView used to display list + private ListView mListView; + // State variables used to figure out menu options and also + // initiate the first computation and loading of resources + private boolean mJustCreated = true; + private boolean mFirst = false; /* * Handler class to handle messages for various operations @@ -242,8 +248,6 @@ public class ManageApplications extends ListActivity implements switch (msg.what) { case INIT_PKG_INFO: if(localLOGV) Log.i(TAG, "Message INIT_PKG_INFO"); - setProgressBarIndeterminateVisibility(true); - mComputeIndex = 0; // Retrieve the package list and init some structures initAppList(mFilterApps); mHandler.sendEmptyMessage(NEXT_LOAD_STEP); @@ -308,6 +312,7 @@ public class ManageApplications extends ListActivity implements } else { // end computation here mComputeSizes = true; + mFirst = true; mAppInfoAdapter.sortList(mSortOrder); mHandler.sendEmptyMessage(NEXT_LOAD_STEP); } @@ -408,8 +413,13 @@ public class ManageApplications extends ListActivity implements } else { // Create list view from the adapter here. Wait till the sort order // of list is defined. its either by label or by size. so atleast one of the - // first steps should be complete before creating the list - createListView(); + // first steps should be complete before filling the list + if (mJustCreated) { + // Set the adapter here. + mJustCreated = false; + mListView.setAdapter(mAppInfoAdapter); + dismissLoadingMsg(); + } if (!mComputeSizes) { initComputeSizes(); } else if (!mLoadLabels) { @@ -423,6 +433,8 @@ public class ManageApplications extends ListActivity implements } }; + + private void doneLoadingData() { setProgressBarIndeterminateVisibility(false); } @@ -487,13 +499,14 @@ public class ManageApplications extends ListActivity implements // some initialization code used when kicking off the size computation private void initAppList(int filterOption) { + setProgressBarIndeterminateVisibility(true); + mComputeIndex = 0; mComputeSizes = false; + mLoadLabels = false; // Initialize lists List<ApplicationInfo> appList = getInstalledApps(filterOption); mAddRemoveMap = new TreeMap<String, Boolean>(); - mAppInfoAdapter = new AppInfoAdapter(this, appList); - // register receiver - mReceiver.registerReceiver(); + mAppInfoAdapter.resetAppList(filterOption, appList); } // Utility method to start a thread to read application labels and icons @@ -519,23 +532,13 @@ public class ManageApplications extends ListActivity implements private void showEmptyViewIfListEmpty() { if (localLOGV) Log.i(TAG, "Checking for empty view"); if (mAppInfoAdapter.getCount() > 0) { + mListView.setVisibility(View.VISIBLE); mEmptyView.setVisibility(View.GONE); } else { + mListView.setVisibility(View.GONE); mEmptyView.setVisibility(View.VISIBLE); } } - - private void createListView() { - dismissLoadingMsg(); - // get list and set listeners and adapter - ListView lv= (ListView) findViewById(android.R.id.list); - lv.setAdapter(mAppInfoAdapter); - lv.setOnItemClickListener(this); - lv.setSaveEnabled(true); - lv.setItemsCanFocus(true); - lv.setOnItemClickListener(this); - showEmptyViewIfListEmpty(); - } // internal structure used to track added and deleted packages when // the activity has focus @@ -868,7 +871,11 @@ public class ManageApplications extends ListActivity implements AppInfo pInfo = iconMap.get(info.packageName); if(pInfo != null) { AppInfo aInfo = mAppPropMap.get(info.packageName); - aInfo.refreshIcon(pInfo); + if (aInfo != null) { + aInfo.refreshIcon(pInfo); + } else { + mAppPropMap.put(info.packageName, pInfo); + } changed = true; } } @@ -1114,12 +1121,6 @@ public class ManageApplications extends ListActivity implements requestWindowFeature(Window.FEATURE_PROGRESS); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.compute_sizes); - // init mLoadingDlg - mLoadingDlg = new ProgressDialog(this); - mLoadingDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); - mLoadingDlg.setMessage(getText(R.string.loading)); - mLoadingDlg.setIndeterminate(true); - mLoadingDlg.setOnCancelListener(this); mDefaultAppIcon =Resources.getSystem().getDrawable( com.android.internal.R.drawable.sym_def_app_icon); mInvalidSizeStr = getText(R.string.invalid_size_value); @@ -1129,29 +1130,51 @@ public class ManageApplications extends ListActivity implements mReceiver = new PackageIntentReceiver(); mEmptyView = (TextView) findViewById(R.id.empty_view); mObserver = new PkgSizeObserver(); + // Create adapter and list view here + List<ApplicationInfo> appList = getInstalledApps(mSortOrder); + mAppInfoAdapter = new AppInfoAdapter(this, appList); + ListView lv= (ListView) findViewById(android.R.id.list); + //lv.setAdapter(mAppInfoAdapter); + lv.setOnItemClickListener(this); + lv.setSaveEnabled(true); + lv.setItemsCanFocus(true); + lv.setOnItemClickListener(this); + mListView = lv; + showLoadingMsg(); } - private void showLoadingMsg() { - if (mLoadingDlg != null) { - if(localLOGV) Log.i(TAG, "Displaying Loading message"); - mLoadingDlg.show(); + @Override + public Dialog onCreateDialog(int id) { + if (id == DLG_LOADING) { + ProgressDialog dlg = new ProgressDialog(this); + dlg.setProgressStyle(ProgressDialog.STYLE_SPINNER); + dlg.setMessage(getText(R.string.loading)); + dlg.setIndeterminate(true); + dlg.setOnCancelListener(this); + return dlg; } + return null; + } + + + private void showLoadingMsg() { + showDialog(DLG_LOADING); + if(localLOGV) Log.i(TAG, "Displaying Loading message"); } private void dismissLoadingMsg() { - if ((mLoadingDlg != null) && (mLoadingDlg.isShowing())) { - if(localLOGV) Log.i(TAG, "Dismissing Loading message"); - mLoadingDlg.dismiss(); - } + if(localLOGV) Log.i(TAG, "Dismissing Loading message"); + dismissDialog(DLG_LOADING); } @Override public void onStart() { super.onStart(); - showLoadingMsg(); // Create a thread to load resources mResourceThread = new ResourceLoaderThread(); sendMessageToHandler(INIT_PKG_INFO); + // register receiver + mReceiver.registerReceiver(); } @Override @@ -1164,6 +1187,12 @@ public class ManageApplications extends ListActivity implements mAppPropCache = mAppInfoAdapter.mAppPropMap; } + // Avoid the restart and pause when orientation changes + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + } + /* * comparator class used to sort AppInfo objects based on size */ @@ -1191,13 +1220,11 @@ public class ManageApplications extends ListActivity implements } // utility method used to start sub activity - private void startApplicationDetailsActivity(ApplicationInfo info, PackageStats ps) { + private void startApplicationDetailsActivity() { // Create intent to start new activity Intent intent = new Intent(Intent.ACTION_VIEW); intent.setClass(this, InstalledAppDetails.class); - mCurrentPkgName = info.packageName; intent.putExtra(APP_PKG_NAME, mCurrentPkgName); - intent.putExtra(APP_PKG_SIZE, ps); // start new activity to display extended information startActivityForResult(intent, INSTALLED_APP_DETAILS); } @@ -1215,12 +1242,12 @@ public class ManageApplications extends ListActivity implements @Override public boolean onPrepareOptionsMenu(Menu menu) { - if (mComputeSizes) { + if (mFirst) { menu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA); menu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE); menu.findItem(FILTER_OPTIONS).setVisible(true); return true; - } + } return false; } @@ -1230,16 +1257,17 @@ public class ManageApplications extends ListActivity implements if ((menuId == SORT_ORDER_ALPHA) || (menuId == SORT_ORDER_SIZE)) { sendMessageToHandler(REORDER_LIST, menuId); } else if (menuId == FILTER_OPTIONS) { - if (mAlertDlgBuilder == null) { - mAlertDlgBuilder = new AlertDialog.Builder(this). - setTitle(R.string.filter_dlg_title). - setNeutralButton(R.string.cancel, this). - setSingleChoiceItems(new CharSequence[] {getText(R.string.filter_apps_all), - getText(R.string.filter_apps_running), - getText(R.string.filter_apps_third_party)}, - -1, this); + if (mAlertDlg == null) { + mAlertDlg = new AlertDialog.Builder(this). + setTitle(R.string.filter_dlg_title). + setNeutralButton(R.string.cancel, this). + setSingleChoiceItems(new CharSequence[] {getText(R.string.filter_apps_all), + getText(R.string.filter_apps_running), + getText(R.string.filter_apps_third_party)}, + -1, this). + create(); } - mAlertDlgBuilder.show(); + mAlertDlg.show(); } return true; } @@ -1247,12 +1275,12 @@ public class ManageApplications extends ListActivity implements public void onItemClick(AdapterView<?> parent, View view, int position, long id) { ApplicationInfo info = (ApplicationInfo)mAppInfoAdapter.getItem(position); - startApplicationDetailsActivity(info, mAppInfoAdapter.getAppStats(info.packageName)); + mCurrentPkgName = info.packageName; + startApplicationDetailsActivity(); } - // onCancel call back for dialog thats displayed when data is being loaded + // Finish the activity if the user presses the back button to cancel the activity public void onCancel(DialogInterface dialog) { - mLoadingDlg = null; finish(); } @@ -1273,6 +1301,7 @@ public class ManageApplications extends ListActivity implements default: return; } + mAlertDlg.dismiss(); sendMessageToHandler(REORDER_LIST, newOption); } } |