Preyea Regmi
5 years ago
15 changed files with 493 additions and 28 deletions
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java
-
5app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/view/payoutmode/PayoutModeSendMoneyFragment.java
-
172app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/FingerPrintAuthPromptDialog.java
-
25app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/SettingsView.java
-
32app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/adapter/ViewPagerAVDSplashAdapter.java
-
23app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/SplashScreen.java
-
17app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/avdfrags/SplashAVD1Fragment.java
-
17app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/avdfrags/SplashAVD2Fragment.java
-
16app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/avdfrags/SplashAVD3Fragment.java
-
91app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/view/avdfrags/SplashAnimatedViewPagerFragment.java
-
4app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptActivity.java
-
54app/src/main/res/layout/dialog_fingerprint_auth_prompt.xml
-
44app/src/main/res/layout/fragment_splash_avd_viewpager.xml
-
18app/src/main/res/layout/send_paymentmode_rv_viewholder.xml
-
1app/src/main/res/values/strings.xml
@ -1,45 +1,201 @@ |
|||
package com.gmeremit.online.gmeremittance_native.settings.view; |
|||
|
|||
import android.annotation.SuppressLint; |
|||
import android.app.Activity; |
|||
import android.app.Dialog; |
|||
import android.content.Intent; |
|||
import android.graphics.drawable.AnimatedVectorDrawable; |
|||
import android.os.Build; |
|||
import android.os.Bundle; |
|||
import android.os.Handler; |
|||
import android.support.graphics.drawable.AnimatedVectorDrawableCompat; |
|||
import android.support.v4.content.ContextCompat; |
|||
import android.support.v7.app.AlertDialog; |
|||
import android.view.Gravity; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.view.Window; |
|||
import android.widget.ImageView; |
|||
import android.widget.TextView; |
|||
import android.widget.Toast; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
import com.gmeremit.online.gmeremittance_native.customwidgets.GenericTextListingDialog; |
|||
import com.gmeremit.online.gmeremittance_native.customwidgets.LineDividerItemDecoration; |
|||
import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity; |
|||
import com.gmeremit.online.gmeremittance_native.utils.security.SecurityUtils; |
|||
import com.mtramin.rxfingerprint.data.FingerprintAuthenticationResult; |
|||
import com.mtramin.rxfingerprint.data.FingerprintDecryptionResult; |
|||
|
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import io.reactivex.Observable; |
|||
import io.reactivex.android.schedulers.AndroidSchedulers; |
|||
import io.reactivex.disposables.Disposable; |
|||
import io.reactivex.observers.DisposableObserver; |
|||
import io.reactivex.schedulers.Schedulers; |
|||
|
|||
public class FingerPrintAuthPromptDialog extends android.support.v4.app.DialogFragment { |
|||
|
|||
ImageView fingerprintScannerImgView; |
|||
View cancelView; |
|||
private AnimatedVectorDrawable fingerPrintAVD; |
|||
private AnimatedVectorDrawableCompat fingerPrintAVDCompat; |
|||
private FingerprintAuthListener listener; |
|||
private Disposable fingerPrintReaderSubs; |
|||
private boolean userAction; |
|||
private Window window; |
|||
|
|||
|
|||
@Override |
|||
public Dialog onCreateDialog(Bundle savedInstanceState) { |
|||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); |
|||
View view = getActivity().getLayoutInflater().inflate(R.layout.dialog_fingerprint_auth_prompt, null); |
|||
|
|||
fingerprintScannerImgView=view.findViewById(R.id.fingerprintScannerImgView); |
|||
cancelView=view.findViewById(R.id.btnCancel); |
|||
builder.setView(view); |
|||
initialize(); |
|||
Dialog dialog= builder.create(); |
|||
try { |
|||
this.window = dialog.getWindow(); |
|||
window.setBackgroundDrawableResource(R.drawable.ic_rounded_white); |
|||
|
|||
} catch (NullPointerException e) { |
|||
|
|||
initialize(); |
|||
return builder.create(); |
|||
} |
|||
return dialog; |
|||
|
|||
} |
|||
|
|||
private void initialize() { |
|||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
|||
fingerPrintAVD = (AnimatedVectorDrawable) ContextCompat.getDrawable(getActivity(), R.drawable.avd_fingerprint_off_to_on); |
|||
} else { |
|||
fingerPrintAVDCompat = (AnimatedVectorDrawableCompat) ContextCompat.getDrawable(getActivity(), R.drawable.avd_fingerprint_off_to_on); |
|||
} |
|||
} |
|||
|
|||
|
|||
public void setFingerprintAuthListener(boolean userAction,FingerprintAuthListener listener) |
|||
{ |
|||
this.userAction=userAction; |
|||
this.listener=listener; |
|||
} |
|||
|
|||
@Override |
|||
public void onStart() { |
|||
super.onStart(); |
|||
cancelView.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
dismiss(); |
|||
} |
|||
}); |
|||
if (fingerPrintReaderSubs==null||fingerPrintReaderSubs.isDisposed()) |
|||
fingerPrintReaderSubs = startObservingFingerPrintScanner(); |
|||
} |
|||
|
|||
@Override |
|||
public void onStop() { |
|||
super.onStop(); |
|||
cancelView.setOnClickListener(null); |
|||
if (fingerPrintReaderSubs != null && !fingerPrintReaderSubs.isDisposed()) |
|||
fingerPrintReaderSubs.dispose(); |
|||
} |
|||
|
|||
@Override |
|||
public void onResume() { |
|||
super.onResume(); |
|||
animateFingerPrintAppearAnimationIfRequired(true); |
|||
} |
|||
|
|||
Window window = getDialog().getWindow(); |
|||
if (window != null) { |
|||
window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); |
|||
window.setBackgroundDrawableResource(R.drawable.ic_rounded_grey_bg_with_inset); |
|||
@Override |
|||
public void onPause() { |
|||
super.onPause(); |
|||
animateFingerPrintAppearAnimationIfRequired(false); |
|||
|
|||
} |
|||
|
|||
@SuppressLint("NewApi") |
|||
private void animateFingerPrintAppearAnimationIfRequired(boolean action) { |
|||
if (action) { |
|||
new Handler().postDelayed(() -> { |
|||
if (fingerPrintAVD != null && !fingerPrintAVD.isRunning()) { |
|||
fingerprintScannerImgView.setImageDrawable(fingerPrintAVD); |
|||
fingerPrintAVD.start(); |
|||
} else if (fingerPrintAVDCompat != null && !fingerPrintAVDCompat.isRunning()) { |
|||
fingerprintScannerImgView.setImageDrawable(fingerPrintAVDCompat); |
|||
fingerPrintAVDCompat.start(); |
|||
} |
|||
|
|||
}, 200 ); |
|||
} else { |
|||
new Handler().postDelayed(() -> { |
|||
fingerprintScannerImgView.setImageDrawable(null); |
|||
}, 200); |
|||
} |
|||
} |
|||
|
|||
private Disposable startObservingFingerPrintScanner() { |
|||
return SecurityUtils.authenticateFingerPrint(getActivity()) |
|||
.subscribeOn(Schedulers.io()) |
|||
.flatMap(authentication -> { |
|||
switch (authentication.getResult()) { |
|||
case FAILED: |
|||
return io.reactivex.Observable.error(new SecurityUtils.FailedFingerPrintException(getString(R.string.fingerprint_not_recognized))); |
|||
case HELP: |
|||
return io.reactivex.Observable.error(new SecurityUtils.SensorNotReadyException(authentication.getMessage())); |
|||
case AUTHENTICATED: |
|||
return Observable.just(authentication); |
|||
default: |
|||
return io.reactivex.Observable.error(new Throwable(authentication.getMessage())); |
|||
} |
|||
|
|||
}) |
|||
.observeOn(AndroidSchedulers.mainThread()) |
|||
.retryWhen(errors->errors.flatMap( |
|||
error->{ |
|||
if(error instanceof SecurityUtils.FailedFingerPrintException || error instanceof SecurityUtils.SensorNotReadyException) |
|||
{ |
|||
showToastMessage(error.getMessage()); |
|||
return Observable.timer(100,TimeUnit.MILLISECONDS); |
|||
} |
|||
return Observable.error(error); |
|||
} |
|||
)) |
|||
.subscribeWith(new FingerPrintScannerObserver()); |
|||
} |
|||
|
|||
private void showToastMessage(String message) { |
|||
Toast toast=Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT); |
|||
TextView v = (TextView) toast.getView().findViewById(android.R.id.message); |
|||
if( v != null) v.setGravity(Gravity.CENTER); |
|||
toast.show(); |
|||
} |
|||
|
|||
|
|||
class FingerPrintScannerObserver extends DisposableObserver<FingerprintAuthenticationResult> { |
|||
|
|||
|
|||
@Override |
|||
public void onNext(FingerprintAuthenticationResult fingerprintAuthenticationResult) { |
|||
if(listener!=null) |
|||
listener.onFingerPrintAuthenticated(userAction); |
|||
} |
|||
|
|||
@Override |
|||
public void onError(Throwable e) { |
|||
showToastMessage(e.getMessage()); |
|||
} |
|||
|
|||
@Override |
|||
public void onComplete() { |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
public interface FingerprintAuthListener |
|||
{ |
|||
void onFingerPrintAuthenticated(boolean userAction); |
|||
} |
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.gmeremit.online.gmeremittance_native.splash_screen.adapter; |
|||
|
|||
import android.support.v4.app.Fragment; |
|||
import android.support.v4.app.FragmentManager; |
|||
import android.support.v4.app.FragmentPagerAdapter; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
public class ViewPagerAVDSplashAdapter extends FragmentPagerAdapter { |
|||
private List<Fragment> fraglist; |
|||
|
|||
public ViewPagerAVDSplashAdapter(FragmentManager fm) { |
|||
super(fm); |
|||
fraglist = new ArrayList<>(); |
|||
} |
|||
|
|||
@Override |
|||
public Fragment getItem(int i) { |
|||
return fraglist.get(i); |
|||
} |
|||
|
|||
@Override |
|||
public int getCount() { |
|||
return fraglist.size(); |
|||
} |
|||
|
|||
public void addFragments(List<Fragment> data) |
|||
{ |
|||
fraglist=data; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.gmeremit.online.gmeremittance_native.splash_screen.view.avdfrags; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
|
|||
public class SplashAVD1Fragment extends SplashAnimatedViewPagerFragment { |
|||
|
|||
|
|||
@Override |
|||
public int setupAVD() { |
|||
return R.drawable.avd_fingerprint_off_to_on; |
|||
} |
|||
|
|||
@Override |
|||
public String setupInfoText() { |
|||
return "This is first screen"; |
|||
} |
|||
} |
@ -0,0 +1,17 @@ |
|||
package com.gmeremit.online.gmeremittance_native.splash_screen.view.avdfrags; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
|
|||
public class SplashAVD2Fragment extends SplashAnimatedViewPagerFragment { |
|||
|
|||
|
|||
@Override |
|||
public int setupAVD() { |
|||
return R.drawable.avd_fingerprint_off_to_on; |
|||
} |
|||
|
|||
@Override |
|||
public String setupInfoText() { |
|||
return "This is second screen"; |
|||
} |
|||
} |
@ -0,0 +1,16 @@ |
|||
package com.gmeremit.online.gmeremittance_native.splash_screen.view.avdfrags; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
|
|||
public class SplashAVD3Fragment extends SplashAnimatedViewPagerFragment { |
|||
|
|||
@Override |
|||
public int setupAVD() { |
|||
return R.drawable.avd_fingerprint_off_to_on; |
|||
} |
|||
|
|||
@Override |
|||
public String setupInfoText() { |
|||
return "This is third screen"; |
|||
} |
|||
} |
@ -0,0 +1,91 @@ |
|||
package com.gmeremit.online.gmeremittance_native.splash_screen.view.avdfrags; |
|||
|
|||
import android.annotation.SuppressLint; |
|||
import android.graphics.drawable.AnimatedVectorDrawable; |
|||
import android.os.Build; |
|||
import android.os.Bundle; |
|||
import android.os.Handler; |
|||
import android.support.annotation.DrawableRes; |
|||
import android.support.annotation.Nullable; |
|||
import android.support.graphics.drawable.AnimatedVectorDrawableCompat; |
|||
import android.support.v4.content.ContextCompat; |
|||
import android.util.Log; |
|||
import android.view.LayoutInflater; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.widget.ImageView; |
|||
import android.widget.TextView; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
import com.gmeremit.online.gmeremittance_native.base.BaseFragment; |
|||
|
|||
import butterknife.BindView; |
|||
import butterknife.ButterKnife; |
|||
|
|||
public abstract class SplashAnimatedViewPagerFragment extends BaseFragment { |
|||
|
|||
public abstract @DrawableRes |
|||
int setupAVD(); |
|||
|
|||
public abstract String setupInfoText(); |
|||
|
|||
private @DrawableRes |
|||
int avdResId; |
|||
|
|||
@BindView(R.id.gmeTextView2) |
|||
TextView infoText; |
|||
@BindView(R.id.avdImage) |
|||
ImageView avdImageView; |
|||
|
|||
private AnimatedVectorDrawable fingerPrintAVD; |
|||
private AnimatedVectorDrawableCompat fingerPrintAVDCompat; |
|||
|
|||
private boolean isAnimationPlayed = false; |
|||
|
|||
@Override |
|||
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { |
|||
return inflater.inflate(R.layout.fragment_splash_avd_viewpager, container, false); |
|||
} |
|||
|
|||
@Override |
|||
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { |
|||
super.onViewCreated(view, savedInstanceState); |
|||
ButterKnife.bind(this, view); |
|||
init(); |
|||
performDefaultAction(savedInstanceState); |
|||
} |
|||
|
|||
private void performDefaultAction(Bundle savedInstanceState) { |
|||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
|||
fingerPrintAVD = (AnimatedVectorDrawable) ContextCompat.getDrawable(getActivity(), avdResId); |
|||
} else { |
|||
fingerPrintAVDCompat = (AnimatedVectorDrawableCompat) ContextCompat.getDrawable(getActivity(), avdResId); |
|||
} |
|||
infoText.setText(setupInfoText()); |
|||
} |
|||
|
|||
private void init() { |
|||
avdResId = setupAVD(); |
|||
|
|||
} |
|||
|
|||
@SuppressLint("NewApi") |
|||
@Override |
|||
public void setUserVisibleHint(boolean isVisibleToUser) { |
|||
Log.d("SplashAVD",""+ isVisibleToUser); |
|||
if (isVisibleToUser && !isAnimationPlayed && enableAnimationOnThisOS()) { |
|||
if (fingerPrintAVD != null && !fingerPrintAVD.isRunning()) { |
|||
avdImageView.setImageDrawable(fingerPrintAVD); |
|||
fingerPrintAVD.start(); |
|||
} else if (fingerPrintAVDCompat != null && !fingerPrintAVDCompat.isRunning()) { |
|||
avdImageView.setImageDrawable(fingerPrintAVDCompat); |
|||
fingerPrintAVDCompat.start(); |
|||
} |
|||
isAnimationPlayed=true; |
|||
} |
|||
} |
|||
|
|||
private boolean enableAnimationOnThisOS() { |
|||
return true; |
|||
} |
|||
} |
@ -1,6 +1,52 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<android.support.constraint.ConstraintLayout |
|||
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" |
|||
android:layout_height="match_parent"> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:orientation="vertical" |
|||
android:background="@drawable/dialog_round" |
|||
android:paddingTop="28dp"> |
|||
|
|||
</android.support.constraint.ConstraintLayout> |
|||
<ImageView |
|||
android:id="@+id/fingerprintScannerImgView" |
|||
android:layout_width="54dp" |
|||
android:layout_height="54dp" |
|||
android:layout_gravity="center" |
|||
/> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/txt_dialog_title" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginBottom="20dp" |
|||
android:layout_marginTop="25dp" |
|||
android:text="@string/important_text" |
|||
android:textColor="@color/cs_red" |
|||
android:textSize="18sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:layout_width="280dp" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginBottom="24dp" |
|||
android:gravity="center" |
|||
android:text="@string/touch_fingerprint_text" |
|||
android:textSize="14sp" /> |
|||
|
|||
<View |
|||
android:layout_width="match_parent" |
|||
android:layout_height="1dp" |
|||
android:background="#CDCED2" /> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/btnCancel" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginBottom="17dp" |
|||
android:layout_marginTop="14dp" |
|||
android:gravity="center" |
|||
android:text="@string/cancel_text" |
|||
android:textColor="@color/cs_red" |
|||
android:textSize="20sp" /> |
|||
</LinearLayout> |
@ -0,0 +1,44 @@ |
|||
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:app="http://schemas.android.com/apk/res-auto" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:id="@+id/relativeLayout2" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/colorPrimary"> |
|||
|
|||
|
|||
<FrameLayout |
|||
android:id="@+id/imageView5" |
|||
android:layout_width="150dp" |
|||
android:layout_height="150dp" |
|||
android:layout_marginEnd="8dp" |
|||
android:layout_marginStart="8dp" |
|||
android:background="@drawable/ic_send_money" |
|||
app:layout_constraintBottom_toBottomOf="parent" |
|||
app:layout_constraintEnd_toEndOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" |
|||
app:layout_constraintTop_toTopOf="parent" |
|||
app:layout_constraintVertical_bias="0.13" > |
|||
<ImageView |
|||
android:id="@+id/avdImage" |
|||
android:layout_width="150dp" |
|||
android:layout_height="150dp" /> |
|||
</FrameLayout> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/gmeTextView2" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:paddingStart="20dp" |
|||
android:paddingEnd="20dp" |
|||
android:layout_marginTop="12dp" |
|||
android:gravity="center" |
|||
android:text="@string/hassle_free_transfer_text" |
|||
android:textColor="@color/white" |
|||
android:textSize="18sp" |
|||
app:layout_constraintEnd_toEndOf="parent" |
|||
app:layout_constraintStart_toStartOf="parent" |
|||
app:layout_constraintTop_toBottomOf="@+id/imageView5" /> |
|||
|
|||
|
|||
</android.support.constraint.ConstraintLayout> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue