package org.openintents.shopping.ui; import android.app.Activity; import android.app.LoaderManager; import android.content.Context; import android.content.CursorLoader; import android.content.Loader; import android.database.Cursor; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import org.openintents.shopping.R; import org.openintents.shopping.library.provider.ShoppingContract; import org.openintents.shopping.ui.widget.ShoppingItemsView; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.Locale; public class ShoppingTotalsHandler implements LoaderManager.LoaderCallbacks<Cursor>{ private final static String TAG = "ShoppingTotalsHandler"; private final static boolean debug = false; private Activity mActivity; private ShoppingItemsView mItemsView; private CursorLoader mCursorLoader; private long mListId; private TextView mTotalTextView; private TextView mPriTotalTextView; private TextView mTotalCheckedTextView; private TextView mCountTextView; private NumberFormat mPriceFormatter = DecimalFormat.getNumberInstance(Locale.ENGLISH); public ShoppingTotalsHandler(ShoppingItemsView view) { mItemsView = view; mActivity = (Activity) view.getContext(); mTotalCheckedTextView = (TextView) mActivity.findViewById(R.id.total_1); mTotalTextView = (TextView) mActivity.findViewById(R.id.total_2); mPriTotalTextView = (TextView) mActivity.findViewById(R.id.total_3); mCountTextView = (TextView) mActivity.findViewById(R.id.count); mPriceFormatter.setMaximumFractionDigits(2); mPriceFormatter.setMinimumFractionDigits(2); } public void update(LoaderManager manager, long listId) { if (mCursorLoader == null) { mListId = listId; mCursorLoader = (CursorLoader) manager.initLoader(ShoppingActivity.LOADER_TOTALS, null, this ); } else { if (mListId != listId) { mListId = listId; mCursorLoader.setUri(ShoppingContract.Subtotals.CONTENT_URI.buildUpon().appendPath(Long.toString(mListId)).build()); } manager.restartLoader(ShoppingActivity.LOADER_TOTALS , null, this); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { CursorLoader loader = new CursorLoader(mActivity); loader.setProjection(ShoppingContract.Subtotals.PROJECTION); loader.setUri(ShoppingContract.Subtotals.CONTENT_URI.buildUpon().appendPath(Long.toString(mListId)).build()); return loader; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor total_cursor) { long total = 0; long totalchecked = 0; long priority_total = 0; int priority_threshold = PreferenceActivity.getSubtotalByPriorityThreshold(mActivity); boolean prioIncludesChecked = PreferenceActivity.prioritySubtotalIncludesChecked(mActivity); int numChecked = 0, numUnchecked = 0; total_cursor.moveToPosition(-1); while (total_cursor.moveToNext()) { long item_status = total_cursor.getLong(ShoppingContract.Subtotals.STATUS_INDEX); boolean isChecked = (item_status == ShoppingContract.Status.BOUGHT); if (item_status == ShoppingContract.Status.REMOVED_FROM_LIST) { continue; } long price = total_cursor.getLong(ShoppingContract.Subtotals.SUBTOTAL_INDEX); total += price; if (isChecked) { totalchecked += price; numChecked += total_cursor.getLong(ShoppingContract.Subtotals.COUNT_INDEX); } else if (item_status == ShoppingContract.Status.WANT_TO_BUY) { numUnchecked += total_cursor.getLong(ShoppingContract.Subtotals.COUNT_INDEX); } if (priority_threshold != 0 && (prioIncludesChecked || !isChecked)) { String priority_str = total_cursor.getString(ShoppingContract.Subtotals.PRIORITY_INDEX); if (priority_str != null) { int priority = 0; try { priority = Integer.parseInt(priority_str); } catch (NumberFormatException e) { // pretend it's a 0 then... } if (priority != 0 && priority <= priority_threshold) { priority_total += price; } } } } if (debug) { Log.d(TAG, "Total: " + total + ", Checked: " + totalchecked + "(#" + numChecked + ")"); } mItemsView.updateNumChecked(numChecked, numUnchecked); if (mTotalTextView == null || mTotalCheckedTextView == null) { // Most probably in "Add item" mode where no total is displayed return; } if (mItemsView.mPriceVisibility != View.VISIBLE) { // If price is not displayed, do not display total mTotalTextView.setVisibility(View.GONE); mPriTotalTextView.setVisibility(View.GONE); mTotalCheckedTextView.setVisibility(View.GONE); return; } mTotalTextView.setTextColor(mItemsView.mTextColorPrice); mPriTotalTextView.setTextColor(mItemsView.mTextColorPrice); mTotalCheckedTextView.setTextColor(mItemsView.mTextColorPrice); mCountTextView.setTextColor(mItemsView.mTextColorPrice); if (total != 0) { String s = mPriceFormatter.format(total * 0.01d); s = mActivity.getString(R.string.total, s); mTotalTextView.setText(s); mTotalTextView.setVisibility(View.VISIBLE); } else { mTotalTextView.setVisibility(View.GONE); } if (priority_total != 0) { final int[] captions = {0, R.string.priority1_total, R.string.priority2_total, R.string.priority3_total, R.string.priority4_total}; String s = mPriceFormatter.format(priority_total * 0.01d); s = mActivity.getString(captions[priority_threshold], s); mPriTotalTextView.setText(s); mPriTotalTextView.setVisibility(View.VISIBLE); } else { mPriTotalTextView.setVisibility(View.GONE); } if (totalchecked != 0) { String s = mPriceFormatter.format(totalchecked * 0.01d); s = mActivity.getString(R.string.total_checked, s); mTotalCheckedTextView.setText(s); mTotalCheckedTextView.setVisibility(View.VISIBLE); mCountTextView.setVisibility(View.VISIBLE); } else { mTotalCheckedTextView.setVisibility(View.GONE); mCountTextView.setVisibility(View.GONE); } mCountTextView.setText("#" + numChecked); } @Override public void onLoaderReset(Loader<Cursor> loader) { } }