Android Open Source - dejalist Products Gallery Fragment






From Project

Back to project page dejalist.

License

The source code is released under:

Apache License

If you think the Android project dejalist listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package com.luboganev.dejalist.ui;
//  w  w  w  .ja v a 2  s. c  om
import static nl.qbusict.cupboard.CupboardFactory.cupboard;
import butterknife.InjectView;
import butterknife.Views;

import com.luboganev.dejalist.R;
import com.luboganev.dejalist.data.DejalistContract;
import com.luboganev.dejalist.data.DejalistContract.Products;
import com.luboganev.dejalist.data.SelectionBuilder;
import com.luboganev.dejalist.data.entities.Category;
import com.luboganev.dejalist.data.entities.Product;

import android.app.Activity;
import android.content.ContentValues;
import android.content.res.Resources;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView.MultiChoiceModeListener;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.TextView;

public class ProductsGalleryFragment extends Fragment implements ProductsGalleryActionTaker, LoaderCallbacks<Cursor>, OnItemClickListener, MultiChoiceModeListener {
    public static final String ARG_CATEGORY = "category";
    public static final String ARG_ALL_PRODUCTS = "all_products";
    public static final String ARG_NO_CATEGORY = "no_category";
    
    @InjectView(R.id.v_category_colorheader) View categoryColorHeader;
    @InjectView(R.id.grdv_products) GridView mProducts;
  @InjectView(R.id.iv_gallery_empty) ImageView mEmptyImage;  
  @InjectView(R.id.tv_gallery_empty) TextView mEmptyText;  
    
    private Category mSelectedCategory;
    
    private ProductsGalleryCursorAdapter mAdapter;
    
    private static final int LOADER_PRODUCTS_ID = 2;
    
    private static final String STATE_OPTIONMENUITEMSVISIBLE = "state_optionmenuitemsvisible"; 
    private static final String STATE_CHECKEDPRODUCTPOS = "state_checkedproductpos"; 
    private static final String STATE_SORTBY = "state_sortby"; 
    private boolean mOptionMenuItemsVisible; 
    private int mSortBy;
    private static final int SORT_AZ = 0;
    private static final int SORT_RECENT = 1;
    private static final int SORT_MOST = 2;
    private static final int SORT_CATEGORY = 3;
    private int[] mCheckedItemPos;
    
    public ProductsGalleryFragment() {
        // Empty constructor required for fragment subclasses
    }
    
    ProductsGalleryController mProductsGalleryController;
    
    public static ProductsGalleryFragment getInstanceAllProducts() {
      ProductsGalleryFragment fragment = new ProductsGalleryFragment();
      Bundle bundle = new Bundle();
      bundle.putBoolean(ARG_ALL_PRODUCTS, true);
      fragment.setArguments(bundle);
      return fragment;
    }
    
    public static ProductsGalleryFragment getInstanceCategoryProducts(Category category) {
      ProductsGalleryFragment fragment = new ProductsGalleryFragment();
      Bundle bundle = new Bundle();
      bundle.putParcelable(ARG_CATEGORY, category);
      fragment.setArguments(bundle);
      return fragment;
    }
    
    public static ProductsGalleryFragment getInstanceNoCategoryProducts() {
      ProductsGalleryFragment fragment = new ProductsGalleryFragment();
      Bundle bundle = new Bundle();
      bundle.putBoolean(ARG_NO_CATEGORY, true);
      fragment.setArguments(bundle);
      return fragment;
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      if(savedInstanceState != null) {
        mOptionMenuItemsVisible = savedInstanceState.getBoolean(STATE_OPTIONMENUITEMSVISIBLE, true);
        mSortBy = savedInstanceState.getInt(STATE_SORTBY, SORT_AZ);
        mCheckedItemPos = savedInstanceState.getIntArray(STATE_CHECKEDPRODUCTPOS);
      }
      else {
        mOptionMenuItemsVisible = true;  
        mSortBy = SORT_AZ;
        mCheckedItemPos = null;
      }
      setHasOptionsMenu(true);
    }
    
    @Override
    public void onSaveInstanceState(Bundle outState) {
      super.onSaveInstanceState(outState);
      outState.putBoolean(STATE_OPTIONMENUITEMSVISIBLE, mOptionMenuItemsVisible);
      outState.putInt(STATE_SORTBY, mSortBy);
      if(mProducts.getCheckedItemCount() > 0) {
        int[] checkedItemsPositions = new int[mProducts.getCheckedItemCount()];
        SparseBooleanArray array = mProducts.getCheckedItemPositions();
        int j=0;
      for (int i = 0; i < array.size(); i++) {
        if(array.valueAt(i)) {
          checkedItemsPositions[j] = array.keyAt(i);
          j++;
        }
      }       
        outState.putIntArray(STATE_CHECKEDPRODUCTPOS, checkedItemsPositions);
      }
    }
    
    @Override
    public void onDestroy() {
      super.onDestroy();
      if(mProductsGalleryController != null) {
        mProductsGalleryController.unregisterProductsGalleryActionTaker();
      }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_productsgallery, container, false);
        Views.inject(this, rootView);
        
        if(getArguments().containsKey(ARG_CATEGORY)) {
          mSelectedCategory = getArguments().getParcelable(ARG_CATEGORY);
          categoryColorHeader.setBackgroundColor(mSelectedCategory.color);
          getActivity().setTitle(mSelectedCategory.name);
        } else if(getArguments().containsKey(ARG_ALL_PRODUCTS)) {
          mSelectedCategory = null;
          categoryColorHeader.setVisibility(View.GONE);
          getActivity().setTitle(R.string.nav_all_products);
        } else {
          mSelectedCategory = null;
          categoryColorHeader.setVisibility(View.GONE);
          getActivity().setTitle(R.string.nav_products_no_category);
        }
        
        mProducts.setVisibility(View.INVISIBLE);
    mEmptyImage.setVisibility(View.INVISIBLE);
    mEmptyText.setVisibility(View.INVISIBLE);
        
        return rootView;
    }
    
    @Override
    public void onDestroyView() {
      super.onDestroyView();
      Views.reset(this);
    }
    
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
      inflater.inflate( 
          (getArguments().containsKey(ARG_CATEGORY) ? 
              R.menu.menu_category : 
                R.menu.menu_all_products), menu);
      super.onCreateOptionsMenu(menu, inflater);
    }
    
    @Override
    public void onPrepareOptionsMenu(Menu menu) {
      super.onPrepareOptionsMenu(menu);
    menu.findItem(R.id.menu_products_sort).setVisible(mOptionMenuItemsVisible);
    menu.findItem(R.id.menu_products_sort).setEnabled(mOptionMenuItemsVisible);
    
    if(mOptionMenuItemsVisible) {
      switch (mSortBy) {
      default:
      case SORT_AZ:
        menu.findItem(R.id.menu_products_sort_az).setChecked(true);
        break;
      case SORT_RECENT:
        menu.findItem(R.id.menu_products_sort_recent).setChecked(true);
        break;
      case SORT_MOST:
        menu.findItem(R.id.menu_products_sort_usage).setChecked(true);
        break;
      case SORT_CATEGORY:
        menu.findItem(R.id.menu_products_sort_category).setChecked(true);
        break;
      }
    }
    
    menu.findItem(R.id.menu_new_product).setVisible(mOptionMenuItemsVisible);
    menu.findItem(R.id.menu_new_product).setEnabled(mOptionMenuItemsVisible);
    
    if(getArguments().containsKey(ARG_CATEGORY)) {
      menu.findItem(R.id.menu_categories_edit).setVisible(mOptionMenuItemsVisible);
      menu.findItem(R.id.menu_categories_edit).setEnabled(mOptionMenuItemsVisible);
      menu.findItem(R.id.menu_categories_delete).setVisible(mOptionMenuItemsVisible);
      menu.findItem(R.id.menu_categories_delete).setEnabled(mOptionMenuItemsVisible);
    }
    else if(getArguments().containsKey(ARG_NO_CATEGORY)) {
      menu.findItem(R.id.menu_products_sort_category).setVisible(false);
      menu.findItem(R.id.menu_products_sort_category).setEnabled(false);
    }
    else {
      menu.findItem(R.id.menu_products_sort_category).setVisible(mOptionMenuItemsVisible);
      menu.findItem(R.id.menu_products_sort_category).setEnabled(mOptionMenuItemsVisible);
    }
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_products_sort_az:
          if (!item.isChecked()) {
            item.setChecked(true);
            mSortBy = SORT_AZ;
            reloadProducts();
          }
            return true;
        case R.id.menu_products_sort_recent:
          if (!item.isChecked()) {
            item.setChecked(true);
            mSortBy = SORT_RECENT;
            reloadProducts();
          }
            return true;   
        case R.id.menu_products_sort_usage:
            if (!item.isChecked()) {
              item.setChecked(true);
              mSortBy = SORT_MOST;
              reloadProducts();
            }
            return true;
        case R.id.menu_products_sort_category:
          if (!item.isChecked()) {
            item.setChecked(true);
            mSortBy = SORT_CATEGORY;
            reloadProducts();
          }
          return true;
        case R.id.menu_new_product:
            if(mProductsGalleryController != null) mProductsGalleryController.newProduct(mSelectedCategory);
            return true;  
        case R.id.menu_categories_edit:
          if(mProductsGalleryController != null) mProductsGalleryController.editCategory(mSelectedCategory);
            return true;   
        case R.id.menu_categories_delete:
          if(mProductsGalleryController != null) mProductsGalleryController.deleteCategory(mSelectedCategory);
            return true;  
        default:
            return super.onOptionsItemSelected(item);
        }
    }
    
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        // Verify that the host activity implements the callback interface
        try {
          mProductsGalleryController = (ProductsGalleryController) activity;
          mProductsGalleryController.registerProductsGalleryActionTaker(this);
        } catch (ClassCastException e) {
            // The activity doesn't implement the interface, throw exception
            throw new ClassCastException(activity.toString()
                    + " must implement ProductsGalleryController");
        }
    }
    
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);
      
        mAdapter = new ProductsGalleryCursorAdapter(getActivity().getApplicationContext(), 
            CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER, mSelectedCategory == null);
        mProducts.setAdapter(mAdapter);
        mProducts.setOnItemClickListener(this);
        mProducts.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
        mProducts.setMultiChoiceModeListener(this);
      
        reloadProducts();
    }
   
    private static final String LOADER_EXTRA_SORT = "sort";
    
    public void reloadProducts() {
      Bundle loaderExtras = new Bundle();
      switch(mSortBy) {
    case SORT_AZ:
      loaderExtras.putString(LOADER_EXTRA_SORT, DejalistContract.Products.ORDER_NAME_ASC);
      break;
    case SORT_MOST:
      loaderExtras.putString(LOADER_EXTRA_SORT, DejalistContract.Products.ORDER_USEDCOUNT_DESC + " , " + DejalistContract.Products.ORDER_NAME_ASC);
      break;
    case SORT_RECENT:
      loaderExtras.putString(LOADER_EXTRA_SORT, DejalistContract.Products.ORDER_LAST_USED_DESC + " , " + DejalistContract.Products.ORDER_NAME_ASC);
      break;
    case SORT_CATEGORY:
      loaderExtras.putString(LOADER_EXTRA_SORT, DejalistContract.Products.ORDER_CATEGORY + " , " + DejalistContract.Products.ORDER_NAME_ASC);
      break;
    }
      if(getActivity().getSupportLoaderManager().getLoader(LOADER_PRODUCTS_ID) != null) {
          getActivity().getSupportLoaderManager().restartLoader(LOADER_PRODUCTS_ID, loaderExtras, this);
        }
        else getActivity().getSupportLoaderManager().initLoader(LOADER_PRODUCTS_ID, loaderExtras, this);
    }

  @Override
  public void updateShownCategory(Category category) {
    if(mSelectedCategory == null) return;
    if(mSelectedCategory._id == category._id) {
      mSelectedCategory = category;
      categoryColorHeader.setBackgroundColor(mSelectedCategory.color);
      getActivity().setTitle(mSelectedCategory.name);
    }
  }

  @Override
  public void setOptionMenuItemsVisible(boolean visible) {
    mOptionMenuItemsVisible = visible;
  }
  
  @Override
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    if(id == LOADER_PRODUCTS_ID) {
      if(mSelectedCategory != null) {
        return new CursorLoader(getActivity().getApplicationContext(), 
            DejalistContract.Products.buildCategoryProductsUri(mSelectedCategory._id), null, Products.SELECTION_NOT_DELETED, null, args.getString(LOADER_EXTRA_SORT));
      }
      else if(getArguments().containsKey(ARG_NO_CATEGORY)) {
        return new CursorLoader(getActivity().getApplicationContext(), 
            DejalistContract.Products.CONTENT_URI, null, 
            new SelectionBuilder().where(Products.SELECTION_NO_CATEGORY, (String[])null)
            .where(Products.SELECTION_NOT_DELETED, (String[])null).getSelection()
            , null, args.getString(LOADER_EXTRA_SORT));
      }
      else {
        return new CursorLoader(getActivity().getApplicationContext(), 
            DejalistContract.Products.CONTENT_URI, null, Products.SELECTION_NOT_DELETED, null, args.getString(LOADER_EXTRA_SORT));
      }
    }
    return null;
  }
  
  @Override
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    if(loader.getId() == LOADER_PRODUCTS_ID) {
      //data.setNotificationUri(getActivity().getContentResolver(), DejalistContract.Products.CONTENT_URI);
      mAdapter.changeCursor(data);
      if(mCheckedItemPos != null) {
        for (int itemPos : mCheckedItemPos) {
          mProducts.setItemChecked(itemPos, true);
        }
        mCheckedItemPos = null;
      }
      if(data.getCount() == 0) {
        mProducts.setVisibility(View.INVISIBLE);
        mEmptyImage.setVisibility(View.VISIBLE);
        mEmptyText.setVisibility(View.VISIBLE);
      }
      else {
        mProducts.setVisibility(View.VISIBLE);
        mEmptyImage.setVisibility(View.INVISIBLE);
        mEmptyText.setVisibility(View.INVISIBLE);
      }
    }
  }

  @Override
  public void onLoaderReset(Loader<Cursor> loader) {
    if(loader.getId() == LOADER_PRODUCTS_ID) {
      mAdapter.changeCursor(null);
      if(mProducts != null) mProducts.setVisibility(View.INVISIBLE);
      if(mEmptyImage != null) mEmptyImage.setVisibility(View.VISIBLE);
      if(mEmptyText != null) mEmptyText.setVisibility(View.VISIBLE);
    }
  }

  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    ProductsGalleryCursorAdapter.ViewHolder holder = (ProductsGalleryCursorAdapter.ViewHolder)view.getTag();
    ContentValues values = new ContentValues();
    if(holder.inList.getVisibility() == View.VISIBLE) {
      values.put(Products.PRODUCT_INLIST, 0);
      values.put(Products.PRODUCT_CHECKED, 0);
      holder.inList.setVisibility(View.INVISIBLE);
    }
    else {
      values.put(Products.PRODUCT_INLIST, 1);
      holder.inList.setVisibility(View.VISIBLE);
    }
    getActivity().getContentResolver().update(Products.buildProductUri(id), values, null, null);
    reloadProducts();
  }

  @Override
  public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    // Respond to clicks on the actions in the CAB
        switch (item.getItemId()) {
          case R.id.menu_cab_products_share:
          if(mProductsGalleryController != null) {
            SparseBooleanArray checkedItems = mProducts.getCheckedItemPositions();
            for (int i = 0; i < checkedItems.size(); i++) {
          if(checkedItems.valueAt(i)) {
            Cursor c = mAdapter.getCursor();
            c.moveToPosition(checkedItems.keyAt(i));
            Product product = cupboard().withCursor(c).get(Product.class);
            mProductsGalleryController.shareProduct(product);
            break;
          }
        }
          }
            mode.finish(); // Action picked, so close the CAB
            return true;
            case R.id.menu_cab_products_edit:
              if(mProductsGalleryController != null) {
                SparseBooleanArray checkedItems = mProducts.getCheckedItemPositions();
                for (int i = 0; i < checkedItems.size(); i++) {
            if(checkedItems.valueAt(i)) {
              Cursor c = mAdapter.getCursor();
              c.moveToPosition(checkedItems.keyAt(i));
              Product product = cupboard().withCursor(c).get(Product.class);
              mProductsGalleryController.editProduct(product);
              break;
            }
          }
              }
                mode.finish(); // Action picked, so close the CAB
                return true;
            case R.id.menu_cab_products_set_category:
              if(mProductsGalleryController != null) {
                mProductsGalleryController.setProductsCategory(mProducts.getCheckedItemIds());
              }
                mode.finish(); // Action picked, so close the CAB
                return true;
            case R.id.menu_cab_products_delete:
              if(mProductsGalleryController != null) {
                long[] deletedItemIds = mProducts.getCheckedItemIds();
                mProductsGalleryController.deleteProducts(deletedItemIds);
              }
                mode.finish(); // Action picked, so close the CAB
                return true;
            default:
                return false;
        }
  }
  
  private ActionMode mActionMode;

  @Override
  public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    mActionMode = mode;
    // Inflate the menu for the CAB
        MenuInflater inflater = mode.getMenuInflater();
        inflater.inflate(R.menu.menu_cab_products, menu);
        return true;
  }

  @Override
  public void onDestroyActionMode(ActionMode mode) {
    mActionMode = null;
     // Here you can make any necessary updates to the activity when
        // the CAB is removed. By default, selected items are deselected/unchecked.
  }

  @Override
  public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    // Here you can perform updates to the CAB due to
        // an invalidate() request
    MenuItem editItem = mode.getMenu().findItem(R.id.menu_cab_products_edit);
    MenuItem setCategoryItem = mode.getMenu().findItem(R.id.menu_cab_products_set_category);
    MenuItem shareItem = mode.getMenu().findItem(R.id.menu_cab_products_share);
      if(mProducts.getCheckedItemCount() == 1) {
        shareItem.setEnabled(true);
        shareItem.setVisible(true);
        editItem.setVisible(true);
        editItem.setEnabled(true);
        setCategoryItem.setVisible(false);
        setCategoryItem.setEnabled(false);
      }
      else {
        shareItem.setEnabled(false);
        shareItem.setVisible(false);
        editItem.setVisible(false);
        editItem.setEnabled(false);
        setCategoryItem.setVisible(true);
        setCategoryItem.setEnabled(true);
      }
        return true;
  }

  @Override
  public void onItemCheckedStateChanged(ActionMode mode, int position,
      long id, boolean checked) {
    // Here you can do something when items are selected/de-selected,
        // such as update the title in the CAB
    int count = mProducts.getCheckedItemCount();
    if(checked && count == 2) mode.invalidate();
    else if (count == 1) mode.invalidate();
    Resources res = getResources();
      String text = String.format(res.getString(R.string.menu_cab_products_title), mProducts.getCheckedItemCount());
      mode.setTitle(text);
  }

  @Override
  public void closeActionMode() {
    if(mActionMode != null) mActionMode.finish();
  }
}




Java Source Code List

com.larswerkman.colorpicker.ColorPicker.java
com.larswerkman.colorpicker.OpacityBar.java
com.larswerkman.colorpicker.SVBar.java
com.larswerkman.colorpicker.SaturationBar.java
com.larswerkman.colorpicker.ValueBar.java
com.luboganev.dejalist.Utils.java
com.luboganev.dejalist.crop.CropActivity.java
com.luboganev.dejalist.crop.CropDialogSave.java
com.luboganev.dejalist.crop.CropHighlightView.java
com.luboganev.dejalist.crop.CropUtils.java
com.luboganev.dejalist.crop.CropView.java
com.luboganev.dejalist.crop.ImageViewTouchBase.java
com.luboganev.dejalist.crop.RotateBitmap.java
com.luboganev.dejalist.data.BackupIntentService.java
com.luboganev.dejalist.data.CacheManager.java
com.luboganev.dejalist.data.DejalistContract.java
com.luboganev.dejalist.data.DejalistDatabase.java
com.luboganev.dejalist.data.DejalistProvider.java
com.luboganev.dejalist.data.ProductImageFileHelper.java
com.luboganev.dejalist.data.SelectionBuilder.java
com.luboganev.dejalist.data.entities.Category.java
com.luboganev.dejalist.data.entities.Product.java
com.luboganev.dejalist.ui.AboutActivity.java
com.luboganev.dejalist.ui.CategoriesListCursorAdapter$ViewHolder$$ViewInjector.java
com.luboganev.dejalist.ui.CategoriesListCursorAdapter.java
com.luboganev.dejalist.ui.CategoryDialogFragment$$ViewInjector.java
com.luboganev.dejalist.ui.CategoryDialogFragment.java
com.luboganev.dejalist.ui.CheckableRelativeLayout.java
com.luboganev.dejalist.ui.ChecklistActionTaker.java
com.luboganev.dejalist.ui.ChecklistController.java
com.luboganev.dejalist.ui.ChecklistCursorAdapter$ViewHolder$$ViewInjector.java
com.luboganev.dejalist.ui.ChecklistCursorAdapter.java
com.luboganev.dejalist.ui.ChecklistFragment$$ViewInjector.java
com.luboganev.dejalist.ui.ChecklistFragment.java
com.luboganev.dejalist.ui.ConfirmBackResDialogFragment.java
com.luboganev.dejalist.ui.MainActivity$$ViewInjector.java
com.luboganev.dejalist.ui.MainActivity.java
com.luboganev.dejalist.ui.NavigationCursorAdapter$ViewHolder$$ViewInjector.java
com.luboganev.dejalist.ui.NavigationCursorAdapter.java
com.luboganev.dejalist.ui.ProductActivity$$ViewInjector.java
com.luboganev.dejalist.ui.ProductActivity.java
com.luboganev.dejalist.ui.ProductsGalleryActionTaker.java
com.luboganev.dejalist.ui.ProductsGalleryController.java
com.luboganev.dejalist.ui.ProductsGalleryCursorAdapter$ViewHolder$$ViewInjector.java
com.luboganev.dejalist.ui.ProductsGalleryCursorAdapter.java
com.luboganev.dejalist.ui.ProductsGalleryFragment$$ViewInjector.java
com.luboganev.dejalist.ui.ProductsGalleryFragment.java
com.luboganev.dejalist.ui.SetProductsCategoryDialogFragment.java
com.luboganev.dejalist.ui.UndoBarController.java