com.money.manager.ex.settings.PerDatabaseFragment.java Source code

Java tutorial

Introduction

Here is the source code for com.money.manager.ex.settings.PerDatabaseFragment.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.settings;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.preference.ListPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceFragmentCompat;
import android.text.TextUtils;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.money.manager.ex.Constants;
import com.money.manager.ex.MoneyManagerApplication;
import com.money.manager.ex.R;
import com.money.manager.ex.core.Core;
import com.money.manager.ex.core.InfoKeys;
import com.money.manager.ex.core.UIHelper;
import com.money.manager.ex.currency.CurrencyService;
import com.money.manager.ex.currency.list.CurrencyListActivity;
import com.money.manager.ex.datalayer.AccountRepository;
import com.money.manager.ex.domainmodel.Account;
import com.money.manager.ex.domainmodel.Currency;
import com.money.manager.ex.servicelayer.AccountService;
import com.money.manager.ex.servicelayer.InfoService;

import org.apache.commons.lang3.math.NumberUtils;

import java.util.List;

import timber.log.Timber;

/**
 * A simple {@link Fragment} subclass.
 */
public class PerDatabaseFragment extends PreferenceFragmentCompat {

    public static final int REQUEST_PICK_CURRENCY = 1;

    public PerDatabaseFragment() {
        // Required empty public constructor
    }

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

    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        addPreferencesFromResource(R.xml.preferences_per_database);

        initializeControls();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
        case REQUEST_PICK_CURRENCY:
            // Returning from the currency picker screen.
            if ((resultCode == Activity.RESULT_OK) && (data != null)) {
                int currencyId = data.getIntExtra(CurrencyListActivity.INTENT_RESULT_CURRENCYID, -1);
                // set preference
                CurrencyService utils = new CurrencyService(getActivity());
                utils.setBaseCurrencyId(currencyId);
                // refresh the displayed value.
                showCurrentDefaultCurrency();

                // notify the user to update exchange rates!
                showCurrencyChangeNotification();
            }
            break;
        }
    }

    private void initializeControls() {
        final InfoService infoService = new InfoService(getActivity());

        // Username

        final Preference pUserName = findPreference(getString(R.string.pref_user_name));
        if (pUserName != null) {
            pUserName.setSummary(MoneyManagerApplication.getApp().getUserName());
            pUserName.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    MoneyManagerApplication.getApp().setUserName((String) newValue, true);
                    pUserName.setSummary(MoneyManagerApplication.getApp().getUserName());
                    return false;
                }
            });
        }

        // Date format

        final ListPreference lstDateFormat = (ListPreference) findPreference(getString(R.string.pref_date_format));
        if (lstDateFormat != null) {
            lstDateFormat.setEntries(getResources().getStringArray(R.array.date_format));
            lstDateFormat.setEntryValues(getResources().getStringArray(R.array.date_format_mask));
            //set summary
            String value = infoService.getInfoValue(InfoKeys.DATEFORMAT);
            lstDateFormat.setSummary(getDateFormatFromMask(value));
            lstDateFormat.setValue(value);

            //on change
            lstDateFormat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    if (infoService.setInfoValue(InfoKeys.DATEFORMAT, (String) newValue)) {
                        lstDateFormat.setSummary(getDateFormatFromMask((String) newValue));
                    }
                    // Do not update to preferences file.
                    return false;
                }
            });
        }

        // Base Currency

        initBaseCurrency();

        // financial year, day and month

        final Preference pFinancialDay = findPreference(
                getString(PreferenceConstants.PREF_FINANCIAL_YEAR_STARTDATE));
        if (pFinancialDay != null) {
            pFinancialDay.setSummary(infoService.getInfoValue(InfoKeys.FINANCIAL_YEAR_START_DAY));
            if (pFinancialDay.getSummary() != null) {
                pFinancialDay.setDefaultValue(pFinancialDay.getSummary().toString());
            }

            pFinancialDay.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    int day;
                    try {
                        day = Integer.parseInt((String) newValue);
                    } catch (NumberFormatException e) {
                        new UIHelper(getActivity()).showToast(R.string.error_parsing_value);
                        return false;
                    }

                    try {
                        if (day < 1 || day > 31) {
                            return false;
                        }
                        if (infoService.setInfoValue(InfoKeys.FINANCIAL_YEAR_START_DAY, Integer.toString(day))) {
                            pFinancialDay.setSummary(Integer.toString(day));
                        }
                        //                        return true;
                    } catch (Exception e) {
                        Timber.e(e, "changing the start day of the financial year");
                    }
                    return false;
                }
            });
        }

        final Core core = new Core(getActivity().getApplicationContext());

        // Financial year/month

        final ListPreference lstFinancialMonth = (ListPreference) findPreference(
                getString(PreferenceConstants.PREF_FINANCIAL_YEAR_STARTMONTH));
        if (lstFinancialMonth != null) {
            lstFinancialMonth.setEntries(core.getListMonths());
            lstFinancialMonth
                    .setEntryValues(new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" });
            lstFinancialMonth.setDefaultValue("0");
            // get current month
            try {
                String currentMonth = infoService.getInfoValue(InfoKeys.FINANCIAL_YEAR_START_MONTH);
                if ((!TextUtils.isEmpty(currentMonth)) && NumberUtils.isNumber(currentMonth)) {
                    int month = Integer.parseInt(currentMonth) - 1;
                    if (month > -1 && month < lstFinancialMonth.getEntries().length) {
                        lstFinancialMonth.setSummary(lstFinancialMonth.getEntries()[month]);
                        lstFinancialMonth.setValue(Integer.toString(month));
                    }
                }
            } catch (Exception e) {
                Timber.e(e, "showing the month of the financial year");
            }
            lstFinancialMonth.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

                @Override
                public boolean onPreferenceChange(Preference preference, Object newValue) {
                    try {
                        int value = Integer.parseInt(newValue.toString());
                        if (value > -1 && value < lstFinancialMonth.getEntries().length) {
                            if (infoService.setInfoValue(InfoKeys.FINANCIAL_YEAR_START_MONTH,
                                    Integer.toString(value + 1))) {
                                lstFinancialMonth.setSummary(lstFinancialMonth.getEntries()[value]);
                                //                                return true;
                            }
                        }
                    } catch (Exception e) {
                        Timber.e(e, "changing the month of the financial year");
                        //                        return false;
                    }
                    return false;
                }
            });
        }

        initDefaultAccount();
    }

    /**
     * select the base currency in a currency picker instead of a list.
     */
    private void initBaseCurrency() {
        Preference baseCurrency = findPreference(getString(PreferenceConstants.PREF_BASE_CURRENCY));
        if (baseCurrency == null)
            return;

        // Display the current default currency as the summary.
        showCurrentDefaultCurrency();

        // After the currency is selected in the Currencies screen, the change is handled
        // in onActivityResult

        Preference.OnPreferenceClickListener clickListener = new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                // show the currencies activity
                Intent intent = new Intent(getActivity(), CurrencyListActivity.class);
                intent.setAction(Intent.ACTION_PICK);
                startActivityForResult(intent, REQUEST_PICK_CURRENCY);

                return true;
            }
        };

        baseCurrency.setOnPreferenceClickListener(clickListener);
    }

    private String getDateFormatFromMask(String mask) {
        if (!TextUtils.isEmpty(mask)) {
            for (int i = 0; i < getResources().getStringArray(R.array.date_format_mask).length; i++) {
                if (mask.equals(getResources().getStringArray(R.array.date_format_mask)[i])) {
                    return getResources().getStringArray(R.array.date_format)[i];
                }
            }
        }
        return null;
    }

    private void initDefaultAccount() {
        ListPreference preference = (ListPreference) findPreference(getString(R.string.pref_default_account));
        if (preference == null)
            return;

        AccountService accountService = new AccountService(getActivity());
        List<Account> accounts = accountService.getAccountList(false, false);

        // the list is already sorted by name.

        final String[] entries = new String[accounts.size() + 1];
        String[] entryValues = new String[accounts.size() + 1];
        // Add the null value so that the setting can be disabled.
        entries[0] = getString(R.string.none);
        entryValues[0] = "-1";
        // list of currencies
        for (int i = 1; i < accounts.size() + 1; i++) {
            entries[i] = accounts.get(i - 1).getName();
            entryValues[i] = accounts.get(i - 1).getId().toString();
        }
        // set value
        preference.setEntries(entries);
        preference.setEntryValues(entryValues);

        final AccountRepository repository = new AccountRepository(getActivity());

        // set account name as the value here
        Integer defaultAccountId = new GeneralSettings(getActivity()).getDefaultAccountId();
        String accountName = entries[0]; // none
        if (defaultAccountId != null && defaultAccountId != Constants.NOT_SET) {
            accountName = repository.loadName(defaultAccountId);
        }
        preference.setSummary(accountName);

        preference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                String accountName = entries[0];
                int accountId = Integer.parseInt(newValue.toString());
                if (accountId != Constants.NOT_SET) {
                    accountName = repository.loadName(accountId);
                }
                preference.setSummary(accountName);

                new GeneralSettings(getActivity()).setDefaultAccountId(accountId);

                return true;
            }
        });
    }

    private void showCurrentDefaultCurrency() {
        Preference baseCurrency = findPreference(getString(PreferenceConstants.PREF_BASE_CURRENCY));
        if (baseCurrency == null)
            return;

        CurrencyService currencyService = new CurrencyService(getActivity().getApplicationContext());
        Integer currencyId = currencyService.getBaseCurrencyId();

        Currency tableCurrency = currencyService.getCurrency(currencyId);
        if (tableCurrency != null) {
            baseCurrency.setSummary(tableCurrency.getName());
        }
    }

    private void showCurrencyChangeNotification() {
        new MaterialDialog.Builder(getActivity()).title(R.string.base_currency_changed)
                .content(R.string.base_currency_change_notification).positiveText(android.R.string.ok)
                .neutralText(R.string.open_currencies).onNeutral(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        Intent intent = new Intent(getActivity(), CurrencyListActivity.class);
                        intent.setAction(Intent.ACTION_EDIT);
                        startActivity(intent);
                    }
                }).show();
    }

}