tangem-app-android-audited/app/src/main/java/com/tangem/presentation/activity/MainActivity.java
2018-07-19 15:59:07 +03:00

315 lines
No EOL
11 KiB
Java

package com.tangem.presentation.activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.PopupMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Transformation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.scottyab.rootbeer.RootBeer;
import com.skyfishjy.library.RippleBackground;
import com.tangem.domain.cardReader.FW;
import com.tangem.domain.wallet.DeviceNFCAntennaLocation;
import com.tangem.domain.wallet.Issuer;
import com.tangem.domain.wallet.LastSignStorage;
import com.tangem.domain.wallet.Logger;
import com.tangem.domain.wallet.PINStorage;
import com.tangem.presentation.dialog.RootFoundDialog;
import com.tangem.presentation.fragment.Main;
import com.tangem.util.CommonUtil;
import com.tangem.util.PhoneUtility;
import com.tangem.wallet.BuildConfig;
import com.tangem.wallet.R;
import java.io.File;
public class MainActivity extends AppCompatActivity implements PopupMenu.OnMenuItemClickListener {
public static final String TAG = MainActivity.class.getSimpleName();
private static final int REQUEST_CODE_SEND_EMAIL = 2;
private File zipFile = null;
private NfcAdapter.ReaderCallback onNFCReaderCallback;
private OnCardsClean onCardsClean;
private LinearLayout llTapPrompt;
private DeviceNFCAntennaLocation antenna;
private LinearLayout nfc;
private LinearLayout llHand;
public interface OnCardsClean {
void doClean();
}
public void setOnCardsClean(OnCardsClean onCardsClean) {
this.onCardsClean = onCardsClean;
}
public void setNfcAdapterReaderCallback(NfcAdapter.ReaderCallback callback) {
onNFCReaderCallback = callback;
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null && onNFCReaderCallback != null) {
onNFCReaderCallback.onTagDiscovered(tag);
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvNFCHint = findViewById(R.id.tvNFCHint);
llTapPrompt = findViewById(R.id.llTapPrompt);
llHand = findViewById(R.id.llHand);
ImageView ivHandCardHorizontal = findViewById(R.id.ivHandCardHorizontal);
ImageView ivHandCardVertical = findViewById(R.id.ivHandCardVertical);
nfc = findViewById(R.id.llNFC);
RippleBackground rippleBackground = findViewById(R.id.imNFC);
FloatingActionButton fab = findViewById(R.id.fab);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
commonInit(getApplicationContext());
rippleBackground.startRippleAnimation();
antenna = new DeviceNFCAntennaLocation();
antenna.getAntennaLocation();
try {
} catch (ActivityNotFoundException e) {
e.printStackTrace();
}
// set card orientation
switch (antenna.getOrientation()) {
case DeviceNFCAntennaLocation.CARD_ORIENTATION_HORIZONTAL:
ivHandCardHorizontal.setVisibility(View.VISIBLE);
ivHandCardVertical.setVisibility(View.GONE);
break;
case DeviceNFCAntennaLocation.CARD_ORIENTATION_VERTICAL:
ivHandCardVertical.setVisibility(View.VISIBLE);
ivHandCardHorizontal.setVisibility(View.GONE);
break;
}
// set card z position
switch (antenna.getZ()) {
case DeviceNFCAntennaLocation.CARD_ON_BACK:
llHand.setElevation(0.0f);
break;
case DeviceNFCAntennaLocation.CARD_ON_FRONT:
llHand.setElevation(30.0f);
break;
}
// set phone name
if (!antenna.getFullName().equals(""))
tvNFCHint.setText(String.format(getString(R.string.scan_banknote), antenna.getFullName()));
else
tvNFCHint.setText(String.format(getString(R.string.scan_banknote), getString(R.string.phone)));
animate();
// add fragment
Main main = (Main) getSupportFragmentManager().findFragmentById(R.id.fragmentMain);
if (main.getCardListAdapter().getItemCount() > 0)
showCleanButton();
else
hideCleanButton();
// NFC
Intent intent = getIntent();
if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()))) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (tag != null && onNFCReaderCallback != null) {
onNFCReaderCallback.onTagDiscovered(tag);
}
}
// check if root device
RootBeer rootBeer = new RootBeer(this);
if (rootBeer.isRootedWithoutBusyBoxCheck() && !BuildConfig.DEBUG)
new RootFoundDialog().show(getFragmentManager(), RootFoundDialog.TAG);
// set listeners
fab.setOnClickListener(this::showMenu);
}
@Override
protected void onResume() {
super.onResume();
animate();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_SEND_EMAIL) {
if (zipFile != null) {
zipFile.delete();
zipFile = null;
}
}
super.onActivityResult(requestCode, resultCode, data);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
return onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
if (BuildConfig.DEBUG) {
for (int i = 0; i < menu.size(); i++) menu.getItem(i).setVisible(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
// noinspection SimplifiableIfStatement
switch (id) {
case R.id.sendLogs:
File f = null;
try {
f = Logger.collectLogs(this);
if (f != null) {
// Log.e(TAG, String.format("Collect %d log bytes", f.length()));
CommonUtil.sendEmail(this, zipFile, TAG, "Logs", PhoneUtility.getDeviceInfo(), new File[]{f});
} else {
// Log.e(TAG, "Can't create temporaly log file");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (f != null && f.exists()) {
f.delete();
}
}
return true;
case R.id.managePIN:
showSavePinActivity();
return true;
case R.id.managePIN2:
showSavePin2Activity();
return true;
case R.id.cleanCards:
onCardsClean.doClean();
hideCleanButton();
return true;
case R.id.about:
showLogoActivity();
return true;
}
return super.onOptionsItemSelected(item);
}
public static void commonInit(Context context) {
if (PINStorage.needInit()) {
PINStorage.Init(context);
}
if (LastSignStorage.needInit()) {
LastSignStorage.Init(context);
}
if (Issuer.needInit()) Issuer.Init(context);
if (FW.needInit()) FW.Init(context);
}
public void showCleanButton() {
llTapPrompt.setVisibility(View.INVISIBLE);
}
public void hideCleanButton() {
llTapPrompt.setVisibility(View.VISIBLE);
}
private void showLogoActivity() {
Intent intent = new Intent(getBaseContext(), LogoActivity.class);
intent.putExtra(LogoActivity.Companion.getTAG(), true);
intent.putExtra(LogoActivity.EXTRA_AUTO_HIDE, false);
startActivity(intent);
}
private void animate() {
final RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) llHand.getLayoutParams();
final RelativeLayout.LayoutParams lp2 = (RelativeLayout.LayoutParams) nfc.getLayoutParams();
final float dp = getResources().getDisplayMetrics().density;
final float lm = dp * (69 + antenna.getX() * 75);
lp.topMargin = (int) (dp * (-100 + antenna.getY() * 250));
lp2.topMargin = (int) (dp * (-125 + antenna.getY() * 250));
nfc.setLayoutParams(lp2);
Animation a = new Animation() {
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
lp.leftMargin = (int) (lm * interpolatedTime);
llHand.setLayoutParams(lp);
}
};
a.setDuration(2000);
a.setInterpolator(new DecelerateInterpolator());
llHand.startAnimation(a);
}
private void showSavePinActivity() {
Intent intent = new Intent(getBaseContext(), SavePINActivity.class);
intent.putExtra("PIN2", false);
startActivity(intent);
}
private void showSavePin2Activity() {
Intent intent = new Intent(getBaseContext(), SavePINActivity.class);
intent.putExtra("PIN2", true);
startActivity(intent);
}
private void showMenu(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.menu_main, popup.getMenu());
if (BuildConfig.DEBUG) {
popup.getMenu().findItem(R.id.managePIN).setEnabled(true);
popup.getMenu().findItem(R.id.managePIN2).setEnabled(true);
popup.getMenu().findItem(R.id.sendLogs).setVisible(true);
}
popup.setOnMenuItemClickListener(this);
popup.show();
}
}