/* * 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(); } }