package com.databases.example.features.checkbook.accounts; import android.content.Context; import android.content.SharedPreferences; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.preference.PreferenceManager; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.util.SparseBooleanArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.databases.example.R; import com.databases.example.app.RecyclerViewListener; import com.databases.example.utils.DateTime; import com.databases.example.utils.Money; import java.util.ArrayList; import java.util.Locale; import timber.log.Timber; public class AccountsRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int VIEW_TYPE_EMPTY = 0; private final int VIEW_TYPE_NORMAL = 1; public final Context context; public ArrayList<Account> accounts; private final RecyclerViewListener onItemClickListener; private SparseBooleanArray mSelectedItemsIds; public SharedPreferences prefs; public boolean useDefaults; public AccountsRecyclerViewAdapter(Context context, ArrayList<Account> accounts, RecyclerViewListener onItemClickListener) { this.context = context; this.accounts = accounts; this.onItemClickListener = onItemClickListener; mSelectedItemsIds = new SparseBooleanArray(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //For Custom View Properties prefs = PreferenceManager.getDefaultSharedPreferences(context); useDefaults = prefs.getBoolean(context.getString(R.string.pref_key_account_default_appearance), true); if (viewType == VIEW_TYPE_EMPTY) { TextView view = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.list_empty, parent, false); return new ViewHolderEmpty(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.account_item, parent, false); return new ViewHolder(context, view, prefs, useDefaults); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder genericHolder, int position) { switch (genericHolder.getItemViewType()) { case VIEW_TYPE_NORMAL: ViewHolder holder = (ViewHolder) genericHolder; Account account = accounts.get(position); Money balance = new Money(account.balance); Locale locale = context.getResources().getConfiguration().locale; //Change gradient try { //Older color to black gradient (0xFF00FF33,0xFF000000) GradientDrawable defaultGradientPos = new GradientDrawable( GradientDrawable.Orientation.BOTTOM_TOP, new int[]{0xFF4ac925, 0xFF4ac925}); GradientDrawable defaultGradientNeg = new GradientDrawable( GradientDrawable.Orientation.BOTTOM_TOP, new int[]{0xFFe00707, 0xFFe00707}); if (useDefaults) { if (balance.isPositive(locale)) { holder.sideBar.setBackgroundDrawable(defaultGradientPos); } else { holder.sideBar.setBackgroundDrawable(defaultGradientNeg); } } else { if (balance.isPositive(locale)) { holder.sideBar.setBackgroundDrawable(defaultGradientPos); } else { holder.sideBar.setBackgroundDrawable(defaultGradientNeg); } } } catch (Exception e) { Timber.e("Error setting custom gradient"); e.printStackTrace(); Toast.makeText(context, "Could Not Set Custom gradient", Toast.LENGTH_SHORT).show(); } if (account.name != null) { holder.tvName.setText(account.name); } if (balance != null) { holder.tvBalance.setText(context.getString(R.string.balance) + ": " + balance.getNumberFormat(locale)); } if (account.date != null) { DateTime d = new DateTime(); d.setStringSQL(account.date); holder.tvDate.setText(context.getString(R.string.date) + ": " + d.getReadableDate()); } if (account.time != null) { DateTime t = new DateTime(); t.setStringSQL(account.time); holder.tvTime.setText(context.getString(R.string.time) + ": " + t.getReadableTime()); } holder.setOnItemClickListener(account, onItemClickListener); if (position == AccountsFragment.currentAccount && AccountsFragment.mActionMode == null) { holder.view.setBackgroundColor(0x7734B5E4); } else if (mSelectedItemsIds.get(position)) { holder.view.setBackgroundColor(0x9934B5E4); } else { holder.view.setBackgroundColor(Color.TRANSPARENT); } break; case VIEW_TYPE_EMPTY: ViewHolderEmpty holderEmpty = (ViewHolderEmpty) genericHolder; holderEmpty.view.setText("No Accounts\n\nTo Add An Account, Please Use The ActionBar On The Top"); break; } } @Override public int getItemCount() { if (accounts == null || accounts.isEmpty()) { return 1; //return 1 to show the empty view } return accounts.size(); } @Override public int getItemViewType(int position) { if (accounts == null || accounts.size() == 0) { return VIEW_TYPE_EMPTY; } else { return VIEW_TYPE_NORMAL; } } public void toggleSelection(int position) { selectView(position, !mSelectedItemsIds.get(position)); } public void removeSelection() { mSelectedItemsIds = new SparseBooleanArray(); notifyDataSetChanged(); } private void selectView(int position, boolean value) { if (value) mSelectedItemsIds.put(position, value); else mSelectedItemsIds.delete(position); notifyDataSetChanged(); } public int getSelectedCount() { return mSelectedItemsIds.size(); } public SparseBooleanArray getSelectedIds() { return mSelectedItemsIds; } private Context getContext() { return context; } public Account getAccount(int position) { return accounts.get(position); } public ArrayList<Account> getAccounts() { return accounts; } public void setAccounts(ArrayList<Account> accounts) { this.accounts = accounts; notifyDataSetChanged(); } public static class ViewHolder extends RecyclerView.ViewHolder { public View view; public View layout; public LinearLayout sideBar; public TextView tvName; public TextView tvBalance; public TextView tvDate; public TextView tvTime; public ViewHolder(final Context context, final View view, final SharedPreferences prefs, final boolean useDefaults) { super(view); this.view = view; layout = view.findViewById(R.id.account_layout); sideBar = (LinearLayout) view.findViewById(R.id.account_gradient); tvName = (TextView) view.findViewById(R.id.account_name); tvBalance = (TextView) view.findViewById(R.id.account_balance); tvDate = (TextView) view.findViewById(R.id.account_date); tvTime = (TextView) view.findViewById(R.id.account_time); //Change Background Colors try { if (!useDefaults) { int startColor = prefs.getInt(context.getString(R.string.pref_key_account_start_background_color), ContextCompat.getColor(context, R.color.white)); int endColor = prefs.getInt(context.getString(R.string.pref_key_account_end_background_color), ContextCompat.getColor(context, R.color.white)); GradientDrawable defaultGradient = new GradientDrawable( GradientDrawable.Orientation.BOTTOM_TOP, new int[]{startColor, endColor}); layout.setBackgroundDrawable(defaultGradient); } } catch (Exception e) { Toast.makeText(context, "Could Not Set Custom Background Color", Toast.LENGTH_SHORT).show(); } //Change Size of main field try { String DefaultSize = prefs.getString(context.getString(R.string.pref_key_account_name_size), "24"); if (useDefaults) { tvName.setTextSize(24); } else { tvName.setTextSize(Integer.parseInt(DefaultSize)); } } catch (Exception e) { Toast.makeText(context, "Could Not Set Custom Name Size", Toast.LENGTH_SHORT).show(); } try { int DefaultColor = prefs.getInt(context.getString(R.string.pref_key_account_name_color), ContextCompat.getColor(context, R.color.account_title_default)); if (useDefaults) { tvName.setTextColor(ContextCompat.getColor(context, R.color.account_title_default)); } else { tvName.setTextColor(DefaultColor); } } catch (Exception e) { Toast.makeText(context, "Could Not Set Custom Name Size", Toast.LENGTH_SHORT).show(); } try { String DefaultSize = prefs.getString(context.getString(R.string.pref_key_account_details_size), "14"); if (useDefaults) { tvBalance.setTextSize(14); tvDate.setTextSize(14); tvTime.setTextSize(14); } else { tvBalance.setTextSize(Integer.parseInt(DefaultSize)); tvDate.setTextSize(Integer.parseInt(DefaultSize)); tvTime.setTextSize(Integer.parseInt(DefaultSize)); } } catch (Exception e) { Toast.makeText(context, "Could Not Set Custom Field Size", Toast.LENGTH_SHORT).show(); } try { int DefaultColor = prefs.getInt(context.getString(R.string.pref_key_account_details_color), ContextCompat.getColor(context, R.color.account_details_default)); if (useDefaults) { tvBalance.setTextColor(ContextCompat.getColor(context, R.color.account_details_default)); tvDate.setTextColor(ContextCompat.getColor(context, R.color.account_details_default)); tvTime.setTextColor(ContextCompat.getColor(context, R.color.account_details_default)); } else { tvBalance.setTextColor(DefaultColor); tvDate.setTextColor(DefaultColor); tvTime.setTextColor(DefaultColor); } } catch (Exception e) { Toast.makeText(context, "Could Not Set Custom Field Color", Toast.LENGTH_SHORT).show(); } //For User-Defined Field Visibility if (useDefaults || prefs.getBoolean(context.getString(R.string.pref_key_account_name_show), true)) { tvName.setVisibility(View.VISIBLE); } else { tvName.setVisibility(View.GONE); } if (useDefaults || prefs.getBoolean(context.getString(R.string.pref_key_account_balance_show), true)) { tvBalance.setVisibility(View.VISIBLE); } else { tvBalance.setVisibility(View.GONE); } if (useDefaults || prefs.getBoolean(context.getString(R.string.pref_key_account_date_show), true)) { tvDate.setVisibility(View.VISIBLE); } else { tvDate.setVisibility(View.GONE); } if (prefs.getBoolean(context.getString(R.string.pref_key_account_time_show), false) && !useDefaults) { tvTime.setVisibility(View.VISIBLE); } else { tvTime.setVisibility(View.GONE); } } public void setOnItemClickListener(final Account account, final RecyclerViewListener onItemClickListener) { view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClick(account, getAdapterPosition()); } }); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { return onItemClickListener.onItemLongClick(account, getAdapterPosition()); } }); } } public static class ViewHolderEmpty extends RecyclerView.ViewHolder { public TextView view; public ViewHolderEmpty(final TextView view) { super(view); this.view = view; } } }