de.aw.monma.wertpapier.FragmentWertpapierUebersicht.java Source code

Java tutorial

Introduction

Here is the source code for de.aw.monma.wertpapier.FragmentWertpapierUebersicht.java

Source

/*
 * 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
    }
}