Java tutorial
/* * MonMa: Eine freie Android-Application fuer die Verwaltung privater Finanzen * * Copyright [2015] [Alexander Winkler, 2373 Dahme/Germany] * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; if * not, see <http://www.gnu.org/licenses/>. */ /** * */ package de.aw.monma.wertpapier; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v4.content.Loader; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView.LayoutManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.CheckedTextView; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import de.aw.awlib.activities.AWMainActivity; import de.aw.awlib.adapters.AWItemListAdapterTemplate; import de.aw.awlib.adapters.AWSortedItemListAdapter; import de.aw.awlib.bottomsheet.AWBottomSheetDialog; import de.aw.awlib.database.AbstractDBHelper; import de.aw.awlib.recyclerview.AWItemListRecyclerViewFragment; import de.aw.awlib.recyclerview.AWLibViewHolder; import de.aw.awlib.views.AWLoaderTextViewCurrencyValue; import de.aw.monma.BR; import de.aw.monma.R; import de.aw.monma.database.DBDefinition; import de.aw.monma.enums.WPUmsatzArt; import de.aw.monma.gv.Account; import de.aw.monma.gv.WPKurs; import de.aw.monma.gv.WertpapierBestand; import de.aw.monma.monmamain.MonMaInterface; import de.aw.monma.monmamain.MonMaResultCodes; import de.aw.monma.wertpapier.action.ActivityWPUmsatz; import de.aw.monma.wertpapier.dialoge.DialogKursaktualisierung; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.BESTAND; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.EINSTAND; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.GEWINN; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.GEWINNPERC; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.MARKTWERT; import static de.aw.monma.wertpapier.FragmentWertpapierUebersicht.SortOrders.NAME; /** * Zeigt Details zu Wertpapieren zu einem bestimmten Depot oder zu allen Depots */ public class FragmentWertpapierUebersicht extends AWItemListRecyclerViewFragment<WertpapierBestand> implements MonMaInterface, MonMaResultCodes, AWBottomSheetDialog.BottomSheetListener, View.OnClickListener, AWItemListAdapterTemplate.ItemGenerator<WertpapierBestand> { private final static int detailLayout = R.layout.wpbestand_item; private static final int layout = R.layout.wpbestand; private static final DBDefinition tbd = DBDefinition.WPBestand; private static final String[] projection = new String[] { column_accountID, column_accountname, column_btagkurs, column_kurs, column_partnername, column_wpkenn, _id, AbstractDBHelper.SQLSumItem(column_bestand_stfr), AbstractDBHelper.SQLSumItem(column_bestand), AbstractDBHelper.SQLSumItem(column_marktwert), AbstractDBHelper.SQLSumItem(column_marktwert_stfr), AbstractDBHelper.SQLSumItem(column_bruttoumsatz), AbstractDBHelper.SQLSumItem(column_einstand_stfr) }; private static final String groupBy = _id; private final String orderBy = column_partnername; private String selection = " NOT " + column_ausgeblendet; private Calendar KURSDATUM_ZU_ALT; private Integer mAccountID; private String[] selectionArgs; private List<WertpapierBestand> itemList; private SortOrders sortOrder = SortOrders.NAME; { KURSDATUM_ZU_ALT = Calendar.getInstance(); KURSDATUM_ZU_ALT.add(Calendar.DATE, -10); } public static FragmentWertpapierUebersicht newInstance(Integer accountID) { Bundle args = new Bundle(); FragmentWertpapierUebersicht f = new FragmentWertpapierUebersicht(); args.putInt(ACCOUNTID, accountID); f.setArguments(args); return f; } /** * @param c * Aktueller Cursor. Steht schon an der Stelle, die Daten fuer das erste Item * beinhaltet * * @return Liste aller Items, damit die sortierung auch klappt. */ @Override public WertpapierBestand createItem(Cursor c) { return new WertpapierBestand(tbd, c); } @Override protected AWItemListAdapterTemplate<WertpapierBestand> createListAdapter() { AWSortedItemListAdapter<WertpapierBestand> adapter = new AWSortedItemListAdapter<WertpapierBestand>( WertpapierBestand.class, this) { @Override protected boolean areContentsTheSame(WertpapierBestand item, WertpapierBestand other) { return false; } @Override protected boolean areItemsTheSame(WertpapierBestand item, WertpapierBestand other) { return item.getAccountID() == other.getAccountID() && item.getID() == other.getID(); } @Override protected int compare(WertpapierBestand item, WertpapierBestand other) { switch (sortOrder) { case NAME: String name = item.getWPName(); if (name != null) { return name.compareTo(other.getWPName()); } break; case BESTAND: return (item.getAsLong(column_bestand) > other.getAsLong(column_bestand)) ? -1 : 1; case MARKTWERT: return (item.getMarktwert() > other.getMarktwert()) ? -1 : 1; case EINSTAND: return (item.getBruttoumsatz() > other.getBruttoumsatz()) ? -1 : 1; case GEWINN: return (item.getGewinn() > other.getGewinn()) ? -1 : 1; case GEWINNPERC: long mGewinnPercent = 0; long oGewinnPercent = 0; if (item.getBruttoumsatz() != 0) { mGewinnPercent = item.getGewinn() * 10000 / item.getBruttoumsatz(); } if (other.getBruttoumsatz() != 0) { oGewinnPercent = other.getGewinn() * 10000 / other.getBruttoumsatz(); } return (mGewinnPercent > oGewinnPercent) ? -1 : 1; } return item.getIDAsInt() - other.getIDAsInt(); } @Override protected long getID(WertpapierBestand item) { return item.getID(); } }; adapter.setHasStableIds(true); return adapter; } @Override public LayoutManager getLayoutManager() { return new GridLayoutManager(getActivity(), maxRecyclerViewColumns()); } public void onAktualisiereKurse(View view) { WertpapierBestand item = getAdapter().getPendingChangedItem(); WPKurs kurs = new WPKurs(); kurs.put(column_wpid, item.getID()); kurs.setWPName(item.getWPName()); DialogKursaktualisierung dialog = DialogKursaktualisierung.newInstance(kurs); dialog.show(getFragmentManager(), dialog.TAG); getAdapter().cancelPendingChange(); } @Override public void onAttach(Context activity) { super.onAttach(activity); mAccountID = args.getInt(ACCOUNTID, NOID); startOrRestartLoader(layout, args); } @Override public void onBindViewHolder(AWLibViewHolder holder, WertpapierBestand item, int position) { holder.setVariable(BR.wpbestand, item); holder.setHandler(BR.handlers, this); } @Override public void onBottomSheetItemClick(int arrayID, int position, Bundle extras, CheckedTextView view) { Intent intent = new Intent(getActivity(), ActivityWPUmsatz.class); intent.putExtras(extras); switch (arrayID) { case R.array.bottomsheet_wp_action_allg: switch (position) { case 0: intent.putExtra(WPUMSATZART, WPUmsatzArt.Kauf); break; case 1: intent.putExtra(WPUMSATZART, WPUmsatzArt.OthrInc); break; case 2: intent.putExtra(WPUMSATZART, WPUmsatzArt.Ausgabe); break; case 3: intent.putExtra(WPUMSATZART, WPUmsatzArt.WP_Einlage); break; default: break; } break; case R.array.bottomsheet_wp_mitbestand_action: switch (position) { case 0: intent.putExtra(WPUMSATZART, WPUmsatzArt.Verkauf); break; case 1: intent.putExtra(WPUMSATZART, WPUmsatzArt.Payout); break; case 2: intent.putExtra(WPUMSATZART, WPUmsatzArt.Retshrs); break; case 3: intent.putExtra(WPUMSATZART, WPUmsatzArt.Ausgabe); break; case 4: intent.putExtra(WPUMSATZART, WPUmsatzArt.WP_Splitt); break; case 5: intent.putExtra(WPUMSATZART, WPUmsatzArt.WP_Entnahme); break; } break; } startActivity(intent); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.awlib_defaultFAB: AWBottomSheetDialog dlg = new AWBottomSheetDialog(getActivity(), R.array.bottomsheet_wp_action_allg); Bundle extra = new Bundle(); extra.putParcelable(ACTION, Action.DoWertpapierUmsatz); extra.putInt(ACCOUNTID, mAccountID); dlg.setExtras(extra); dlg.setItemClickListener(this); dlg.setTitle(R.string.tvWPName); dlg.show(); break; default: } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_wp_uebersicht, menu); } public void onEditKurse(View view) { WertpapierBestand item = getAdapter().getPendingChangedItem(); FragmentWertpapierKurseListe f = FragmentWertpapierKurseListe.newInstance(item); replaceFragment(f); getAdapter().cancelPendingChange(); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { super.onLoadFinished(loader, cursor); itemList = new ArrayList<>(); if (cursor.moveToFirst()) { do { WertpapierBestand model = new WertpapierBestand(tbd, cursor); itemList.add(model); } while (cursor.moveToNext()); } getAdapter().swap(itemList); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_item_sortieren_name: sortOrder = NAME; break; case R.id.menu_item_sortieren_bestand: sortOrder = BESTAND; break; case R.id.menu_item_sortieren_marktwert: sortOrder = MARKTWERT; break; case R.id.menu_item_sortieren_einstandspreis: sortOrder = EINSTAND; break; case R.id.menu_item_sortieren_gewinn: sortOrder = GEWINN; break; case R.id.menu_item_sortieren_gewinn_perc: sortOrder = GEWINNPERC; break; default: return super.onOptionsItemSelected(item); } item.setChecked(true); getAdapter().swap(itemList); return true; } @Override public void onPause() { super.onPause(); if (mAccountID != NOID) { FloatingActionButton fab = ((AWMainActivity) getActivity()).getDefaultFAB(); fab.setVisibility(View.GONE); fab.setOnClickListener(null); } } /** * Erstellt bei click auf ein Item ein PopUpMenu. Jedes Menu erhaelt einen Intent mit folgenden * Extras:<br> - WPID: WPID, die ausgewaehlt wurde<br> - WPNAME: Wertpaiername zur ID<br> - * ACCOUNTID: AccountID, die angezeigt wird. Kein PopUp bei Onlinekonten */ @Override public void onRecyclerItemClick(View view, int position, WertpapierBestand item) { switch (view.getId()) { case R.id.wpBestand_Items: getAdapter().setPendingChangedItem(item, R.layout.wpliste_item_click); default: super.onRecyclerItemClick(view, position, item); } } /** * Aufbau PopupMenu fuer Buchung. Bei Klick auf eines dieser Menuitems wird die * ActivityWertpapiere gestartet, die die entsprechenden Aktionen durchfuehrt, wenn es sich * nicht um ein Online-Depot handelt. */ @Override public boolean onRecyclerItemLongClick(View view, int position, WertpapierBestand item) { switch (view.getId()) { case R.id.wpBestand_Items: if (mAccountID != NOID) { Bundle extra = new Bundle(); AWBottomSheetDialog dlg = new AWBottomSheetDialog(getContext(), R.array.bottomsheet_wp_mitbestand_action); extra.putParcelable(ACTION, Action.DoWertpapierUmsatz); extra.putInt(ACCOUNTID, mAccountID); extra.putLong(WPID, item.getID()); dlg.setExtras(extra); dlg.setItemClickListener(this); dlg.setTitle(item.getWPName()); dlg.show(); } return true; default: return super.onRecyclerItemLongClick(view, position, item); } } @Override public void onResume() { super.onResume(); if (mAccountID != NOID) { setTitle(Account.getAccountName(mAccountID)); } else { setTitle(R.string.tvPaketeAlleDepots); } if (mAccountID != NOID) { FloatingActionButton fab = ((AWMainActivity) getActivity()).getDefaultFAB(); fab.setVisibility(View.VISIBLE); fab.setOnClickListener(this); } } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); AWLoaderTextViewCurrencyValue ltv = view.findViewById(R.id.tvGesamtMarktwert); ltv.initialize(getLoaderManager(), tbd, AbstractDBHelper.SQLSumItem(column_marktwert), selection, selectionArgs); } public void onZeigePakete(View view) { WertpapierBestand item = getAdapter().getPendingChangedItem(); FragmentWPPaketListe f = FragmentWPPaketListe.newInstance(mAccountID, item.getID(), new Bundle()); replaceFragment(f); setSubTitle(item.getWPName()); getAdapter().cancelPendingChange(); } public void onZeigeUmsaetze(View view) { WertpapierBestand item = getAdapter().getPendingChangedItem(); FragmentWertpapierBuchungenListe f = FragmentWertpapierBuchungenListe.newInstance(mAccountID, item.getID(), item.getWPName()); replaceFragment(f); getAdapter().cancelPendingChange(); } @Override public void setCursorLoaderArguments(int id, Bundle args) { if (mAccountID != NOID) { selection += " AND " + column_accountID + " = ? "; selectionArgs = new String[] { mAccountID.toString() }; args.putStringArray(SELECTIONARGS, selectionArgs); } args.putString(SELECTION, selection); } @Override protected void setInternalArguments(Bundle args) { super.setInternalArguments(args); args.putParcelable(DBDEFINITION, tbd); args.putStringArray(PROJECTION, projection); args.putInt(LAYOUT, layout); args.putInt(VIEWHOLDERLAYOUT, detailLayout); args.putString(SELECTION, selection); args.putString(ORDERBY, orderBy); args.putString(GROUPBY, groupBy); } public enum SortOrders { NAME, BESTAND, MARKTWERT, EINSTAND, GEWINN, GEWINNPERC } }