2 * Copyright © 2018 Damyan Ivanov.
3 * This file is part of Mobile-Ledger.
4 * Mobile-Ledger is free software: you can distribute it and/or modify it
5 * under the term of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your opinion), any later version.
9 * Mobile-Ledger is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License terms for details.
14 * You should have received a copy of the GNU General Public License
15 * along with Mobile-Ledger. If not, see <https://www.gnu.org/licenses/>.
18 package net.ktnx.mobileledger;
20 import android.arch.lifecycle.ViewModelProviders;
21 import android.os.Build;
22 import android.os.Bundle;
23 import android.preference.PreferenceManager;
24 import android.support.v4.widget.SwipeRefreshLayout;
25 import android.support.v7.app.ActionBar;
26 import android.support.v7.app.AppCompatActivity;
27 import android.support.v7.widget.LinearLayoutManager;
28 import android.support.v7.widget.RecyclerView;
29 import android.support.v7.widget.Toolbar;
30 import android.util.Log;
31 import android.view.View;
32 import android.widget.ProgressBar;
33 import android.widget.TextView;
35 import net.ktnx.mobileledger.async.RetrieveTransactionsTask;
36 import net.ktnx.mobileledger.model.LedgerTransaction;
37 import net.ktnx.mobileledger.ui.transaction_list.TransactionListViewModel;
38 import net.ktnx.mobileledger.utils.MobileLedgerDatabase;
40 import java.lang.ref.WeakReference;
41 import java.time.ZoneId;
42 import java.time.format.DateTimeFormatter;
43 import java.util.Date;
44 import java.util.List;
46 public class TransactionListActivity extends AppCompatActivity {
47 private SwipeRefreshLayout swiper;
48 private RecyclerView root;
49 private ProgressBar progressBar;
50 private TransactionListViewModel model;
51 private TextView tvLastUpdate;
52 private TransactionListAdapter modelAdapter;
54 protected void onCreate(Bundle savedInstanceState) {
55 super.onCreate(savedInstanceState);
56 setContentView(R.layout.transaction_list_activity);
58 Toolbar toolbar = findViewById(R.id.toolbar);
59 setSupportActionBar(toolbar);
63 MobileLedgerDatabase dbh = new MobileLedgerDatabase(this);
65 swiper = findViewById(R.id.transaction_swipe);
66 if (swiper == null) throw new RuntimeException("Can't get hold on the swipe layout");
67 root = findViewById(R.id.transaction_root);
68 if (root == null) throw new RuntimeException("Can't get hold on the transaction list view");
69 progressBar = findViewById(R.id.transaction_progress_bar);
70 if (progressBar == null)
71 throw new RuntimeException("Can't get hold on the transaction list progress bar");
72 tvLastUpdate = findViewById(R.id.transactions_last_update);
74 long last_update = dbh.get_option_value("transaction_list_last_update", 0L);
75 Log.d("transactions", String.format("Last update = %d", last_update));
76 if (last_update == 0) tvLastUpdate.setText("never");
78 Date date = new Date(last_update);
79 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
80 tvLastUpdate.setText(date.toInstant().atZone(ZoneId.systemDefault())
81 .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
84 tvLastUpdate.setText(date.toLocaleString());
88 model = ViewModelProviders.of(this).get(TransactionListViewModel.class);
89 List<LedgerTransaction> transactions = model.getTransactions(dbh);
90 modelAdapter = new TransactionListAdapter(transactions);
92 RecyclerView root = findViewById(R.id.transaction_root);
93 root.setAdapter(modelAdapter);
95 LinearLayoutManager llm = new LinearLayoutManager(this);
97 llm.setOrientation(LinearLayoutManager.VERTICAL);
98 root.setLayoutManager(llm);
100 swiper.setOnRefreshListener(() -> {
101 Log.d("ui", "refreshing transactions via swipe");
102 update_transactions();
105 swiper.setColorSchemeResources(R.color.colorPrimary, R.color.colorAccent);
107 // update_transactions();
109 private void setupActionBar() {
110 ActionBar actionBar = getSupportActionBar();
111 if (actionBar != null) {
112 // Show the Up button in the action bar.
113 actionBar.setDisplayHomeAsUpEnabled(true);
117 public void finish() {
119 Log.d("visuals", "finishing");
120 overridePendingTransition(R.anim.dummy, R.anim.slide_out_right);
122 private void update_transactions() {
123 RetrieveTransactionsTask task = new RetrieveTransactionsTask(new WeakReference<>(this));
125 RetrieveTransactionsTask.Params params = new RetrieveTransactionsTask.Params(
126 PreferenceManager.getDefaultSharedPreferences(this));
128 task.execute(params);
131 public void onRetrieveStart() {
132 progressBar.setIndeterminate(true);
133 progressBar.setVisibility(View.VISIBLE);
135 public void onRetrieveProgress(RetrieveTransactionsTask.Progress progress) {
136 if ((progress.getTotal() == RetrieveTransactionsTask.Progress.INDETERMINATE) ||
137 (progress.getTotal() == 0))
139 progressBar.setIndeterminate(true);
142 progressBar.setIndeterminate(false);
143 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
144 progressBar.setMin(0);
146 progressBar.setMax(progress.getTotal());
147 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
148 progressBar.setProgress(progress.getProgress(), true);
150 else progressBar.setProgress(progress.getProgress());
154 public void onRetrieveDone(boolean success) {
155 progressBar.setVisibility(View.GONE);
156 swiper.setRefreshing(false);
158 MobileLedgerDatabase dbh = new MobileLedgerDatabase(this);
159 Date now = new Date();
160 dbh.set_option_value("transaction_list_last_update", now.getTime());
161 updateLastUpdateText(now);
162 modelAdapter.notifyDataSetChanged();
165 private void updateLastUpdateText(Date now) {
166 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
167 tvLastUpdate.setText(now.toInstant().atZone(ZoneId.systemDefault()).toString());
170 tvLastUpdate.setText(now.toLocaleString());