/*
* 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.appwidget.AutoRefreshService;
import com.liato.bankdroid.banking.Account;
import com.liato.bankdroid.banking.Bank;
import com.liato.bankdroid.banking.BankFactory;
import com.liato.bankdroid.banking.exceptions.BankChoiceException;
import com.liato.bankdroid.banking.exceptions.BankException;
import com.liato.bankdroid.banking.exceptions.LoginException;
import com.liato.bankdroid.db.DBAdapter;
import com.liato.bankdroid.utils.LoggingUtils;
import com.liato.bankdroid.utils.NetworkUtils;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import timber.log.Timber;
public class DataRetrieverTask extends AsyncTask<String, String, Void> {
private final ProgressDialog dialog;
private final MainActivity parent;
private final Resources res;
private ArrayList<String> errors;
private long bankId = -1;
public DataRetrieverTask(final MainActivity parent) {
this.parent = parent;
this.res = parent.getResources();
this.dialog = new ProgressDialog(parent);
}
public DataRetrieverTask(final MainActivity parent, final long bankId) {
this(parent);
this.bankId = bankId;
}
@Override
protected void onPreExecute() {
getDialog().setMessage(res.getText(R.string.updating_account_balance)
+ "\n ");
getDialog().setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
getDialog().setCancelable(false);
getDialog().show();
}
@NonNull
protected ProgressDialog getDialog() {
return this.dialog;
}
@Nullable
protected Bank getBankFromDb(long bankId, Context parent) {
return BankFactory.bankFromDb(bankId, parent, true);
}
protected List<Bank> getBanksFromDb(Context parent) {
return BankFactory.banksFromDb(parent, true);
}
protected void saveBank(Bank bank, Context context) {
DBAdapter.save(bank, parent);
}
protected void publishProgress(int zeroBasedBankNumber, @Nullable Bank bank) {
String text = "";
if (bank != null) {
text = bank.getName() + " (" + bank.getUsername() + ")";
}
publishProgress(Integer.toString(zeroBasedBankNumber), text);
}
protected boolean isContentProviderEnabled() {
final SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(parent);
return prefs.getBoolean("content_provider_enabled", false);
}
@Override
protected Void doInBackground(final String... args) {
errors = new ArrayList<>();
List<Bank> banks;
if (bankId != -1) {
banks = new ArrayList<>();
banks.add(getBankFromDb(bankId, parent));
} else {
banks = getBanksFromDb(parent);
}
getDialog().setMax(banks.size());
int i = 0;
for (final Bank bank : banks) {
publishProgress(i, bank);
if (isListingAllBanks() && bank.isDisabled()) {
LoggingUtils.logDisabledBank(bank);
continue;
}
try {
bank.update();
bank.updateAllTransactions();
bank.closeConnection();
saveBank(bank, parent);
i++;
LoggingUtils.logBankUpdate(bank, true);
} catch (final BankException e) {
this.errors.add(bank.getName() + " (" + bank.getUsername()
+ ")");
Timber.e(e, "Could not update bank.");
} catch (final LoginException e) {
this.errors.add(bank.getName() + " (" + bank.getUsername()
+ ")");
DBAdapter.disable(bank, parent);
} catch (BankChoiceException e) {
this.errors.add(bank.getName() + " (" + bank.getUsername()
+ ")");
} catch (IOException e) {
this.errors.add(bank.getName() + " (" + bank.getUsername()
+ ")");
if (NetworkUtils.isInternetAvailable()) {
Timber.e(e, "IO error talking to bank");
}
}
if (isContentProviderEnabled()) {
final ArrayList<Account> accounts = bank.getAccounts();
for (final Account account : accounts) {
AutoRefreshService.broadcastTransactionUpdate(parent,
bank.getDbId(), account.getId());
}
}
}
publishProgress(i, null);
return null;
}
private boolean isListingAllBanks() {
return bankId == -1;
}
@Override
protected void onProgressUpdate(final String... args) {
getDialog().setProgress(Integer.parseInt(args[0]));
getDialog().setMessage(res.getText(R.string.updating_account_balance)
+ "\n" + args[1]);
}
@Override
protected void onPostExecute(final Void unused) {
parent.refreshView();
AutoRefreshService.sendWidgetRefresh(parent);
ActivityHelper.dismissDialog(getDialog());
if ((this.errors != null) && !this.errors.isEmpty()) {
final StringBuilder errormsg = new StringBuilder();
errormsg.append(res.getText(R.string.accounts_were_not_updated))
.append(":\n");
for (final String err : errors) {
errormsg.append(err);
errormsg.append("\n");
}
final AlertDialog.Builder builder = new AlertDialog.Builder(parent);
builder.setMessage(errormsg.toString())
.setTitle(res.getText(R.string.errors_when_updating))
.setIcon(android.R.drawable.ic_dialog_alert)
.setNeutralButton("Ok",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
final DialogInterface dialog,
final int id) {
dialog.cancel();
}
});
final AlertDialog alert = builder.create();
alert.show();
}
}
}