Improve Send and Receive Transaction layouts to dynamically adjust to different screen sizes. Removed unnecessary SquaredImageView, the same effect can now be achieved with Android's ConstraintLayout.

This commit is contained in:
Severiano Jaramillo 2018-11-21 11:45:57 -06:00
parent aec93ddb22
commit 96881f3292
5 changed files with 100 additions and 199 deletions

View file

@ -31,7 +31,6 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.Window; import android.view.Window;
import android.widget.ArrayAdapter; import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Spinner; import android.widget.Spinner;
@ -133,12 +132,8 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
@BindView(R.id.viewCamera) @BindView(R.id.viewCamera)
View viewCamera; View viewCamera;
/* /* Flag to control when the camera is visible and when is hidden */
* Flag to control when the camera is visible and when is hide private boolean cameraVisible = false;
* */
private boolean cameraVisible = true;
Button btnScanQrCode;
private long cryptoNetAccountId; private long cryptoNetAccountId;
private CryptoNetAccount cryptoNetAccount; private CryptoNetAccount cryptoNetAccount;
@ -233,41 +228,9 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
loadUserImage(); loadUserImage();
/* /* Check for CAMERA permission */
* Check for CAMERA permission if (Build.VERSION.SDK_INT >= 23 && !checkCameraPermission())
* */ requestCameraPermission();
if (Build.VERSION.SDK_INT >= 23) {
if (checkPermission()) {
// Code for above or equal 23 API Oriented Device
// Your Permission granted already .Do next code
/*
* Init the camera
* */
try {
beginScanQrCode();
}catch(Exception e){
e.printStackTrace();
}
} else {
requestPermission(); // Code for permission
}
}
else {
// Code for Below 23 API Oriented Device
// Do next code
/*
* Init the camera
* */
try {
beginScanQrCode();
}catch(Exception e){
e.printStackTrace();
}
}
return builder.setView(view).create(); return builder.setView(view).create();
} }
@ -325,38 +288,24 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
} }
} }
private void requestPermission() { private boolean checkCameraPermission() {
int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
return result == PackageManager.PERMISSION_GRANTED;
}
private void requestCameraPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) { if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {
Toast.makeText(getActivity(), getActivity().getString(R.string.permission_denied_camera), Toast.LENGTH_LONG).show(); Toast.makeText(getActivity(), getActivity().getString(R.string.permission_denied_camera), Toast.LENGTH_LONG).show();
/* /* Disable the button of the camera visibility */
* Disable the button of the camera visibility btnCloseCamera.setVisibility(View.INVISIBLE);
* */
disableVisibilityCamera();
} else { } else {
requestPermissions(new String[] {android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION); requestPermissions(new String[] {android.Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} }
} }
private void disableVisibilityCamera(){
/*
* Hide the button, the user can not modify the visibility
* */
btnCloseCamera.setVisibility(View.INVISIBLE);
}
private boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA);
if (result == PackageManager.PERMISSION_GRANTED) {
return true;
} else {
return false;
}
}
@Override @Override
@ -374,15 +323,6 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
} }
}); });
/*
* Init the camera
* */
try {
beginScanQrCode();
}catch(Exception e){
e.printStackTrace();
}
} else { } else {
Log.e("value", "Permission Denied, You cannot use the camera."); Log.e("value", "Permission Denied, You cannot use the camera.");
@ -401,12 +341,6 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
super.onResume(); super.onResume();
mScannerView.setResultHandler(this); mScannerView.setResultHandler(this);
mScannerView.startCamera(); mScannerView.startCamera();
/*builder.setNeutralButton("Scan QR Code", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
beginScanQrCode();
}
});*/
// Force dialog fragment to use the full width of the screen // Force dialog fragment to use the full width of the screen
Window dialogWindow = getDialog().getWindow(); Window dialogWindow = getDialog().getWindow();
@ -475,67 +409,44 @@ public class SendTransactionFragment extends DialogFragment implements UIValidat
@OnClick(R.id.fabCloseCamera) @OnClick(R.id.fabCloseCamera)
public void onClicCloseCamera(){ public void onClickCloseCamera(){
mScannerView.stopCamera(); if(cameraVisible)
/*
* Hide the camera or show it
* */
if(cameraVisible){
hideCamera(); hideCamera();
} else
else{
showCamera(); showCamera();
}
} }
/* /**
* Show the camera and hide the black background * Shows the camera and hide the black background
* */ * */
private void showCamera(){ private void showCamera(){
/* Change visibilities of views */
/*
* Change visibilities of views
* */
viewCamera.setVisibility(View.GONE); viewCamera.setVisibility(View.GONE);
mScannerView.setVisibility(View.VISIBLE); mScannerView.setVisibility(View.VISIBLE);
/* /* Change icon */
* Change icon
* */
btnCloseCamera.setImageDrawable(getResources().getDrawable(R.drawable.ic_close)); btnCloseCamera.setImageDrawable(getResources().getDrawable(R.drawable.ic_close));
/* /* Reset variable */
* Reset variable
* */
cameraVisible = true; cameraVisible = true;
/* /* Star the camera again */
* Star the camera again
* */
beginScanQrCode(); beginScanQrCode();
} }
/* /**
* Hide the camera and show the black background * Hides the camera and show the black background
* */ * */
private void hideCamera(){ private void hideCamera(){
/* Change visibilities of views */
/*
* Change visibilities of views
* */
viewCamera.setVisibility(View.VISIBLE); viewCamera.setVisibility(View.VISIBLE);
mScannerView.setVisibility(View.INVISIBLE); mScannerView.setVisibility(View.INVISIBLE);
/* /* Change icon */
* Change icon
* */
btnCloseCamera.setImageDrawable(getResources().getDrawable(R.drawable.ok)); btnCloseCamera.setImageDrawable(getResources().getDrawable(R.drawable.ok));
/* /* Reset variable */
* Reset variable
* */
cameraVisible = false; cameraVisible = false;
} }

View file

@ -1,33 +0,0 @@
package cy.agorise.crystalwallet.util;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;
/**
* Created by xd on 1/24/18.
* ImageView which adjusts its size to always create a square
*/
public class SquaredImageView extends AppCompatImageView {
public SquaredImageView(Context context) {
super(context);
}
public SquaredImageView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SquaredImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
setMeasuredDimension(size, size);
}
}

View file

@ -5,20 +5,28 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<RelativeLayout <android.support.constraint.ConstraintLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingBottom="24dp"> android:paddingBottom="24dp">
<android.support.constraint.Guideline
android:id="@+id/centeredVerticalGuideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5"/>
<View <View
android:id="@+id/topView" android:id="@+id/topView"
android:layout_width="match_parent" android:layout_width="match_parent"
android:background="@drawable/receive_transaction_top_view"
android:layout_height="120dp" android:layout_height="120dp"
android:layout_marginEnd="0dp" android:layout_marginEnd="0dp"
android:layout_marginStart="0dp" android:layout_marginStart="0dp"
android:layout_marginTop="0dp" android:layout_marginTop="0dp"
android:layout_alignParentTop="true"/> android:background="@drawable/receive_transaction_top_view"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<TextView <TextView
android:id="@+id/txtTittle" android:id="@+id/txtTittle"
@ -30,91 +38,105 @@
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="20sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:layout_alignParentTop="true" /> app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<cy.agorise.crystalwallet.util.CircularImageView <cy.agorise.crystalwallet.util.CircularImageView
android:id="@+id/gravatar" android:id="@+id/gravatar"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="60dp" android:layout_height="60dp"
android:layout_below="@+id/txtTittle"
android:layout_marginStart="32dp" android:layout_marginStart="32dp"
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
android:src="@drawable/avatar_placeholder" /> android:src="@drawable/avatar_placeholder"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtTittle" />
<Spinner <Spinner
android:id="@+id/spTo" android:id="@+id/spTo"
android:layout_width="200dp" android:layout_width="200dp"
android:layout_height="50dp" android:layout_height="50dp"
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
android:layout_below="@+id/txtTittle" android:layout_marginEnd="20dp"
android:layout_alignParentRight="true" app:layout_constraintTop_toBottomOf="@+id/txtTittle"
android:layout_marginRight="20dp"/> app:layout_constraintEnd_toEndOf="parent" />
<TextView <TextView
android:id="@+id/tvFromError" android:id="@+id/tvFromError"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/red" android:textColor="@color/red"
android:layout_below="@+id/gravatar" app:layout_constraintTop_toBottomOf="@+id/spTo"
android:layout_marginTop="10dp"/> app:layout_constraintStart_toStartOf="@id/spTo"
app:layout_constraintEnd_toEndOf="@id/spTo" />
<EditText <EditText
android:id="@+id/etAmount" android:id="@+id/etAmount"
android:layout_width="150dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/tvFromError"
android:layout_marginStart="24dp"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
android:layout_marginStart="24dp"
android:layout_marginEnd="12dp"
android:hint="@string/amount" android:hint="@string/amount"
android:inputType="numberDecimal" android:inputType="numberDecimal"
android:textSize="20sp" /> android:textSize="20sp"
app:layout_constraintTop_toBottomOf="@+id/tvFromError"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/centeredVerticalGuideline"/>
<TextView <TextView
android:id="@+id/tvAmountError" android:id="@+id/tvAmountError"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/red" android:textColor="@color/red"
android:layout_below="@+id/etAmount"/> app:layout_constraintTop_toBottomOf="@+id/etAmount"
app:layout_constraintStart_toStartOf="@id/etAmount"
app:layout_constraintEnd_toEndOf="@id/etAmount"/>
<Spinner <Spinner
android:id="@+id/spAsset" android:id="@+id/spAsset"
android:layout_width="150dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginEnd="24dp" android:layout_marginEnd="24dp"
android:layout_marginTop="25dp" android:layout_marginBottom="4dp"
android:gravity="top"
android:inputType="textMultiLine" android:inputType="textMultiLine"
android:layout_below="@+id/tvFromError"
android:textColor="@color/white" android:textColor="@color/white"
android:layout_alignParentRight="true" app:layout_constraintStart_toEndOf="@id/centeredVerticalGuideline"
android:layout_marginRight="20dp"/> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toTopOf="@id/viewSpinner"/>
<View <View
android:id="@+id/viewSpinner" android:id="@+id/viewSpinner"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="3dp" android:layout_height="1dp"
android:layout_marginTop="5dp" android:layout_marginBottom="8dp"
android:background="@color/gray" /> android:background="@color/gray"
app:layout_constraintBottom_toBottomOf="@id/etAmount"
app:layout_constraintStart_toStartOf="@id/spAsset"
app:layout_constraintEnd_toEndOf="@id/spAsset"/>
<TextView <TextView
android:id="@+id/tvAssetError" android:id="@+id/tvAssetError"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/red" android:textColor="@color/red"
android:layout_below="@+id/spAsset"/> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/spAsset" />
<cy.agorise.crystalwallet.util.SquaredImageView <ImageView
android:id="@+id/ivQrCode" android:id="@+id/ivQrCode"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_marginEnd="24dp" android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:layout_marginRight="24dp"
android:adjustViewBounds="true" android:adjustViewBounds="true"
android:contentDescription="@string/qr_code" android:contentDescription="@string/qr_code"
android:src="@color/gray" android:src="@color/gray"
android:layout_below="@+id/tvAmountError" app:layout_constraintDimensionRatio="w,1:1"
android:layout_centerHorizontal="true"/> app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvAmountError" />
<TextView <TextView
android:id="@+id/tvShare" android:id="@+id/tvShare"
@ -126,7 +148,8 @@
android:text="@string/share_this_qr" android:text="@string/share_this_qr"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
android:layout_below="@+id/ivQrCode" /> app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ivQrCode" />
<TextView <TextView
android:id="@+id/tvCancel" android:id="@+id/tvCancel"
@ -137,9 +160,9 @@
android:text="@string/close" android:text="@string/close"
android:textSize="18sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
android:layout_below="@+id/ivQrCode" app:layout_constraintTop_toBottomOf="@+id/ivQrCode"
android:layout_alignParentRight="true"/> app:layout_constraintRight_toRightOf="parent" />
</RelativeLayout> </android.support.constraint.ConstraintLayout>
</ScrollView> </ScrollView>

View file

@ -120,15 +120,17 @@
<EditText <EditText
android:id="@+id/etAmount" android:id="@+id/etAmount"
android:layout_width="150dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginStart="24dp" android:layout_marginStart="24dp"
android:layout_marginEnd="12dp"
android:inputType="numberDecimal" android:inputType="numberDecimal"
android:textSize="20sp" android:textSize="20sp"
android:hint="@string/amount" android:hint="@string/amount"
app:layout_constraintTop_toBottomOf="@+id/tvToError"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvToError" /> app:layout_constraintEnd_toStartOf="@id/centeredVerticalGuideline"/>
<TextView <TextView
android:id="@+id/tvAmountError" android:id="@+id/tvAmountError"
@ -141,15 +143,15 @@
<Spinner <Spinner
android:id="@+id/spAsset" android:id="@+id/spAsset"
android:layout_width="150dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="24dp"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginEnd="24dp"
android:layout_marginStart="12dp"
android:gravity="top" android:gravity="top"
android:inputType="textMultiLine" app:layout_constraintTop_toTopOf="@+id/etAmount"
android:textColor="@color/white"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/etAmount" /> app:layout_constraintStart_toEndOf="@id/centeredVerticalGuideline"/>
<View <View
android:id="@+id/viewSpinner" android:id="@+id/viewSpinner"
@ -212,7 +214,7 @@
app:fabSize="mini" app:fabSize="mini"
app:layout_constraintStart_toEndOf="@id/centeredVerticalGuideline" app:layout_constraintStart_toEndOf="@id/centeredVerticalGuideline"
app:layout_constraintTop_toBottomOf="@+id/tvScan" app:layout_constraintTop_toBottomOf="@+id/tvScan"
app:srcCompat="@drawable/ic_close" /> app:srcCompat="@drawable/ok" />
<me.dm7.barcodescanner.zxing.ZXingScannerView <me.dm7.barcodescanner.zxing.ZXingScannerView
android:id="@+id/ivCamera" android:id="@+id/ivCamera"
@ -232,10 +234,7 @@
android:background="@color/black" android:background="@color/black"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_marginBottom="24dp" android:visibility="visible"
android:layout_marginStart="24dp"
android:layout_marginTop="8dp"
android:visibility="gone"
android:src="#666" android:src="#666"
app:layout_constraintTop_toTopOf="@id/ivCamera" app:layout_constraintTop_toTopOf="@id/ivCamera"
app:layout_constraintStart_toStartOf="@id/ivCamera" app:layout_constraintStart_toStartOf="@id/ivCamera"

View file

@ -14,6 +14,7 @@
<style name="dialog_theme_full" parent="android:Theme" > <style name="dialog_theme_full" parent="android:Theme" >
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item> <item name="android:windowIsFloating">false</item>
<item name="android:windowAnimationStyle">@style/SendTransactionAnimation.Window</item>
</style> </style>
<style name="ActivityDialog" parent="Theme.AppCompat.Light.NoActionBar"> <style name="ActivityDialog" parent="Theme.AppCompat.Light.NoActionBar">