crystal-wallet-android/app/src/main/java/cy/agorise/crystalwallet/activities/BoardActivity.java

390 lines
14 KiB
Java

package cy.agorise.crystalwallet.activities;
import android.app.ActivityOptions;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ForegroundColorSpan;
import android.util.Pair;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import java.io.File;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cy.agorise.crystalwallet.R;
import cy.agorise.crystalwallet.fragments.BalanceFragment;
import cy.agorise.crystalwallet.fragments.ContactsFragment;
import cy.agorise.crystalwallet.fragments.MerchantsFragment;
import cy.agorise.crystalwallet.fragments.ReceiveTransactionFragment;
import cy.agorise.crystalwallet.fragments.SendTransactionFragment;
import cy.agorise.crystalwallet.fragments.TransactionsFragment;
import cy.agorise.crystalwallet.views.natives.GIFView;
import de.hdodenhof.circleimageview.CircleImageView;
import cy.agorise.crystalwallet.viewmodels.CryptoNetBalanceListViewModel;
/**
* Created by Henry Varona on 7/10/2017.
*
*/
public class BoardActivity extends CustomActivity {
@BindView(R.id.tabLayout)
public TabLayout tabLayout;
@BindView(R.id.pager)
public ViewPager mPager;
@BindView(R.id.fabSend)
public FloatingActionButton fabSend;
@BindView(R.id.fabReceive)
public FloatingActionButton fabReceive;
@BindView(R.id.fabAddContact)
public FloatingActionButton fabAddContact;
@BindView(R.id.imagevieGIF)
public GIFView imagevieGIF;
public BoardPagerAdapter boardAdapter;
/*
* the id of the account of this crypto net balance. It will be loaded
* when the element is bounded.
*/
long cryptoNetAccountId;
@BindView(R.id.surface_view)
public SurfaceView mSurfaceView;
@BindView(R.id.toolbar_user_img)
public CircleImageView userImage;
@BindView(R.id.lightning)
public ImageView lightning;
@BindView(R.id.triangle)
public ImageView triangle;
File photoDirectory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.board);
ButterKnife.bind(this);
//-1 represents a crypto net account not loaded yet
this.cryptoNetAccountId = -1;
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
/*
* Set the bubbles animation
* */
//imagevieGIF.centerCrop();
//imagevieGIF.load(R.raw.burbujas);
/*
* Listener tabLayout to resalt text when clicked
* */
final TabLayout tabLayoutFinal = tabLayout;
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(final TabLayout.Tab tab) {
globalActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
LinearLayout tabLayout = (LinearLayout)((ViewGroup) tabLayoutFinal.getChildAt(0)).getChildAt(tab.getPosition());
tabLayout.setBackgroundColor(Color.TRANSPARENT);
TextView tabTextView = (TextView) tabLayout.getChildAt(1);
//tabTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP ,50);
Spannable WordtoSpan = new SpannableString(tabTextView.getText());
WordtoSpan.setSpan(new ForegroundColorSpan(Color.WHITE), 0, tabTextView.getText().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tabTextView.setText(WordtoSpan);
tabTextView.setTypeface(tabTextView.getTypeface(), Typeface.BOLD);
}
});
}
@Override
public void onTabUnselected(final TabLayout.Tab tab) {
globalActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
LinearLayout tabLayout = (LinearLayout)((ViewGroup) tabLayoutFinal.getChildAt(0)).getChildAt(tab.getPosition());
TextView tabTextView = (TextView) tabLayout.getChildAt(1);
//tabTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP ,50);
Spannable WordtoSpan = new SpannableString(tabTextView.getText());
WordtoSpan.setSpan(new ForegroundColorSpan(globalActivity.getResources().getColor(R.color.lightGrayClear)), 0, tabTextView.getText().length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tabTextView.setText(WordtoSpan);
tabTextView.setTypeface(tabTextView.getTypeface(), Typeface.NORMAL);
}
});
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
// Appbar animation
mSurfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//Log.d(TAG,"surfaceCreated");
MediaPlayer mediaPlayer = MediaPlayer.create(BoardActivity.this, R.raw.appbar_background);
mediaPlayer.setDisplay(mSurfaceView.getHolder());
mediaPlayer.setLooping(true);
mediaPlayer.start();
}
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
//Log.d(TAG,"surfaceChanged");
}
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
//Log.d(TAG,"surfaceDestroyed");
}
});
boardAdapter = new BoardPagerAdapter(getSupportFragmentManager());
mPager.setAdapter(boardAdapter);
tabLayout.setupWithViewPager(mPager);
fabReceive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
receiveToThisAccount();
}
});
fabSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendFromThisAccount();
}
});
// Hide Add Contact fab, it won't hide until first page changed...
// Convert 72dp to pixels (fab is 56dp in diameter + 16dp margin)
final int fabDistanceToHide = (int) (72 * Resources.getSystem().getDisplayMetrics().density);
fabAddContact.animate().translationY(fabDistanceToHide)
.setInterpolator(new LinearInterpolator()).start();
// Hide and show respective fabs when convenient
mPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
fabReceive.show();
fabSend.show();
fabAddContact.animate().translationY(fabDistanceToHide)
.setInterpolator(new LinearInterpolator()).start();
break;
case 1:
fabReceive.show();
fabSend.show();
fabAddContact.animate().translationY(fabDistanceToHide)
.setInterpolator(new LinearInterpolator()).start();
break;
default:
fabReceive.hide();
fabSend.hide();
fabAddContact.animate().translationY(0)
.setInterpolator(new LinearInterpolator()).start();
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
ContextWrapper cw = new ContextWrapper(getApplicationContext());
photoDirectory = cw.getDir("profile", Context.MODE_PRIVATE);
if (!photoDirectory.exists()) {
photoDirectory.mkdir();
}
loadUserImage();
}
@Override
protected void onResume() {
super.onResume();
loadUserImage();
}
public void loadUserImage(){
//Search for a existing photo
File photoFile = new File(photoDirectory + File.separator + "photo.png");
if (photoFile.exists()){
Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getPath());
userImage.setImageBitmap(bitmap);
}
}
/**
* dispatch the user to the accounts fragment
*/
@OnClick(R.id.toolbar_user_img)
public void accounts() {
Intent intent = new Intent(this, AccountsActivity.class);
// SharedElementTransition is only available from API level 21
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
Pair p1 = Pair.create(userImage, "gravatarTransition");
Pair p2 = Pair.create(lightning, "lightningTransition");
Pair p3 = Pair.create(triangle, "triangleTransition");
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(this, p1, p2, p3);
startActivity(intent, options.toBundle());
} else {
startActivity(intent);
}
}
@OnClick(R.id.fabAddContact)
public void beginCreateContact(){
Intent intent = new Intent(this, CreateContactActivity.class);
startActivity(intent);
}
/*
* dispatch the user to the receive fragment using this account
*/
public void receiveToThisAccount() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("ReceiveDialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
long receiveCryptoNetAccountId;
if (this.cryptoNetAccountId != -1){
receiveCryptoNetAccountId = this.cryptoNetAccountId;
} else {
CryptoNetBalanceListViewModel cryptoNetBalanceListViewModel = ViewModelProviders.of(this).get(CryptoNetBalanceListViewModel.class);
receiveCryptoNetAccountId = cryptoNetBalanceListViewModel.getFirstBitsharesAccountId();
}
// Create and show the dialog.
ReceiveTransactionFragment newFragment = ReceiveTransactionFragment.newInstance(receiveCryptoNetAccountId);
newFragment.show(ft, "ReceiveDialog");
}
/*
* dispatch the user to the send fragment using this account
*/
public void sendFromThisAccount() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("SendDialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
long sendCryptoNetAccountId;
if (this.cryptoNetAccountId != -1){
sendCryptoNetAccountId = this.cryptoNetAccountId;
} else {
CryptoNetBalanceListViewModel cryptoNetBalanceListViewModel = ViewModelProviders.of(this).get(CryptoNetBalanceListViewModel.class);
sendCryptoNetAccountId = cryptoNetBalanceListViewModel.getFirstBitsharesAccountId();
}
// Create and show the dialog.
SendTransactionFragment newFragment = SendTransactionFragment.newInstance(sendCryptoNetAccountId);
newFragment.show(ft, "SendDialog");
}
private class BoardPagerAdapter extends FragmentStatePagerAdapter {
BoardPagerAdapter(FragmentManager fm) {
super(fm);
}
// Titles of the tabs
int[] tabTitles = {R.string.balances, R.string.transactions, R.string.contacts,R.string.Merchants};
@Override
public Fragment getItem(int position) {
switch (position){
case 0:
return new BalanceFragment();
case 1:
return new TransactionsFragment();
case 2:
return new ContactsFragment();
case 3:
return new MerchantsFragment();
}
return null; //new OnConstructionFragment();
}
@Override
public CharSequence getPageTitle(int position) {
return getString(tabTitles[position]);
}
@Override
public int getCount() {
return 4;
}
}
}