com.money.manager.ex.assetallocation.editor.AssetAllocationEditorActivity.java Source code

Java tutorial

Introduction

Here is the source code for com.money.manager.ex.assetallocation.editor.AssetAllocationEditorActivity.java

Source

/*
 * Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
 *
 * 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 com.money.manager.ex.assetallocation.editor;

import android.content.Intent;
import android.os.Bundle;
import android.app.Activity;
import android.os.Handler;
import android.os.Looper;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import com.crashlytics.android.answers.Answers;
import com.crashlytics.android.answers.CustomEvent;
import com.mikepenz.google_material_typeface_library.GoogleMaterial;
import com.mikepenz.iconics.IconicsDrawable;
import com.money.manager.ex.R;
import com.money.manager.ex.assetallocation.AssetAllocationContentsFragment;
import com.money.manager.ex.assetallocation.AssetAllocationLoader;
import com.money.manager.ex.assetallocation.ItemType;
import com.money.manager.ex.assetallocation.UIHelpers;
import com.money.manager.ex.assetallocation.events.AssetAllocationReloadRequestedEvent;
import com.money.manager.ex.assetallocation.events.AssetClassSelectedEvent;
import com.money.manager.ex.common.MmxBaseFragmentActivity;
import com.money.manager.ex.core.NumericHelper;
import com.money.manager.ex.core.UIHelper;
import com.money.manager.ex.core.AnswersEvents;
import com.money.manager.ex.currency.list.CurrencyListActivity;
import com.money.manager.ex.currency.CurrencyService;
import com.money.manager.ex.domainmodel.AssetClass;
import com.money.manager.ex.servicelayer.AssetAllocationService;

import org.greenrobot.eventbus.Subscribe;
import org.parceler.Parcels;

import java.util.List;

/**
 * Asset Allocation editor. Displays one level of asset classes and allows adding and removing
 * asset classes in the allocation.
 */
public class AssetAllocationEditorActivity extends MmxBaseFragmentActivity {

    public static final String KEY_ASSET_ALLOCATION = "assetAllocation";

    private static final int LOADER_ASSET_ALLOCATION = 1;

    private AssetClass assetAllocation;
    LoaderManager.LoaderCallbacks<AssetClass> mLoaderCallbacks;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.base_toolbar_activity);

        Toolbar toolbar = getToolbar();
        if (toolbar != null) {
            setSupportActionBar(toolbar);
            showStandardToolbarActions();
            // change home icon to 'back'.
            setDisplayHomeAsUpEnabled(true);
        }

        if (savedInstanceState != null) {
            // use existing asset allocation
            this.assetAllocation = Parcels.unwrap(savedInstanceState.getParcelable(KEY_ASSET_ALLOCATION));
        } else {
            // Load asset allocation
            // Ref: http://developer.android.com/guide/components/loaders.html
            mLoaderCallbacks = setUpLoaderCallbacks();
            getSupportLoaderManager().initLoader(LOADER_ASSET_ALLOCATION, null, mLoaderCallbacks);
        }

        Answers.getInstance().logCustom(new CustomEvent(AnswersEvents.AssetAllocation.name()));
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putParcelable(KEY_ASSET_ALLOCATION, Parcels.wrap(this.assetAllocation));
    }

    // Menu

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);

        getMenuInflater().inflate(R.menu.menu_asset_allocation_editor, menu);

        // customize icons

        UIHelper ui = new UIHelper(this);

        // Currencies
        MenuItem currenciesMenu = menu.findItem(R.id.menu_currencies);
        if (currenciesMenu != null) {
            IconicsDrawable icon = ui.getIcon(GoogleMaterial.Icon.gmd_euro_symbol);
            currenciesMenu.setIcon(icon);
        }

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Intent intent;

        switch (item.getItemId()) {
        case android.R.id.home:
            setResultAndFinish();
            break;

        case R.id.menu_currencies:
            // open the Currencies activity.
            intent = new Intent(this, CurrencyListActivity.class);
            intent.setAction(Intent.ACTION_EDIT);
            startActivity(intent);
            break;

        default:
            return super.onOptionsItemSelected(item);
        }
        return true;
    }

    // Events

    @Subscribe
    public void onEvent(AssetAllocationReloadRequestedEvent event) {
        // reload Asset Allocation
        getSupportLoaderManager().restartLoader(LOADER_ASSET_ALLOCATION, null, mLoaderCallbacks);
    }

    @Subscribe
    public void onEvent(AssetClassSelectedEvent event) {
        AssetAllocationService service = new AssetAllocationService(this);
        AssetClass toShow = service.findChild(event.assetClassId, this.assetAllocation);

        ItemType selectedType = toShow.getType();
        switch (selectedType) {
        case Cash:
            // ignore
            break;
        default:
            showAssetClass(toShow);
            break;
        }
    }

    // Private

    private void setResultAndFinish() {
        setResult(Activity.RESULT_OK);
        finish();
    }

    private void refreshCurrentFragment() {
        AssetAllocationContentsFragment fragment = (AssetAllocationContentsFragment) UIHelpers
                .getVisibleFragment(this);
        if (fragment == null)
            return;

        fragment.showData();
    }

    private void refreshDataInFragments(AssetClass assetAllocation) {
        // iterate through all the fragments and update the asset allocation reference.
        List<Fragment> allFragments = getSupportFragmentManager().getFragments();
        if (allFragments == null)
            return;

        for (Fragment fragment : allFragments) {
            AssetAllocationContentsFragment f = (AssetAllocationContentsFragment) fragment;
            if (f == null)
                continue;

            Bundle args = f.getArguments();
            if (args != null) {
                args.putParcelable(KEY_ASSET_ALLOCATION, Parcels.wrap(assetAllocation));
            }
        }

        refreshCurrentFragment();
    }

    private LoaderManager.LoaderCallbacks<AssetClass> setUpLoaderCallbacks() {
        return new LoaderManager.LoaderCallbacks<AssetClass>() {
            @Override
            public Loader<AssetClass> onCreateLoader(int id, Bundle args) {
                return new AssetAllocationLoader(AssetAllocationEditorActivity.this);
            }

            @Override
            public void onLoadFinished(Loader<AssetClass> loader, final AssetClass data) {
                AssetAllocationEditorActivity.this.assetAllocation = data;

                // Create handler to perform showing of fragment(s).
                Handler h = new Handler(Looper.getMainLooper());
                Runnable runnable = new Runnable() {
                    public void run() {
                        showAssetClass(data);
                    }
                };

                // show the data
                AssetAllocationContentsFragment fragment = (AssetAllocationContentsFragment) UIHelpers
                        .getVisibleFragment(AssetAllocationEditorActivity.this);
                // If there are no other fragments, create the initial view.
                if (fragment == null) {
                    h.post(runnable);
                } else {
                    // Otherwise, find the fragment and update the data.
                    //                    refreshDataInFragment(data);
                    refreshDataInFragments(data);
                }
            }

            @Override
            public void onLoaderReset(Loader<AssetClass> loader) {
                // adapter swap cursor?
            }
        };
    }

    private void showAssetClass(AssetClass assetClass) {
        if (assetClass == null)
            return;

        // Round to decimals from the base currency.
        CurrencyService currencyService = new CurrencyService(this);
        int scale = currencyService.getBaseCurrency().getScale();
        int decimals = new NumericHelper(this).getNumberOfDecimals(scale);

        // show the fragment
        FragmentManager fm = getSupportFragmentManager();
        AssetAllocationContentsFragment fragment = AssetAllocationContentsFragment.create(assetClass.getId(),
                decimals, this.assetAllocation);

        String tag = assetClass.getId() != null ? assetClass.getId().toString() : "root";

        FragmentTransaction transaction = fm.beginTransaction();

        if (fm.findFragmentById(R.id.content) == null) {
            tag = AssetAllocationContentsFragment.class.getSimpleName();

            //            transaction.add(R.id.content, fragment, tag)
            transaction.replace(R.id.content, fragment, tag).commit();
            // the initial fragment does not go onto back stack.
        } else {
            // Replace existing fragment. Always use replace instead of add?
            transaction.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left, R.anim.slide_in_right,
                    R.anim.slide_out_left);
            transaction.replace(R.id.content, fragment, tag);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    }
}