Java tutorial
/******************************************************************************* * Copyright (c) 2010 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Denis Solonenko - initial API and implementation ******************************************************************************/ package ru.orangesoftware.financisto2.activity; import android.accounts.Account; import android.accounts.AccountManager; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.os.Bundle; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.support.v4.app.NavUtils; import android.util.Log; import android.widget.Toast; import com.google.android.gms.auth.GoogleAuthUtil; import com.google.android.gms.common.AccountPicker; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.OptionsItem; import ru.orangesoftware.financisto2.R; import ru.orangesoftware.financisto2.dialog.FolderBrowser; import ru.orangesoftware.financisto2.export.Export; import ru.orangesoftware.financisto2.export.dropbox.Dropbox; import ru.orangesoftware.financisto2.rates.ExchangeRateProviderFactory; import ru.orangesoftware.financisto2.utils.MyPreferences; import ru.orangesoftware.financisto2.utils.PinProtection; @EActivity public class PreferencesActivity extends PreferenceActivity { private static final String[] ACCOUNT_TYPE = new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }; private static final int SELECT_DATABASE_FOLDER = 100; private static final int CHOOSE_ACCOUNT = 101; Preference pOpenExchangeRatesAppId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); getActionBar().setHomeButtonEnabled(true); PreferenceScreen preferenceScreen = getPreferenceScreen(); Preference pLocale = preferenceScreen.findPreference("ui_language"); pLocale.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { String locale = (String) newValue; MyPreferences.switchLocale(PreferencesActivity.this, locale); return true; } }); Preference pNewTransactionShortcut = preferenceScreen.findPreference("shortcut_new_transaction"); pNewTransactionShortcut.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { addShortcut(".activity.TransactionActivity", R.string.transaction, R.drawable.icon_transaction); return true; } }); Preference pNewTransferShortcut = preferenceScreen.findPreference("shortcut_new_transfer"); pNewTransferShortcut.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { addShortcut(".activity.TransferActivity", R.string.transfer, R.drawable.icon_transfer); return true; } }); Preference pDatabaseBackupFolder = preferenceScreen.findPreference("database_backup_folder"); pDatabaseBackupFolder.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { selectDatabaseBackupFolder(); return true; } }); Preference pAuthDropbox = preferenceScreen.findPreference("dropbox_authorize"); pAuthDropbox.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { authDropbox(); return true; } }); Preference pDeauthDropbox = preferenceScreen.findPreference("dropbox_unlink"); pDeauthDropbox.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { deAuthDropbox(); return true; } }); Preference pExchangeProvider = preferenceScreen.findPreference("exchange_rate_provider"); pOpenExchangeRatesAppId = preferenceScreen.findPreference("openexchangerates_app_id"); pExchangeProvider.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { pOpenExchangeRatesAppId.setEnabled(isOpenExchangeRatesProvider((String) newValue)); return true; } private boolean isOpenExchangeRatesProvider(String provider) { return ExchangeRateProviderFactory.openexchangerates.name().equals(provider); } }); Preference pDriveAccount = preferenceScreen.findPreference("google_drive_backup_account"); pDriveAccount.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference arg0) { chooseAccount(); return true; } }); linkToDropbox(); setCurrentDatabaseBackupFolder(); enableOpenExchangeApp(); selectAccount(); } @OptionsItem(android.R.id.home) public void onHome() { NavUtils.navigateUpFromSameTask(this); } private void chooseAccount() { try { Account selectedAccount = getSelectedAccount(); Intent intent = AccountPicker.newChooseAccountIntent(selectedAccount, null, ACCOUNT_TYPE, true, null, null, null, null); startActivityForResult(intent, CHOOSE_ACCOUNT); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.google_drive_account_select_error, Toast.LENGTH_LONG).show(); } } private Account getSelectedAccount() { Account selectedAccount = null; String account = MyPreferences.getGoogleDriveAccount(this); if (account != null) { //selectedAccount = googleAccountManager.getAccountByName(account); } return selectedAccount; } private void linkToDropbox() { boolean dropboxAuthorized = MyPreferences.isDropboxAuthorized(this); PreferenceScreen preferenceScreen = getPreferenceScreen(); preferenceScreen.findPreference("dropbox_unlink").setEnabled(dropboxAuthorized); preferenceScreen.findPreference("dropbox_upload_backup").setEnabled(dropboxAuthorized); preferenceScreen.findPreference("dropbox_upload_autobackup").setEnabled(dropboxAuthorized); } private void selectDatabaseBackupFolder() { Intent intent = new Intent(this, FolderBrowser.class); intent.putExtra(FolderBrowser.PATH, getDatabaseBackupFolder()); startActivityForResult(intent, SELECT_DATABASE_FOLDER); } private void enableOpenExchangeApp() { pOpenExchangeRatesAppId.setEnabled(MyPreferences.isOpenExchangeRatesProviderSelected(this)); } private String getDatabaseBackupFolder() { return Export.getBackupFolder(this).getAbsolutePath(); } private void setCurrentDatabaseBackupFolder() { Preference pDatabaseBackupFolder = getPreferenceScreen().findPreference("database_backup_folder"); String summary = getString(R.string.database_backup_folder_summary, getDatabaseBackupFolder()); pDatabaseBackupFolder.setSummary(summary); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case SELECT_DATABASE_FOLDER: String databaseBackupFolder = data.getStringExtra(FolderBrowser.PATH); MyPreferences.setDatabaseBackupFolder(this, databaseBackupFolder); setCurrentDatabaseBackupFolder(); break; case CHOOSE_ACCOUNT: if (data != null) { Bundle b = data.getExtras(); String accountName = b.getString(AccountManager.KEY_ACCOUNT_NAME); Log.d("Preferences", "Selected account: " + accountName); if (accountName != null && accountName.length() > 0) { MyPreferences.setGoogleDriveAccount(this, accountName); selectAccount(); } } break; } } } private void selectAccount() { Preference pDriveAccount = getPreferenceScreen().findPreference("google_drive_backup_account"); Account account = getSelectedAccount(); if (account != null) { pDriveAccount.setSummary(account.name); } } private void addShortcut(String activity, int nameId, int iconId) { Intent intent = createShortcutIntent(activity, getString(nameId), Intent.ShortcutIconResource.fromContext(this, iconId), "com.android.launcher.action.INSTALL_SHORTCUT"); sendBroadcast(intent); } private Intent createShortcutIntent(String activity, String shortcutName, ShortcutIconResource shortcutIcon, String action) { Intent shortcutIntent = new Intent(); shortcutIntent.setComponent(new ComponentName(this.getPackageName(), activity)); shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Intent intent = new Intent(); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortcutName); intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcon); intent.setAction(action); return intent; } Dropbox dropbox = new Dropbox(this); private void authDropbox() { try { dropbox.startAuth(); } catch (Exception e) { Log.e("Financisto", "Dropbox auth error", e); Toast.makeText(this, "Unable to authorize Dropbox:\n" + e.getMessage(), Toast.LENGTH_LONG).show(); } } private void deAuthDropbox() { dropbox.deAuth(); linkToDropbox(); } @Override protected void onPause() { super.onPause(); PinProtection.lock(this); } @Override protected void onResume() { super.onResume(); PinProtection.unlock(this); dropbox.completeAuth(); linkToDropbox(); } }