diff --git a/app/build.gradle b/app/build.gradle index 0e61e27..427efee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -153,6 +153,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' implementation 'androidx.navigation:navigation-fragment:2.5.1' implementation 'androidx.navigation:navigation-ui:2.5.1' + implementation 'androidx.leanback:leanback:1.0.0' //noinspection GradleDependency testImplementation "junit:junit:4.13.2" diff --git a/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java b/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java new file mode 100644 index 0000000..343aaa3 --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/adapter/TransactionInfoAdapter.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2017 m2049r + * + * 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.m2049r.xmrwallet.adapter; + +import android.content.Context; +import android.text.Html; +import android.text.Spanned; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.leanback.widget.DiffCallback; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.google.android.material.progressindicator.CircularProgressIndicator; +import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.data.Crypto; +import com.m2049r.xmrwallet.data.UserNotes; +import com.m2049r.xmrwallet.model.TransactionInfo; +import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.ThemeHelper; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.TimeZone; + +import timber.log.Timber; + +public class TransactionInfoAdapter extends RecyclerView.Adapter { + + private List localDataSet; + private TxInfoAdapterListener listener = null; + + /** + * Provide a reference to the type of views that you are using + * (custom ViewHolder). + */ + public static class ViewHolder extends RecyclerView.ViewHolder { + private TxInfoAdapterListener listener = null; + public ViewHolder(TxInfoAdapterListener listener, View view) { + super(view); + this.listener = listener; + } + + public void bind(TransactionInfo txInfo) { + itemView.setOnClickListener(view -> { + listener.onClickTransaction(txInfo); + }); + } + } + + /** + * Initialize the dataset of the Adapter. + */ + public TransactionInfoAdapter(TxInfoAdapterListener listener) { + this.listener = listener; + this.localDataSet = new ArrayList<>(); + } + + public void submitList(List dataSet) { + this.localDataSet = dataSet; + } + + // Create new views (invoked by the layout manager) + @Override + public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { + // Create a new view, which defines the UI of the list item + View view = LayoutInflater.from(viewGroup.getContext()) + .inflate(R.layout.transaction_history_item, viewGroup, false); + + return new ViewHolder(listener, view); + } + + // Replace the contents of a view (invoked by the layout manager) + @Override + public void onBindViewHolder(ViewHolder viewHolder, final int position) { + TransactionInfo tx = localDataSet.get(position); + viewHolder.bind(tx); + } + + // Return the size of your dataset (invoked by the layout manager) + @Override + public int getItemCount() { + return localDataSet.size(); + } + + public interface TxInfoAdapterListener { + void onClickTransaction(TransactionInfo txInfo); + } +} + diff --git a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java index 906d1fc..45a026c 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java +++ b/app/src/main/java/com/m2049r/xmrwallet/fragment/home/HomeFragment.java @@ -18,18 +18,23 @@ import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.bottomsheet.BottomSheetDialog; import com.m2049r.xmrwallet.MainActivity; import com.m2049r.xmrwallet.R; +import com.m2049r.xmrwallet.adapter.TransactionInfoAdapter; import com.m2049r.xmrwallet.fragment.dialog.ReceiveBottomSheetDialog; import com.m2049r.xmrwallet.fragment.dialog.SendBottomSheetDialog; +import com.m2049r.xmrwallet.model.TransactionInfo; import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.service.AddressService; import com.m2049r.xmrwallet.service.BalanceService; +import com.m2049r.xmrwallet.service.HistoryService; import com.m2049r.xmrwallet.service.TxService; -public class HomeFragment extends Fragment { +public class HomeFragment extends Fragment implements TransactionInfoAdapter.TxInfoAdapterListener { private HomeViewModel mViewModel; @@ -43,16 +48,15 @@ public class HomeFragment extends Fragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); mViewModel = new ViewModelProvider(this).get(HomeViewModel.class); + bindObservers(view); + bindListeners(view); + } + private void bindListeners(View view) { ImageView settingsImageView = view.findViewById(R.id.settings_imageview); - TextView balanceTextView = view.findViewById(R.id.balance_textview); Button sendButton = view.findViewById(R.id.send_button); Button receiveButton = view.findViewById(R.id.receive_button); - BalanceService.getInstance().balance.observe(getViewLifecycleOwner(), balance -> { - balanceTextView.setText(getString(R.string.wallet_balance_text, Wallet.getDisplayAmount(balance))); - }); - settingsImageView.setOnClickListener(view12 -> { navigate(R.id.settings_fragment); }); @@ -68,6 +72,32 @@ public class HomeFragment extends Fragment { }); } + private void bindObservers(View view) { + RecyclerView txHistoryRecyclerView = view.findViewById(R.id.transaction_history_recyclerview); + TextView balanceTextView = view.findViewById(R.id.balance_textview); + + BalanceService.getInstance().balance.observe(getViewLifecycleOwner(), balance -> { + balanceTextView.setText(getString(R.string.wallet_balance_text, Wallet.getDisplayAmount(balance))); + }); + + TransactionInfoAdapter adapter = new TransactionInfoAdapter(this); + txHistoryRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + txHistoryRecyclerView.setAdapter(adapter); + HistoryService.getInstance().history.observe(getViewLifecycleOwner(), history -> { + if(history.isEmpty()) { + txHistoryRecyclerView.setVisibility(View.GONE); + } else { + adapter.submitList(history); + txHistoryRecyclerView.setVisibility(View.VISIBLE); + } + }); + } + + @Override + public void onClickTransaction(TransactionInfo txInfo) { + System.out.println(txInfo.hash); + } + private void navigate(int destination) { FragmentActivity activity = getActivity(); if (activity != null) { diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 6f9bd09..16f7db1 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -29,6 +29,17 @@ app:layout_constraintTop_toTopOf="@id/settings_imageview" app:layout_constraintBottom_toBottomOf="@id/settings_imageview"/> + +