/*
* Copyright (C) 2010 Nullbyte <http://nullbyte.eu>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.liato.bankdroid;
import com.liato.bankdroid.adapters.AccountsAdapter;
import com.liato.bankdroid.appwidget.AutoRefreshService;
import com.liato.bankdroid.banking.Account;
import com.liato.bankdroid.banking.Bank;
import com.liato.bankdroid.banking.BankFactory;
import com.liato.bankdroid.db.DBAdapter;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import butterknife.ButterKnife;
import butterknife.InjectView;
public class MainActivity extends LockableActivity {
@InjectView(R.id.txtAccountsDesc)
TextView mAccountsDescription;
protected static boolean showHidden = false;
private Bank selectedBank = null;
private static Account selectedAccount = null;
private final BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
refreshView();
}
};
protected AccountsAdapter adapter = null;
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PairApplicationsActivity.initialSetupApiKey(this);
setContentView(R.layout.main);
ButterKnife.inject(this);
adapter = new AccountsAdapter(this, showHidden);
final ArrayList<Bank> banks = new ArrayList<>();
adapter.setGroups(banks);
final ListView lv = (ListView) findViewById(R.id.lstAccountsList);
lv.setAdapter(adapter);
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(final AdapterView<?> parent, final View view,
final int position, final long id) {
if (adapter.getItem(position) instanceof Account) {
selectedAccount = (Account) adapter.getItem(position);
final PopupMenuAccount pmenu = new PopupMenuAccount(parent, view, MainActivity.this);
pmenu.showLikeQuickAction(0, 12);
return true;
} else if (adapter.getItem(position) instanceof Bank) {
selectedBank = (Bank) adapter.getItem(position);
selectedBank.toggleHideAccounts();
DBAdapter.save(selectedBank, MainActivity.this);
refreshView();
return true;
}
return false;
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view,
final int position, final long id) {
if (adapter.getItem(position) instanceof Bank) {
selectedBank = (Bank) adapter.getItem(position);
final PopupMenuBank pmenu = new PopupMenuBank(parent, view, MainActivity.this);
pmenu.showLikeQuickAction(0, 12);
} else {
final Intent intent = new Intent(MainActivity.this, TransactionsActivity.class);
final Account account = (Account) adapter.getItem(position);
intent.putExtra("account", account.getId());
intent.putExtra("bank", account.getBankDbId());
MainActivity.this.startActivity(intent);
}
}
});
final Bundle extras = getIntent().getExtras();
// Clicking on widgets opens the transactions history through MainActivity so that
// the user can back out to the main window.
if (AutoRefreshService.ACTION_MAIN_SHOW_TRANSACTIONS.equals(getIntent().getAction())) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
if (prefs.getBoolean("widget_opens_transactions", true)) {
skipLockOnce();
final Intent intent = new Intent(this, TransactionsActivity.class);
intent.putExtra("account", extras.getString("account"));
intent.putExtra("bank", extras.getLong("bank"));
startActivity(intent);
}
}
((BankdroidApplication) getApplication()).showAndDeleteApplicationMessage();
}
@Override
public void onResume() {
super.onResume();
// Receive refresh Intent from AutoRefreshService and refresh the main view if changes
// have been detected.
registerReceiver(receiver, new IntentFilter(AutoRefreshService.BROADCAST_MAIN_REFRESH));
refreshView();
}
public void refreshView() {
final ArrayList<Bank> banks = BankFactory.banksFromDb(this, true);
mAccountsDescription.setVisibility(banks.isEmpty() ? View.VISIBLE : View.GONE);
adapter.setShowHidden(showHidden);
adapter.setGroups(banks);
adapter.notifyDataSetChanged();
}
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
super.onCreateOptionsMenu(menu);
final MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.main, menu);
return true;
}
@Override
protected Dialog onCreateDialog(final int id) {
super.onCreateDialog(id);
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.about);
dialog.setTitle(getString(R.string.about));
String version = BuildConfig.VERSION_NAME;
((TextView) dialog.findViewById(R.id.txtVersion))
.setText(getText(R.string.version).toString().replace("$version", version));
return dialog;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
Intent intent;
switch (item.getItemId()) {
case R.id.action_toggle_hidden:
showHidden = !showHidden;
item.setTitle(showHidden ? R.string.menu_hide_hidden : R.string.menu_show_hidden);
refreshView();
return true;
case R.id.action_settings:
intent = new Intent(this, SettingsActivity.class);
this.startActivity(intent);
//Helpers.setActivityAnimation(this, R.anim.zoom_enter, R.anim.zoom_exit);
return true;
case R.id.action_about:
intent = new Intent(this, AboutActivity.class);
startActivity(intent);
return true;
case R.id.action_refresh:
new DataRetrieverTask(MainActivity.this).execute();
return true;
case R.id.action_add:
final Intent intentAccount = new Intent(MainActivity.this, BankEditActivity.class);
startActivity(intentAccount);
return true;
}
return false;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
/**
* Extends {@link BetterPopupWindow}
* <p>
* Overrides onCreate to create the view and register the button listeners
*
* @author qbert
*/
private static class PopupMenuBank extends BetterPopupWindow implements OnClickListener {
MainActivity parent = null;
public PopupMenuBank(final ViewGroup parentView, final View anchor, final MainActivity parent) {
super(parentView, anchor);
this.parent = parent;
}
@Override
protected void onCreate() {
// inflate layout
final LayoutInflater inflater =
(LayoutInflater) this.anchor.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.popup_bank, this.parentView, false);
final Button btnHide = (Button) root.findViewById(R.id.btnHide);
final Button btnUnhide = (Button) root.findViewById(R.id.btnUnhide);
final Button btnWWW = (Button) root.findViewById(R.id.btnWWW);
if (parent.selectedBank.getHideAccounts()) {
btnHide.setVisibility(View.GONE);
btnUnhide.setVisibility(View.VISIBLE);
btnUnhide.setOnClickListener(this);
} else {
btnHide.setVisibility(View.VISIBLE);
btnUnhide.setVisibility(View.GONE);
btnHide.setOnClickListener(this);
}
if (parent.selectedBank.isWebViewEnabled()) {
btnWWW.setOnClickListener(this);
} else {
btnWWW.setVisibility(View.GONE);
}
root.findViewById(R.id.btnRefresh).setOnClickListener(this);
root.findViewById(R.id.btnEdit).setOnClickListener(this);
root.findViewById(R.id.btnRemove).setOnClickListener(this);
this.setContentView(root);
}
@Override
public void onClick(final View v) {
final Context context = this.anchor.getContext();
final int id = v.getId();
switch (id) {
case R.id.btnHide:
case R.id.btnUnhide:
this.dismiss();
parent.selectedBank.toggleHideAccounts();
DBAdapter.save(parent.selectedBank, context);
parent.refreshView();
return;
case R.id.btnWWW:
if (parent.selectedBank != null && parent.selectedBank.isWebViewEnabled()) {
//Uri uri = Uri.parse(selectedBank.getURL());
//Intent intent = new Intent(Intent.ACTION_VIEW, uri);
final Intent intent = new Intent(context, WebViewActivity.class);
intent.putExtra("bankid", parent.selectedBank.getDbId());
context.startActivity(intent);
}
this.dismiss();
return;
case R.id.btnEdit:
final Intent intent = new Intent(context, BankEditActivity.class);
intent.putExtra("id", parent.selectedBank.getDbId());
context.startActivity(intent);
this.dismiss();
return;
case R.id.btnRefresh:
this.dismiss();
new DataRetrieverTask(parent, parent.selectedBank.getDbId()).execute();
return;
case R.id.btnRemove:
this.dismiss();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
//builder.setMessage(getText(R.string.passwords_mismatch)).setTitle(getText(R.string.passwords_mismatch_title))
builder.setMessage(context.getText(R.string.remove_bank_msg))
.setTitle(context.getText(R.string.remove_bank_title))
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(context.getText(R.string.yes),
new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog,
final int id) {
final DBAdapter db = new DBAdapter(context);
db.deleteBank(parent.selectedBank.getDbId());
dialog.cancel();
parent.refreshView();
}
})
.setNegativeButton(context.getText(R.string.no),
new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog,
final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
return;
}
}
}
/**
* Extends {@link BetterPopupWindow}
* <p>
* Overrides onCreate to create the view and register the button listeners
*
* @author qbert
*/
private static class PopupMenuAccount extends BetterPopupWindow implements OnClickListener {
MainActivity parent = null;
public PopupMenuAccount(final ViewGroup parentView, final View anchor, final MainActivity parent) {
super(parentView, anchor);
this.parent = parent;
}
@Override
protected void onCreate() {
final LayoutInflater inflater =
(LayoutInflater) this.anchor.getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ViewGroup root = (ViewGroup) inflater.inflate(R.layout.popup_account, this.parentView, false);
final Button btnHide = (Button) root.findViewById(R.id.btnHide);
final Button btnUnhide = (Button) root.findViewById(R.id.btnUnhide);
final Button btnDisableNotifications = (Button) root
.findViewById(R.id.btnDisableNotifications);
final Button btnEnableNotifications = (Button) root
.findViewById(R.id.btnEnableNotifications);
if (selectedAccount.isHidden()) {
btnHide.setVisibility(View.GONE);
btnUnhide.setVisibility(View.VISIBLE);
btnUnhide.setOnClickListener(this);
} else {
btnHide.setVisibility(View.VISIBLE);
btnUnhide.setVisibility(View.GONE);
btnHide.setOnClickListener(this);
}
if (selectedAccount.isNotify()) {
btnDisableNotifications.setVisibility(View.VISIBLE);
btnDisableNotifications.setOnClickListener(this);
btnEnableNotifications.setVisibility(View.GONE);
} else {
btnDisableNotifications.setVisibility(View.GONE);
btnEnableNotifications.setOnClickListener(this);
btnEnableNotifications.setVisibility(View.VISIBLE);
}
this.setContentView(root);
}
@Override
public void onClick(final View v) {
final int id = v.getId();
switch (id) {
case R.id.btnHide:
this.dismiss();
selectedAccount.setHidden(true);
DBAdapter.save(selectedAccount.getBank(), parent);
parent.refreshView();
return;
case R.id.btnUnhide:
this.dismiss();
selectedAccount.setHidden(false);
DBAdapter.save(selectedAccount.getBank(), parent);
parent.refreshView();
return;
case R.id.btnEnableNotifications:
this.dismiss();
selectedAccount.setNotify(true);
DBAdapter.save(selectedAccount.getBank(), parent);
parent.refreshView();
return;
case R.id.btnDisableNotifications:
this.dismiss();
selectedAccount.setNotify(false);
DBAdapter.save(selectedAccount.getBank(), parent);
parent.refreshView();
return;
}
}
}
}