X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2FTransactionListActivity.java;h=6a9c24d9a5dbbc78bc0be5f153922514026c7da1;hp=a948715e98dc3bf9134302ffae7b83c21c4e68cb;hb=12665a6fba07ee914b2fe7931704b904d8d2e85d;hpb=ce34e7c2b46cc78021d9b93f6b82b73bb1bc432a diff --git a/app/src/main/java/net/ktnx/mobileledger/TransactionListActivity.java b/app/src/main/java/net/ktnx/mobileledger/TransactionListActivity.java index a948715e..6a9c24d9 100644 --- a/app/src/main/java/net/ktnx/mobileledger/TransactionListActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/TransactionListActivity.java @@ -17,28 +17,89 @@ package net.ktnx.mobileledger; +import android.arch.lifecycle.ViewModelProviders; +import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; -import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment; +import net.ktnx.mobileledger.async.RetrieveTransactionsTask; +import net.ktnx.mobileledger.ui.transaction_list.TransactionListViewModel; +import net.ktnx.mobileledger.utils.MLDB; -public class TransactionListActivity extends AppCompatActivity { +import java.lang.ref.WeakReference; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; +public class TransactionListActivity extends AppCompatActivity { + public TransactionListViewModel model; + private SwipeRefreshLayout swiper; + private RecyclerView root; + private ProgressBar progressBar; + private LinearLayout progressLayout; + private TextView tvLastUpdate; + private TransactionListAdapter modelAdapter; + private RetrieveTransactionsTask retrieveTransactionsTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.transaction_list_activity); - if (savedInstanceState == null) { - getSupportFragmentManager().beginTransaction() - .replace(R.id.container, TransactionListFragment.newInstance()).commitNow(); - } + Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); setupActionBar(); + + swiper = findViewById(R.id.transaction_swipe); + if (swiper == null) throw new RuntimeException("Can't get hold on the swipe layout"); + root = findViewById(R.id.transaction_root); + if (root == null) throw new RuntimeException("Can't get hold on the transaction list view"); + progressBar = findViewById(R.id.transaction_list_progress_bar); + if (progressBar == null) + throw new RuntimeException("Can't get hold on the transaction list progress bar"); + progressLayout = findViewById(R.id.transaction_progress_layout); + if (progressLayout == null) throw new RuntimeException( + "Can't get hold on the transaction list progress bar layout"); + tvLastUpdate = findViewById(R.id.transactions_last_update); + updateLastUpdateText(); + model = ViewModelProviders.of(this).get(TransactionListViewModel.class); + modelAdapter = new TransactionListAdapter(model); + + RecyclerView root = findViewById(R.id.transaction_root); + root.setAdapter(modelAdapter); + + LinearLayoutManager llm = new LinearLayoutManager(this); + + llm.setOrientation(LinearLayoutManager.VERTICAL); + root.setLayoutManager(llm); + + swiper.setOnRefreshListener(() -> { + Log.d("ui", "refreshing transactions via swipe"); + update_transactions(); + }); + + swiper.setColorSchemeResources(R.color.colorPrimary, R.color.colorAccent); + + updateLastUpdateText(); + long last_update = MLDB.get_option_value(this, MLDB.OPT_TRANSACTION_LIST_STAMP, 0L); + Log.d("transactions", String.format("Last update = %d", last_update)); + if (last_update == 0) { + update_transactions(); + } + else { + model.reloadTransactions(this); + } } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); @@ -53,4 +114,72 @@ public class TransactionListActivity extends AppCompatActivity { Log.d("visuals", "finishing"); overridePendingTransition(R.anim.dummy, R.anim.slide_out_right); } + private void update_transactions() { + retrieveTransactionsTask = new RetrieveTransactionsTask(new WeakReference<>(this)); + + RetrieveTransactionsTask.Params params = new RetrieveTransactionsTask.Params( + PreferenceManager.getDefaultSharedPreferences(this)); + + retrieveTransactionsTask.execute(params); + findViewById(R.id.transaction_list_cancel_download).setEnabled(true); + } + + public void onRetrieveStart() { + progressBar.setIndeterminate(true); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) progressBar.setProgress(0, false); + else progressBar.setProgress(0); + progressLayout.setVisibility(View.VISIBLE); + } + public void onRetrieveProgress(RetrieveTransactionsTask.Progress progress) { + if ((progress.getTotal() == RetrieveTransactionsTask.Progress.INDETERMINATE) || + (progress.getTotal() == 0)) + { + progressBar.setIndeterminate(true); + } + else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + progressBar.setMin(0); + } + progressBar.setMax(progress.getTotal()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + progressBar.setProgress(progress.getProgress(), true); + } + else progressBar.setProgress(progress.getProgress()); + progressBar.setIndeterminate(false); + } + } + + public void onRetrieveDone(boolean success) { + progressLayout.setVisibility(View.GONE); + swiper.setRefreshing(false); + updateLastUpdateText(); + if (success) { + Log.d("transactions", "calling notifyDataSetChanged()"); + modelAdapter.notifyDataSetChanged(); + } + } + private void updateLastUpdateText() { + { + long last_update = MLDB.get_option_value(this, MLDB.OPT_TRANSACTION_LIST_STAMP, 0L); + Log.d("transactions", String.format("Last update = %d", last_update)); + if (last_update == 0) { + tvLastUpdate.setText(getString(R.string.transaction_last_update_never)); + } + else { + Date date = new Date(last_update); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + tvLastUpdate.setText(date.toInstant().atZone(ZoneId.systemDefault()) + .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); + } + else { + tvLastUpdate.setText(date.toLocaleString()); + } + } + } + } + public void onStopTransactionRefreshClick(View view) { + Log.d("interactive", "Cancelling transactions refresh"); + if (retrieveTransactionsTask != null) retrieveTransactionsTask.cancel(false); + findViewById(R.id.transaction_list_cancel_download).setEnabled(false); + } }