diff options
author | nebkat <nebkat@teamhacksung.org> | 2012-12-22 10:46:58 +0000 |
---|---|---|
committer | nebkat <nebkat@teamhacksung.org> | 2012-12-22 20:10:14 +0000 |
commit | 1a9d397e9d8f432d6a8acfc96a6378cff57e753a (patch) | |
tree | 7581c076b96e3265592a209c8072b90e79005394 /src/com | |
parent | 229ac203294898445ce64e2f9ccd2163d681c276 (diff) | |
download | packages_apps_trebuchet-1a9d397e9d8f432d6a8acfc96a6378cff57e753a.zip packages_apps_trebuchet-1a9d397e9d8f432d6a8acfc96a6378cff57e753a.tar.gz packages_apps_trebuchet-1a9d397e9d8f432d6a8acfc96a6378cff57e753a.tar.bz2 |
AppsCustomizePagedView: Filtering
Change-Id: I829fc4b1a54e348d3c13da602d133dc20d315cca
Diffstat (limited to 'src/com')
6 files changed, 435 insertions, 31 deletions
diff --git a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java index 535338a..070bfed 100644 --- a/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java +++ b/src/com/cyanogenmod/trebuchet/AppsCustomizePagedView.java @@ -255,6 +255,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen InstallDate } + private int mFilterApps = FILTER_APPS_SYSTEM_FLAG | FILTER_APPS_DOWNLOADED_FLAG; + + private static final int FILTER_APPS_SYSTEM_FLAG = 1; + private static final int FILTER_APPS_DOWNLOADED_FLAG = 2; + // Refs private Launcher mLauncher; private DragController mDragController; @@ -270,6 +275,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen private ContentType mContentType; private SortMode mSortMode = SortMode.Title; private ArrayList<ApplicationInfo> mApps; + private ArrayList<ApplicationInfo> mFilteredApps; + private ArrayList<ComponentName> mHiddenApps; private ArrayList<Object> mWidgets; // Cling @@ -376,6 +383,8 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mPackageManager = context.getPackageManager(); mContentType = ContentType.Applications; mApps = new ArrayList<ApplicationInfo>(); + mFilteredApps = new ArrayList<ApplicationInfo>(); + mHiddenApps = new ArrayList<ComponentName>(); mWidgets = new ArrayList<Object>(); mIconCache = ((LauncherApplication) context.getApplicationContext()).getIconCache(); mCanvas = new Canvas(); @@ -397,6 +406,11 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mFadeScrollingIndicator = PreferencesProvider.Interface.Drawer.Indicator.getFadeScrollingIndicator(); mScrollingIndicatorPosition = PreferencesProvider.Interface.Drawer.Indicator.getScrollingIndicatorPosition(); + String[] flattened = PreferencesProvider.Interface.Drawer.getHiddenApps().split("\\|"); + for (String flat : flattened) { + mHiddenApps.add(ComponentName.unflattenFromString(flat)); + } + if (!mShowScrollingIndicator) { disableScrollingIndicator(); @@ -451,7 +465,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen i = (currentPage * numItemsPerPage) + (childCount / 2); } } else { - int numApps = mApps.size(); + int numApps = mFilteredApps.size(); PagedViewGridLayout layout = (PagedViewGridLayout) getPageAt(currentPage); int numItemsPerPage = mWidgetCountX * mWidgetCountY; int childCount = layout.getChildCount(); @@ -499,12 +513,12 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen if (mJoinWidgetsApps) { if (index < 0) return 0; - if (index < mApps.size()) { + if (index < mFilteredApps.size()) { int numItemsPerPage = mCellCountX * mCellCountY; return (index / numItemsPerPage); } else { int numItemsPerPage = mWidgetCountX * mWidgetCountY; - return mNumAppsPages + ((index - mApps.size()) / numItemsPerPage); + return mNumAppsPages + ((index - mFilteredApps.size()) / numItemsPerPage); } } else { switch (mContentType) { @@ -530,7 +544,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen if (mJoinWidgetsApps) { mNumWidgetPages = (int) Math.ceil(mWidgets.size() / (float) (mWidgetCountX * mWidgetCountY)); - mNumAppsPages = (int) Math.ceil((float) mApps.size() / (mCellCountX * mCellCountY)); + mNumAppsPages = (int) Math.ceil((float) mFilteredApps.size() / (mCellCountX * mCellCountY)); } } @@ -1202,7 +1216,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen public void syncAppsPages() { // Ensure that we have the right number of pages Context context = getContext(); - int numPages = (int) Math.ceil((float) mApps.size() / (mCellCountX * mCellCountY)); + int numPages = (int) Math.ceil((float) mFilteredApps.size() / (mCellCountX * mCellCountY)); for (int i = 0; i < numPages; ++i) { PagedViewCellLayout layout = new PagedViewCellLayout(context); setupPage(layout); @@ -1213,14 +1227,14 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // ensure that we have the right number of items on the pages int numCells = mCellCountX * mCellCountY; int startIndex = page * numCells; - int endIndex = Math.min(startIndex + numCells, mApps.size()); + int endIndex = Math.min(startIndex + numCells, mFilteredApps.size()); PagedViewCellLayout layout = (PagedViewCellLayout) getPageAt(page); layout.removeAllViewsOnPage(); ArrayList<Object> items = new ArrayList<Object>(); ArrayList<Bitmap> images = new ArrayList<Bitmap>(); for (int i = startIndex; i < endIndex; ++i) { - ApplicationInfo info = mApps.get(i); + ApplicationInfo info = mFilteredApps.get(i); PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate( R.layout.apps_customize_application, layout, false); icon.applyFromApplicationInfo(info, true, this); @@ -2256,32 +2270,38 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen mSortMode = sortMode; - if (mSortMode == SortMode.Title) { - Collections.sort(mApps, LauncherModel.getAppNameComparator()); - } else if (mSortMode == SortMode.InstallDate) { - Collections.sort(mApps, LauncherModel.APP_INSTALL_TIME_COMPARATOR); + filterApps(); + } + + public void setShowSystemApps(boolean show) { + if (show) { + mFilterApps |= FILTER_APPS_SYSTEM_FLAG; + } else { + mFilterApps &= ~FILTER_APPS_SYSTEM_FLAG; } + filterApps(); + } - if (mJoinWidgetsApps) { - for (int i = 0; i < mNumAppsPages; i++) { - syncAppsPageItems(i, true); - } + public void setShowDownloadedApps(boolean show) { + if (show) { + mFilterApps |= FILTER_APPS_DOWNLOADED_FLAG; } else { - if (mContentType == ContentType.Applications) { - for (int i = 0; i < getChildCount(); i++) { - syncAppsPageItems(i, true); - } - } + mFilterApps &= ~FILTER_APPS_DOWNLOADED_FLAG; } + filterApps(); + } + + public boolean getShowSystemApps() { + return (mFilterApps & FILTER_APPS_SYSTEM_FLAG) != 0; + } + + public boolean getShowDownloadedApps() { + return (mFilterApps & FILTER_APPS_DOWNLOADED_FLAG) != 0; } public void setApps(ArrayList<ApplicationInfo> list) { mApps = list; - if (mSortMode == SortMode.Title) { - Collections.sort(mApps, LauncherModel.getAppNameComparator()); - } else if (mSortMode == SortMode.InstallDate) { - Collections.sort(mApps, LauncherModel.APP_INSTALL_TIME_COMPARATOR); - } + filterAppsWithoutInvalidate(); updatePageCounts(); invalidateOnDataChange(); } @@ -2290,12 +2310,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen int count = list.size(); for (int i = 0; i < count; ++i) { ApplicationInfo info = list.get(i); - int index = 0; - if (mSortMode == SortMode.Title) { - index = Collections.binarySearch(mApps, info, LauncherModel.getAppNameComparator()); - } else if (mSortMode == SortMode.InstallDate) { - index = Collections.binarySearch(mApps, info, LauncherModel.APP_INSTALL_TIME_COMPARATOR); - } + int index = Collections.binarySearch(mApps, info, LauncherModel.getAppNameComparator()); if (index < 0) { mApps.add(-(index + 1), info); } @@ -2303,6 +2318,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } public void addApps(ArrayList<ApplicationInfo> list) { addAppsWithoutInvalidate(list); + filterAppsWithoutInvalidate(); updatePageCounts(); invalidateOnDataChange(); } @@ -2350,6 +2366,7 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen } public void removeApps(ArrayList<String> packageNames) { removeAppsWithPackageNameWithoutInvalidate(packageNames); + filterAppsWithoutInvalidate(); updatePageCounts(); invalidateOnDataChange(); } @@ -2359,6 +2376,30 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen // place in the list. removeAppsWithoutInvalidate(list); addAppsWithoutInvalidate(list); + filterAppsWithoutInvalidate(); + updatePageCounts(); + invalidateOnDataChange(); + } + public void filterAppsWithoutInvalidate() { + mFilteredApps = new ArrayList<ApplicationInfo>(mApps); + Iterator<ApplicationInfo> iterator = mFilteredApps.iterator(); + while (iterator.hasNext()) { + ApplicationInfo appInfo = iterator.next(); + boolean system = (appInfo.flags & ApplicationInfo.DOWNLOADED_FLAG) == 0; + if (mHiddenApps.contains(appInfo.componentName) || + (system && !getShowSystemApps()) || + (!system && !getShowDownloadedApps())) { + iterator.remove(); + } + } + if (mSortMode == SortMode.Title) { + Collections.sort(mFilteredApps, LauncherModel.getAppNameComparator()); + } else if (mSortMode == SortMode.InstallDate) { + Collections.sort(mFilteredApps, LauncherModel.APP_INSTALL_TIME_COMPARATOR); + } + } + public void filterApps() { + filterAppsWithoutInvalidate(); updatePageCounts(); invalidateOnDataChange(); } diff --git a/src/com/cyanogenmod/trebuchet/Launcher.java b/src/com/cyanogenmod/trebuchet/Launcher.java index 28e4f0e..3450db6 100644 --- a/src/com/cyanogenmod/trebuchet/Launcher.java +++ b/src/com/cyanogenmod/trebuchet/Launcher.java @@ -2064,6 +2064,10 @@ public final class Launcher extends Activity } else if (sortMode == AppsCustomizePagedView.SortMode.InstallDate) { menu.findItem(R.id.apps_sort_install_date).setChecked(true); } + boolean showSystemApps = mAppsCustomizeContent.getShowSystemApps(); + boolean showDownloadedApps = mAppsCustomizeContent.getShowDownloadedApps(); + menu.findItem(R.id.apps_filter_system).setChecked(showSystemApps).setEnabled(showDownloadedApps); + menu.findItem(R.id.apps_filter_downloaded).setChecked(showDownloadedApps).setEnabled(showSystemApps); popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { @@ -2073,6 +2077,12 @@ public final class Launcher extends Activity case R.id.apps_sort_install_date: mAppsCustomizeContent.setSortMode(AppsCustomizePagedView.SortMode.InstallDate); break; + case R.id.apps_filter_system: + mAppsCustomizeContent.setShowSystemApps(!item.isChecked()); + break; + case R.id.apps_filter_downloaded: + mAppsCustomizeContent.setShowDownloadedApps(!item.isChecked()); + break; } return true; } diff --git a/src/com/cyanogenmod/trebuchet/preference/HiddenAppsActivity.java b/src/com/cyanogenmod/trebuchet/preference/HiddenAppsActivity.java new file mode 100644 index 0000000..3eb6170 --- /dev/null +++ b/src/com/cyanogenmod/trebuchet/preference/HiddenAppsActivity.java @@ -0,0 +1,231 @@ +package com.cyanogenmod.trebuchet.preference; + +import android.app.AlertDialog; +import android.app.ListActivity; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ResolveInfo; +import android.content.pm.PackageManager; +import android.os.AsyncTask; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.util.SparseBooleanArray; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.widget.ArrayAdapter; +import android.widget.Checkable; +import android.widget.ImageView; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.cyanogenmod.trebuchet.R; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class HiddenAppsActivity extends ListActivity implements MenuItem.OnMenuItemClickListener { + + private boolean mSaved; + + private static final int MENU_DELETE = 0; + + private PackageManager mPackageManager; + + private AppsAdapter mAppsAdapter; + + protected void onCreate(Bundle savedInstanceState) { + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + super.onCreate(savedInstanceState); + + setTitle(R.string.hidden_apps_title); + setContentView(R.layout.hidden_apps_list); + + getActionBar().setDisplayHomeAsUpEnabled(true); + setProgressBarIndeterminateVisibility(true); + setProgressBarIndeterminate(true); + + mPackageManager = getPackageManager(); + mAppsAdapter = new AppsAdapter(this, R.layout.hidden_apps_list_item); + mAppsAdapter.setNotifyOnChange(true); + + setListAdapter(mAppsAdapter); + + AsyncTask<Void, Void, Void> refreshAppsTask = new AsyncTask<Void, Void, Void>(){ + + @Override + protected void onPostExecute(Void result) { + restore(); + setProgressBarIndeterminateVisibility(false); + setProgressBarIndeterminate(false); + super.onPostExecute(result); + } + + @Override + protected Void doInBackground(Void... params) { + refreshApps(); + return null; + } + }; + refreshAppsTask.execute(null, null, null); + } + + @Override + public void onPause() { + super.onPause(); + save(); + } + + private void save() { + StringBuilder string = new StringBuilder(""); + + SparseBooleanArray checked = getListView().getCheckedItemPositions(); + + for (int i = 0; i < checked.size(); i++) { + if (checked.valueAt(i)) { + ResolveInfo app = (ResolveInfo) getListView().getItemAtPosition(checked.keyAt(i)); + if (string.length() > 0) string.append("|"); + string.append(new ComponentName(app.activityInfo.packageName, app.activityInfo.name).flattenToString()); + + } + } + + SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); + editor.putString("ui_drawer_hidden_apps", string.toString()); + editor.commit(); + + mSaved = true; + } + + private void restore() { + List<ComponentName> apps = new ArrayList(); + String[] flattened = PreferenceManager.getDefaultSharedPreferences(this) + .getString("ui_drawer_hidden_apps", "").split("\\|"); + for (String flat : flattened) { + apps.add(ComponentName.unflattenFromString(flat)); + } + + for (int i = 0; i < getListAdapter().getCount(); i++) { + ResolveInfo info = (ResolveInfo) getListAdapter().getItem(i); + if (apps.contains(new ComponentName(info.activityInfo.packageName, info.activityInfo.name))) { + getListView().setItemChecked(i, true); + } + } + + mSaved = true; + + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + + menu.add(0, MENU_DELETE, 0, R.string.menu_hidden_apps_delete) + .setOnMenuItemClickListener(this) + .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT); + + return true; + } + + @Override + public boolean onMenuItemClick(MenuItem item) { + switch (item.getItemId()) { + case MENU_DELETE: + delete(); + return true; + } + return false; + } + + private void delete() { + for (int i = 0; i < getListView().getCount(); i++) { + getListView().setItemChecked(i, false); + } + + mSaved = false; + } + + private void refreshApps() { + final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); + mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); + final List<ResolveInfo> apps = mPackageManager.queryIntentActivities(mainIntent, 0); + Collections.sort(apps, new ResolveInfo.DisplayNameComparator(mPackageManager)); + + runOnUiThread(new Runnable() { + @Override + public void run() { + mAppsAdapter.clear(); + mAppsAdapter.addAll(apps); + } + }); + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + boolean result = super.onMenuItemSelected(featureId, item); + if (item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return result; + } + + private class AppsAdapter extends ArrayAdapter<ResolveInfo> { + + private final LayoutInflater mInfaltor; + + public AppsAdapter(Context context, int textViewResourceId) { + super(context, textViewResourceId); + + mInfaltor = LayoutInflater.from(context); + + } + + @Override + public long getItemId(int id) { + return id; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final ResolveInfo info = getItem(position); + + if(convertView == null) { + convertView = mInfaltor.inflate(R.layout.hidden_apps_list_item, parent, false); + } + + final View item = convertView; + + ImageView icon = (ImageView) item.findViewById(R.id.icon); + TextView title = (TextView) item.findViewById(R.id.title); + + icon.setImageDrawable(info.loadIcon(mPackageManager)); + title.setText(info.loadLabel(mPackageManager)); + + item.setTag(info.activityInfo.packageName); + + item.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getListView().setItemChecked(position, !((Checkable) item).isChecked()); + mSaved = false; + } + }); + + return convertView; + } + + @Override + public boolean hasStableIds() { + return true; + } + } +} diff --git a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java index 7866345..623a297 100644 --- a/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java +++ b/src/com/cyanogenmod/trebuchet/preference/PreferencesProvider.java @@ -141,6 +141,9 @@ public final class PreferencesProvider { public static boolean getJoinWidgetsApps() { return getBoolean("ui_drawer_widgets_join_apps", true); } + public static String getHiddenApps() { + return getString("ui_drawer_hidden_apps", ""); + } public static class Scrolling { public static AppsCustomizePagedView.TransitionEffect getTransitionEffect(String def) { try { diff --git a/src/com/cyanogenmod/trebuchet/widget/CheckableLinearLayout.java b/src/com/cyanogenmod/trebuchet/widget/CheckableLinearLayout.java new file mode 100644 index 0000000..0e87f80 --- /dev/null +++ b/src/com/cyanogenmod/trebuchet/widget/CheckableLinearLayout.java @@ -0,0 +1,50 @@ +package com.cyanogenmod.trebuchet.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.CheckBox; +import android.widget.Checkable; +import android.widget.LinearLayout; + +import com.cyanogenmod.trebuchet.R; + +/* + * This class is useful for using inside of ListView that needs to have checkable items. + */ +public class CheckableLinearLayout extends LinearLayout implements Checkable { + private CheckBox mCheckBox; + + public CheckableLinearLayout(Context context) { + super(context); + } + + public CheckableLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public CheckableLinearLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + mCheckBox = (CheckBox) findViewById(R.id.checkbox); + } + + @Override + public boolean isChecked() { + return mCheckBox.isChecked(); + } + + @Override + public void setChecked(boolean checked) { + mCheckBox.setChecked(checked); + } + + @Override + public void toggle() { + mCheckBox.toggle(); + } +}
\ No newline at end of file diff --git a/src/com/cyanogenmod/trebuchet/widget/InertCheckBox.java b/src/com/cyanogenmod/trebuchet/widget/InertCheckBox.java new file mode 100644 index 0000000..bab357b --- /dev/null +++ b/src/com/cyanogenmod/trebuchet/widget/InertCheckBox.java @@ -0,0 +1,69 @@ +package com.cyanogenmod.trebuchet.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.widget.CheckBox; + + +// CheckBox that does not react to any user event in order to let the container handle them. +public class InertCheckBox extends CheckBox { + + @SuppressWarnings("unused") + public InertCheckBox(Context context) { + super(context); + } + + @SuppressWarnings("unused") + public InertCheckBox(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @SuppressWarnings("unused") + public InertCheckBox(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onKeyShortcut(int keyCode, KeyEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onKeyUp(int keyCode, KeyEvent event) { + // Make the checkbox not respond to any user event + return false; + } + + @Override + public boolean onTrackballEvent(MotionEvent event) { + // Make the checkbox not respond to any user event + return false; + } +}
\ No newline at end of file |