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.MLDB;
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 public 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 swiper = findViewById(R.id.transaction_swipe);
64 if (swiper == null) throw new RuntimeException("Can't get hold on the swipe layout");
65 root = findViewById(R.id.transaction_root);
66 if (root == null) throw new RuntimeException("Can't get hold on the transaction list view");
67 progressBar = findViewById(R.id.transaction_progress_bar);
68 if (progressBar == null)
69 throw new RuntimeException("Can't get hold on the transaction list progress bar");
70 tvLastUpdate = findViewById(R.id.transactions_last_update);
72 long last_update = MLDB.get_option_value(this, "transaction_list_last_update", 0L);
73 Log.d("transactions", String.format("Last update = %d", last_update));
74 if (last_update == 0) tvLastUpdate.setText("never");
76 Date date = new Date(last_update);
77 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
78 tvLastUpdate.setText(date.toInstant().atZone(ZoneId.systemDefault())
79 .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
82 tvLastUpdate.setText(date.toLocaleString());
86 model = ViewModelProviders.of(this).get(TransactionListViewModel.class);
87 List<LedgerTransaction> transactions = model.getTransactions(getApplicationContext());
88 modelAdapter = new TransactionListAdapter(transactions);
90 RecyclerView root = findViewById(R.id.transaction_root);
91 root.setAdapter(modelAdapter);
93 LinearLayoutManager llm = new LinearLayoutManager(this);
95 llm.setOrientation(LinearLayoutManager.VERTICAL);
96 root.setLayoutManager(llm);
98 swiper.setOnRefreshListener(() -> {
99 Log.d("ui", "refreshing transactions via swipe");
100 update_transactions();
103 swiper.setColorSchemeResources(R.color.colorPrimary, R.color.colorAccent);
105 // update_transactions();
107 private void setupActionBar() {
108 ActionBar actionBar = getSupportActionBar();
109 if (actionBar != null) {
110 // Show the Up button in the action bar.
111 actionBar.setDisplayHomeAsUpEnabled(true);
115 public void finish() {
117 Log.d("visuals", "finishing");
118 overridePendingTransition(R.anim.dummy, R.anim.slide_out_right);
120 private void update_transactions() {
121 RetrieveTransactionsTask task = new RetrieveTransactionsTask(new WeakReference<>(this));
123 RetrieveTransactionsTask.Params params = new RetrieveTransactionsTask.Params(
124 PreferenceManager.getDefaultSharedPreferences(this));
126 task.execute(params);
129 public void onRetrieveStart() {
130 progressBar.setIndeterminate(true);
131 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) progressBar.setProgress(0, false);
132 else progressBar.setProgress(0);
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 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
143 progressBar.setMin(0);
145 progressBar.setMax(progress.getTotal());
146 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
147 progressBar.setProgress(progress.getProgress(), true);
149 else progressBar.setProgress(progress.getProgress());
150 progressBar.setIndeterminate(false);
154 public void onRetrieveDone(boolean success) {
155 progressBar.setVisibility(View.GONE);
156 swiper.setRefreshing(false);
158 Date now = new Date();
159 MLDB.set_option_value(getApplicationContext(), "transaction_list_last_update",
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());