Preyea Regmi
4 years ago
44 changed files with 793 additions and 163 deletions
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/presenter/ChangePasswordV2Presenter.java
-
6app/src/main/java/com/gmeremit/online/gmeremittance_native/changepasswordV2/view/ChangePasswordV2Activity.java
-
4app/src/main/java/com/gmeremit/online/gmeremittance_native/domesticremit/send/presenter/DomesticRemitPresenterImpl.java
-
4app/src/main/java/com/gmeremit/online/gmeremittance_native/exrate/presenter/ExchangeRatePresenter.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/presenter/HomeV2Presenter.java
-
42app/src/main/java/com/gmeremit/online/gmeremittance_native/homeV2/view/HomeActivityV2.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/kycV3/presenter/KYCV3ViewModel.java
-
5app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/gateway/LoginV2Gateway.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/presenter/LoginV2Presenter.java
-
6app/src/main/java/com/gmeremit/online/gmeremittance_native/loginV2/view/LoginV2Activity.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/registerV2/presenter/RegisterV2Presenter.java
-
6app/src/main/java/com/gmeremit/online/gmeremittance_native/registerV2/view/RegisterV2Activity.java
-
4app/src/main/java/com/gmeremit/online/gmeremittance_native/resendV2/presenter/resend/ReSendMoneyV2Presenter.java
-
183app/src/main/java/com/gmeremit/online/gmeremittance_native/security/GMEAuthManager.java
-
147app/src/main/java/com/gmeremit/online/gmeremittance_native/security/auth/GMEUserPasswordPromptBottomSheetDialog.java
-
270app/src/main/java/com/gmeremit/online/gmeremittance_native/security/auth/GMEUserProfileChangeOTPRequestBottomSheetDialog.java
-
5app/src/main/java/com/gmeremit/online/gmeremittance_native/security/securitykeypad/EncryptionManager.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/security/securitykeypad/SecurityKeyboardManager.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/security/securitykeypad/SecurityKeyboardView.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/security/securitykeypad/SecurityKeypadRequestParamBuilder.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/security/utils/AESEncryptionHelper.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/security/utils/SecurityUtils.java
-
4app/src/main/java/com/gmeremit/online/gmeremittance_native/security/utils/SignatureCheck.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/sendmoneyV2/presenter/SendMoneyV2Presenter.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/FingerPrintAuthPromptDialog.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/settings/view/SettingsView.java
-
5app/src/main/java/com/gmeremit/online/gmeremittance_native/splash_screen/presenter/SplashScreenPresenter.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/topup/local/presenter/topup/LocalTopUpPresenter.java
-
3app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/presenter/TransactionPasswordPromptV2Presenter.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionBiometricPromptDialog.java
-
6app/src/main/java/com/gmeremit/online/gmeremittance_native/transactionpasspromt/view/TransactionPasswordPromptActivity.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/https/HTTPConstants.java
-
91app/src/main/java/com/gmeremit/online/gmeremittance_native/utils/security/GMEAuthManager.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/webbrowserV2/WebBrowserFragmentV2.java
-
2app/src/main/java/com/gmeremit/online/gmeremittance_native/webbrowserV2/WebBrowserV2Activity.java
-
6app/src/main/res/drawable/bg_window_top_inset.xml
-
2app/src/main/res/drawable/ic_rounded_password_prompt.xml
-
4app/src/main/res/drawable/ic_rounded_password_prompt_bg.xml
-
6app/src/main/res/layout/activity_change_password_v2.xml
-
2app/src/main/res/layout/activity_login_v2.xml
-
2app/src/main/res/layout/activity_register_v2.xml
-
2app/src/main/res/layout/activity_transaction_password_prompt.xml
-
101app/src/main/res/layout/gme_user_pwd_prompt_modal.xml
-
4app/src/main/res/values/styles.xml
@ -0,0 +1,183 @@ |
|||
package com.gmeremit.online.gmeremittance_native.security; |
|||
|
|||
import android.content.SharedPreferences; |
|||
|
|||
import androidx.appcompat.app.AppCompatActivity; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.GmeApplication; |
|||
import com.gmeremit.online.gmeremittance_native.base.PrefKeys; |
|||
import com.gmeremit.online.gmeremittance_native.security.auth.GMEUserPasswordPromptBottomSheetDialog; |
|||
import com.gmeremit.online.gmeremittance_native.security.auth.GMEUserProfileChangeOTPRequestBottomSheetDialog; |
|||
import com.gmeremit.online.gmeremittance_native.security.utils.SecurityUtils; |
|||
import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionBiometricPromptDialog; |
|||
|
|||
import static com.gmeremit.online.gmeremittance_native.utils.https.HTTPConstants.INVALID_REQUEST; |
|||
|
|||
/** |
|||
* @author Preyea R. Regmi |
|||
* This class acts as a high level controller to orchestrates different authentication requirement for GME Services. |
|||
* The purpose of this class is to act as middleware and abstract underlying authentication process from various GME Services such as Remittacne,Topup etc. |
|||
*/ |
|||
public class GMEAuthManager { |
|||
|
|||
public static final String TAG="GMEAuthManager"; |
|||
|
|||
|
|||
|
|||
private AppCompatActivity context; |
|||
private GMEAuthListener listener; |
|||
private String paymentSourceType; |
|||
private GMEAuthType explicitlyRequestedAuthType; |
|||
|
|||
private GMEAuthManager(AppCompatActivity context) { |
|||
this.context = context; |
|||
resetParamToDefault(); |
|||
} |
|||
|
|||
private void resetParamToDefault() { |
|||
listener = null; |
|||
paymentSourceType = null; |
|||
explicitlyRequestedAuthType = null; |
|||
} |
|||
|
|||
public static GMEAuthManager getGmeAuthManager(AppCompatActivity context) { |
|||
return new GMEAuthManager(context); |
|||
} |
|||
|
|||
|
|||
public GMEAuthManager setListener(GMEAuthListener listener) { |
|||
this.listener = listener; |
|||
return this; |
|||
} |
|||
|
|||
|
|||
public GMEAuthManager fromPaymentSource(String paymentSourceType) { |
|||
this.paymentSourceType = paymentSourceType; |
|||
this.explicitlyRequestedAuthType = null; |
|||
|
|||
return this; |
|||
} |
|||
|
|||
public GMEAuthManager requestExplicitly(GMEAuthType gmeAuthType) { |
|||
this.explicitlyRequestedAuthType = gmeAuthType; |
|||
this.paymentSourceType = null; |
|||
return this; |
|||
} |
|||
|
|||
public void prompt() { |
|||
if (explicitlyRequestedAuthType != null) { |
|||
startAuthFromRequestedAuthType(); |
|||
} else { |
|||
startAuthFromPaymentSourceType(); |
|||
} |
|||
|
|||
} |
|||
|
|||
private void startAuthFromPaymentSourceType() { |
|||
if ("wallet".equalsIgnoreCase(paymentSourceType)) |
|||
if (checkIfUserHasEnabledBiometric()) |
|||
showBiometricAuthPrompt(); |
|||
else |
|||
showUserPasswordPrompt(); |
|||
else if ("autodebit".equalsIgnoreCase(paymentSourceType)) |
|||
showOTPTxnPrompt(); |
|||
else |
|||
returnInvalidRequest(); |
|||
} |
|||
|
|||
private void returnInvalidRequest() { |
|||
if (listener != null) |
|||
listener.onGMEAuthFailed("Payment source not recognized.\n" + INVALID_REQUEST); |
|||
} |
|||
|
|||
private void returnSecret(String secret) |
|||
{ |
|||
if(listener!=null) |
|||
listener.onGMEAuthSuccess(secret); |
|||
} |
|||
|
|||
private void showUserPasswordPrompt() { |
|||
GMEUserPasswordPromptBottomSheetDialog.showPromptView(new GMEUserPasswordPromptBottomSheetDialog.GMEUserPasswordPromptListener() { |
|||
@Override |
|||
public void onUserPasswordReceived(String secret) { |
|||
returnSecret(secret); |
|||
} |
|||
}).show(context.getSupportFragmentManager(), GMEUserPasswordPromptBottomSheetDialog.class.getSimpleName()); |
|||
} |
|||
|
|||
private void showBiometricAuthPrompt() { |
|||
TransactionBiometricPromptDialog promptDialog = new TransactionBiometricPromptDialog(); |
|||
promptDialog.show(context.getSupportFragmentManager(), promptDialog.getClass().getSimpleName()); |
|||
} |
|||
|
|||
private void showOTPTxnPrompt() { |
|||
TransactionBiometricPromptDialog promptDialog = new TransactionBiometricPromptDialog(); |
|||
promptDialog.show(context.getSupportFragmentManager(), promptDialog.getClass().getSimpleName()); |
|||
} |
|||
|
|||
|
|||
private void showOTPProfilePrompt(boolean initiallyRequestOTP) { |
|||
GMEUserProfileChangeOTPRequestBottomSheetDialog.showPromptView(initiallyRequestOTP, -1, new GMEUserProfileChangeOTPRequestBottomSheetDialog.GMEUserProfileChangeOTPRequestListener() { |
|||
@Override |
|||
public void onOTPSubmittedSucessfully(String secret) { |
|||
returnSecret(secret); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onOTPRequestFailed() { |
|||
|
|||
} |
|||
}).show(context.getSupportFragmentManager(), GMEUserPasswordPromptBottomSheetDialog.class.getSimpleName()); |
|||
} |
|||
|
|||
private boolean checkIfUserHasEnabledBiometric() { |
|||
|
|||
SharedPreferences storage = GmeApplication.getStorage(); |
|||
boolean isFingerPrintAuthEnabled = storage.getBoolean(PrefKeys.APP_FINGER_PRINT_ENABLED, false); |
|||
String persistedUserID = storage.getString(PrefKeys.APP_USER_ID_SECRET_KEY, ""); |
|||
String persistedUserPwd = storage.getString(PrefKeys.APP_USER_SECRET_KEY, ""); |
|||
return SecurityUtils.checkFingerPrintUsablity(context) && isFingerPrintAuthEnabled && persistedUserID != null && persistedUserPwd != null; |
|||
|
|||
} |
|||
|
|||
private void startAuthFromRequestedAuthType() { |
|||
if (explicitlyRequestedAuthType != null) { |
|||
switch (explicitlyRequestedAuthType) { |
|||
case OTP_TXN: |
|||
showOTPTxnPrompt(); |
|||
break; |
|||
|
|||
case OTP_PROFILE_REQUEST: |
|||
showOTPProfilePrompt(true); |
|||
break; |
|||
|
|||
case OTP_PROFILE_SUBMIT: |
|||
showOTPProfilePrompt(false); |
|||
break; |
|||
|
|||
case BIOMETRIC: |
|||
showBiometricAuthPrompt(); |
|||
break; |
|||
|
|||
case USER_PASSWORD: |
|||
showUserPasswordPrompt(); |
|||
break; |
|||
|
|||
default: |
|||
returnInvalidRequest(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
public interface GMEAuthListener { |
|||
void onGMEAuthSuccess(String secret); |
|||
|
|||
void onGMEAuthFailed(String errorReason); |
|||
} |
|||
|
|||
public enum GMEAuthType { |
|||
USER_PASSWORD, BIOMETRIC, OTP_PROFILE_REQUEST, OTP_PROFILE_SUBMIT, OTP_TXN |
|||
} |
|||
} |
@ -0,0 +1,147 @@ |
|||
package com.gmeremit.online.gmeremittance_native.security.auth; |
|||
|
|||
import android.app.Dialog; |
|||
import android.content.Intent; |
|||
import android.content.res.Resources; |
|||
import android.os.Bundle; |
|||
import android.view.LayoutInflater; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.widget.FrameLayout; |
|||
import android.widget.RelativeLayout; |
|||
import android.widget.TextView; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
import com.gmeremit.online.gmeremittance_native.security.GMEAuthManager; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardManager; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardView; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeypadRequestParamBuilder; |
|||
import com.google.android.material.bottomsheet.BottomSheetBehavior; |
|||
import com.google.android.material.bottomsheet.BottomSheetDialog; |
|||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; |
|||
|
|||
import butterknife.BindView; |
|||
import butterknife.ButterKnife; |
|||
|
|||
public class GMEUserPasswordPromptBottomSheetDialog extends BottomSheetDialogFragment { |
|||
|
|||
private GMEUserPasswordPromptListener listener; |
|||
private SecurityKeypadListener securityKeypadListener; |
|||
|
|||
SecurityKeyboardManager securityKeyboardManager; |
|||
|
|||
@BindView(R.id.securityKeyboard) |
|||
SecurityKeyboardView securityKeyboardView; |
|||
|
|||
@BindView(R.id.keypadContainer) |
|||
FrameLayout keypadContainer; |
|||
|
|||
@BindView(R.id.keypadBallon) |
|||
RelativeLayout ballonView; |
|||
|
|||
@BindView(R.id.title) |
|||
TextView title; |
|||
|
|||
public static GMEUserPasswordPromptBottomSheetDialog showPromptView(GMEUserPasswordPromptListener listener) { |
|||
GMEUserPasswordPromptBottomSheetDialog gmeUserPasswordPromptBottomSheetDialog = new GMEUserPasswordPromptBottomSheetDialog(); |
|||
gmeUserPasswordPromptBottomSheetDialog.setListener(listener); |
|||
return gmeUserPasswordPromptBottomSheetDialog; |
|||
} |
|||
|
|||
private void setListener(GMEUserPasswordPromptListener listener) { |
|||
this.listener=listener; |
|||
} |
|||
|
|||
@Override |
|||
public void onCreate(Bundle savedInstanceState) { |
|||
super.onCreate(savedInstanceState); |
|||
setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogThemeWithInset); |
|||
} |
|||
|
|||
@Override |
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container, |
|||
Bundle savedInstanceState) { |
|||
View v = inflater.inflate(R.layout.gme_user_pwd_prompt_modal, container, false); |
|||
ButterKnife.bind(this, v); |
|||
init(); |
|||
return v; |
|||
} |
|||
|
|||
@Override |
|||
public Dialog onCreateDialog(Bundle savedInstanceState) { |
|||
BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); |
|||
bottomSheetDialog.setOnShowListener(dialog -> { |
|||
BottomSheetDialog dialogc = (BottomSheetDialog) dialog; |
|||
FrameLayout bottomSheet = dialogc.findViewById(com.google.android.material.R.id.design_bottom_sheet); |
|||
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); |
|||
int bottomSheetHeight = Resources.getSystem().getDisplayMetrics().heightPixels; |
|||
bottomSheetBehavior.setPeekHeight(bottomSheetHeight); |
|||
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); |
|||
}); |
|||
return bottomSheetDialog; |
|||
} |
|||
|
|||
private void init() { |
|||
securityKeypadListener=new SecurityKeypadListener(); |
|||
securityKeyboardView.setKeyboardContainerView(keypadContainer); |
|||
securityKeyboardView.setKeyboardBallonView(ballonView); |
|||
|
|||
try { |
|||
securityKeyboardManager = new SecurityKeyboardManager(getActivity()); |
|||
SecurityKeypadRequestParamBuilder request = new SecurityKeypadRequestParamBuilder(this.getActivity()); |
|||
request.disableKeyPadEffect(false); |
|||
request.setHintString(getString(R.string.password_text)); |
|||
title.setText(getString(R.string.enter_login_password_text)); |
|||
securityKeyboardManager.bindWithSecurityWidgetView(securityKeyboardView) |
|||
.setBallonView(ballonView) |
|||
.setKeyboardContainer(keypadContainer) |
|||
.setRequestParams(request) |
|||
.setActionListener(securityKeypadListener) |
|||
.build(); |
|||
|
|||
securityKeyboardManager.showKeyboard(); |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
public class SecurityKeypadListener implements SecurityKeyboardManager.SecurityKeyboardActionListenerFacade |
|||
{ |
|||
|
|||
@Override |
|||
public void done(Intent intent) { |
|||
dismiss(); |
|||
if(listener!=null) |
|||
listener.onUserPasswordReceived("!@#!@$!@#"); |
|||
} |
|||
|
|||
@Override |
|||
public void cancel(Intent intent) { |
|||
dismiss(); |
|||
} |
|||
|
|||
@Override |
|||
public void input(int i) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void minTextSizeCallback() { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void maxTextSizeCallback() { |
|||
|
|||
} |
|||
} |
|||
|
|||
public interface GMEUserPasswordPromptListener |
|||
{ |
|||
void onUserPasswordReceived(String secret); |
|||
} |
|||
} |
@ -0,0 +1,270 @@ |
|||
package com.gmeremit.online.gmeremittance_native.security.auth; |
|||
|
|||
import android.app.Dialog; |
|||
import android.content.DialogInterface; |
|||
import android.content.Intent; |
|||
import android.content.res.Resources; |
|||
import android.os.Bundle; |
|||
import android.os.CountDownTimer; |
|||
import android.os.Handler; |
|||
import android.text.Spannable; |
|||
import android.text.SpannableString; |
|||
import android.text.style.ForegroundColorSpan; |
|||
import android.util.Log; |
|||
import android.view.LayoutInflater; |
|||
import android.view.View; |
|||
import android.view.ViewGroup; |
|||
import android.widget.FrameLayout; |
|||
import android.widget.RelativeLayout; |
|||
import android.widget.TextView; |
|||
|
|||
import androidx.annotation.NonNull; |
|||
import androidx.core.content.ContextCompat; |
|||
|
|||
import com.gmeremit.online.gmeremittance_native.R; |
|||
import com.gmeremit.online.gmeremittance_native.security.GMEAuthManager; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardManager; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardView; |
|||
import com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeypadRequestParamBuilder; |
|||
import com.gmeremit.online.gmeremittance_native.transactionpasspromt.view.TransactionPasswordPromptActivity; |
|||
import com.google.android.material.bottomsheet.BottomSheetBehavior; |
|||
import com.google.android.material.bottomsheet.BottomSheetDialog; |
|||
import com.google.android.material.bottomsheet.BottomSheetDialogFragment; |
|||
import com.softsecurity.transkey.TransKeyActivity; |
|||
|
|||
import java.util.Locale; |
|||
|
|||
import butterknife.BindView; |
|||
import butterknife.ButterKnife; |
|||
|
|||
public class GMEUserProfileChangeOTPRequestBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { |
|||
|
|||
private GMEUserProfileChangeOTPRequestListener listener; |
|||
private SecurityKeypadListener securityKeypadListener; |
|||
|
|||
SecurityKeyboardManager securityKeyboardManager; |
|||
|
|||
@BindView(R.id.securityKeyboard) |
|||
SecurityKeyboardView securityKeyboardView; |
|||
|
|||
@BindView(R.id.keypadContainer) |
|||
FrameLayout keypadContainer; |
|||
|
|||
@BindView(R.id.keypadBallon) |
|||
RelativeLayout ballonView; |
|||
|
|||
@BindView(R.id.title) |
|||
TextView title; |
|||
|
|||
@BindView(R.id.resend_request) |
|||
TextView resendRequest; |
|||
|
|||
private boolean initiallyRequestOTP; |
|||
|
|||
private CountDownTimer countDownTimer; |
|||
private long currentCountDownVal; |
|||
|
|||
public static GMEUserProfileChangeOTPRequestBottomSheetDialog showPromptView(boolean intiallyRequestOTP,long currentCountDownVal,GMEUserProfileChangeOTPRequestListener listener) { |
|||
GMEUserProfileChangeOTPRequestBottomSheetDialog gmeUserPasswordPromptBottomSheetDialog = new GMEUserProfileChangeOTPRequestBottomSheetDialog(); |
|||
gmeUserPasswordPromptBottomSheetDialog.setListener(listener); |
|||
gmeUserPasswordPromptBottomSheetDialog.setRequestOTPInitially(intiallyRequestOTP); |
|||
gmeUserPasswordPromptBottomSheetDialog.setCurrentCountDownValue(currentCountDownVal); |
|||
return gmeUserPasswordPromptBottomSheetDialog; |
|||
} |
|||
|
|||
private void setCurrentCountDownValue(long currentCountDownVal) { |
|||
if(currentCountDownVal>0) |
|||
this.currentCountDownVal=currentCountDownVal; |
|||
else |
|||
this.currentCountDownVal=5000; |
|||
} |
|||
|
|||
private void setRequestOTPInitially(boolean intiallyRequestOTP) { |
|||
this.initiallyRequestOTP=intiallyRequestOTP; |
|||
} |
|||
|
|||
private void setListener(GMEUserProfileChangeOTPRequestListener listener) { |
|||
this.listener=listener; |
|||
} |
|||
|
|||
@Override |
|||
public void onCreate(Bundle savedInstanceState) { |
|||
super.onCreate(savedInstanceState); |
|||
setStyle(STYLE_NORMAL, R.style.AppBottomSheetDialogThemeWithInset); |
|||
} |
|||
|
|||
@Override |
|||
public View onCreateView(LayoutInflater inflater, ViewGroup container, |
|||
Bundle savedInstanceState) { |
|||
View v = inflater.inflate(R.layout.gme_user_pwd_prompt_modal, container, false); |
|||
ButterKnife.bind(this, v); |
|||
init(); |
|||
return v; |
|||
} |
|||
|
|||
@Override |
|||
public Dialog onCreateDialog(Bundle savedInstanceState) { |
|||
BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) super.onCreateDialog(savedInstanceState); |
|||
bottomSheetDialog.setOnShowListener(dialog -> { |
|||
BottomSheetDialog dialogc = (BottomSheetDialog) dialog; |
|||
FrameLayout bottomSheet = dialogc.findViewById(com.google.android.material.R.id.design_bottom_sheet); |
|||
BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(bottomSheet); |
|||
int bottomSheetHeight = Resources.getSystem().getDisplayMetrics().heightPixels; |
|||
bottomSheetBehavior.setPeekHeight(bottomSheetHeight); |
|||
bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); |
|||
}); |
|||
performDefaultAction(); |
|||
return bottomSheetDialog; |
|||
} |
|||
|
|||
private void performDefaultAction() { |
|||
Log.d(GMEAuthManager.TAG,"USER PROFILE OTP SCREEN: requestOTP Initially=>"+initiallyRequestOTP); |
|||
startCountdownView(currentCountDownVal); |
|||
} |
|||
|
|||
public void startCountdownView(long durationMillisecond) { |
|||
if(countDownTimer!=null) |
|||
countDownTimer.cancel(); |
|||
countDownTimer = new CountDownTimer(durationMillisecond, 1000) { |
|||
|
|||
int redColor = ContextCompat.getColor(getActivity(), R.color.colorPrimary); |
|||
int grayColor = ContextCompat.getColor(getActivity(), R.color.darkgray2); |
|||
|
|||
@Override |
|||
public void onTick(long millisUntilFinished) { |
|||
currentCountDownVal=millisUntilFinished; |
|||
int seconds = (int) (millisUntilFinished / 1000); |
|||
|
|||
int hours = seconds / (60 * 60); |
|||
int tempMint = (seconds - (hours * 60 * 60)); |
|||
int minutes = tempMint / 60; |
|||
seconds = tempMint - (minutes * 60); |
|||
|
|||
String timeRemaining = String.format(Locale.US, "%02d", minutes) |
|||
+ ":" + String.format(Locale.US, "%02d", seconds); |
|||
|
|||
Spannable tryInText = new SpannableString(getString(R.string.resend_code_text)); |
|||
tryInText.setSpan(new ForegroundColorSpan(grayColor), 0, tryInText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
|||
resendRequest.setText(tryInText); |
|||
|
|||
Spannable timeText = new SpannableString(" " + timeRemaining); |
|||
timeText.setSpan(new ForegroundColorSpan(redColor), 0, timeText.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); |
|||
|
|||
resendRequest.append(timeText); |
|||
} |
|||
|
|||
@Override |
|||
public void onFinish() { |
|||
showResendRequestView(true); |
|||
currentCountDownVal=-1; |
|||
} |
|||
|
|||
|
|||
}; |
|||
countDownTimer.start(); |
|||
} |
|||
|
|||
@Override |
|||
public void onDismiss(@NonNull DialogInterface dialog) { |
|||
if(countDownTimer!=null) |
|||
countDownTimer.cancel(); |
|||
super.onDismiss(dialog); |
|||
} |
|||
|
|||
public void showResendRequestView(boolean action) { |
|||
if (resendRequest.getVisibility() != View.VISIBLE) |
|||
resendRequest.setVisibility(View.VISIBLE); |
|||
if (action) { |
|||
if (countDownTimer != null) |
|||
countDownTimer.cancel(); |
|||
currentCountDownVal=-1; |
|||
resendRequest.setText(getString(R.string.resend_request_text)); |
|||
resendRequest.setOnClickListener(this); |
|||
|
|||
} else { |
|||
resendRequest.setText(""); |
|||
resendRequest.setOnClickListener(null); |
|||
} |
|||
} |
|||
|
|||
private void init() { |
|||
resendRequest.setVisibility(View.VISIBLE); |
|||
securityKeypadListener=new SecurityKeypadListener(); |
|||
securityKeyboardView.setKeyboardContainerView(keypadContainer); |
|||
securityKeyboardView.setKeyboardBallonView(ballonView); |
|||
|
|||
try { |
|||
securityKeyboardManager = new SecurityKeyboardManager(getActivity()); |
|||
SecurityKeypadRequestParamBuilder request = new SecurityKeypadRequestParamBuilder(this.getActivity()); |
|||
request.disableKeyPadEffect(true); |
|||
request.setKeypadType(TransKeyActivity.mTK_TYPE_KEYPAD_NUMBER); |
|||
request.setHintString(getString(R.string.otp_password_hint_text)); |
|||
title.setText(getString(R.string.enter_otp_password_text)); |
|||
request.setMaxLength(4); |
|||
ballonView.setVisibility(View.INVISIBLE); |
|||
|
|||
securityKeyboardManager.bindWithSecurityWidgetView(securityKeyboardView) |
|||
.setBallonView(ballonView) |
|||
.setKeyboardContainer(keypadContainer) |
|||
.setRequestParams(request) |
|||
.setActionListener(securityKeypadListener) |
|||
.build(); |
|||
|
|||
securityKeyboardManager.showKeyboard(); |
|||
|
|||
} catch (Exception e) { |
|||
e.printStackTrace(); |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onClick(View v) { |
|||
switch (v.getId()) |
|||
{ |
|||
case R.id.resend_request: |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
public class SecurityKeypadListener implements SecurityKeyboardManager.SecurityKeyboardActionListenerFacade |
|||
{ |
|||
|
|||
@Override |
|||
public void done(Intent intent) { |
|||
dismiss(); |
|||
if(listener!=null) |
|||
listener.onOTPSubmittedSucessfully("1234"); |
|||
} |
|||
|
|||
@Override |
|||
public void cancel(Intent intent) { |
|||
dismiss(); |
|||
} |
|||
|
|||
@Override |
|||
public void input(int i) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void minTextSizeCallback() { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void maxTextSizeCallback() { |
|||
|
|||
} |
|||
} |
|||
|
|||
public interface GMEUserProfileChangeOTPRequestListener |
|||
{ |
|||
void onOTPSubmittedSucessfully(String secret); |
|||
void onOTPRequestFailed(); |
|||
|
|||
} |
|||
} |
@ -1,8 +1,5 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad; |
|||
package com.gmeremit.online.gmeremittance_native.security.securitykeypad; |
|||
|
|||
import android.util.Log; |
|||
|
|||
import com.softsecurity.transkey.Global; |
|||
import com.softsecurity.transkey.TransKeyCipher; |
|||
|
|||
public class EncryptionManager { |
@ -1,4 +1,4 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad; |
|||
package com.gmeremit.online.gmeremittance_native.security.securitykeypad; |
|||
|
|||
import android.content.Context; |
|||
import android.content.Intent; |
@ -1,4 +1,4 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad; |
|||
package com.gmeremit.online.gmeremittance_native.security.securitykeypad; |
|||
|
|||
import android.content.Context; |
|||
import android.content.res.TypedArray; |
@ -1,4 +1,4 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security.securitykeypad; |
|||
package com.gmeremit.online.gmeremittance_native.security.securitykeypad; |
|||
|
|||
import android.content.Context; |
|||
import android.content.Intent; |
@ -1,4 +1,4 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security; |
|||
package com.gmeremit.online.gmeremittance_native.security.utils; |
|||
|
|||
import java.io.ByteArrayOutputStream; |
|||
import java.io.DataInputStream; |
@ -1,4 +1,4 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security; |
|||
package com.gmeremit.online.gmeremittance_native.security.utils; |
|||
|
|||
import android.content.Context; |
|||
|
@ -1,91 +0,0 @@ |
|||
package com.gmeremit.online.gmeremittance_native.utils.security; |
|||
|
|||
import android.content.Context; |
|||
|
|||
/** |
|||
* @author Preyea R. Regmi |
|||
* This class acts as a high level controller to orchestrates different authentication requirement for GME Services. |
|||
* The purpose of this class is to act as middleware and abstract underlying authentication process from various GME Services such as Remittacne,Topup etc. |
|||
*/ |
|||
public class GMEAuthManager { |
|||
|
|||
private double otpCountdown; |
|||
|
|||
private static final double DEFAULT_OTP_COUNTDOWN_VAL = 3; |
|||
|
|||
private Context context; |
|||
private GMEAuthListener listener; |
|||
private String paymentSourceType; |
|||
private GMEAuthType explicitlyRequestedAuthType; |
|||
|
|||
private GMEAuthManager(Context context) { |
|||
this.context = context; |
|||
resetParamToDefault(); |
|||
} |
|||
|
|||
private void resetParamToDefault() { |
|||
otpCountdown = DEFAULT_OTP_COUNTDOWN_VAL; |
|||
listener = null; |
|||
paymentSourceType = null; |
|||
explicitlyRequestedAuthType = null; |
|||
} |
|||
|
|||
public static GMEAuthManager getGmeAuthManager(Context context) { |
|||
return new GMEAuthManager(context); |
|||
} |
|||
|
|||
public void resetCountdown() { |
|||
otpCountdown = DEFAULT_OTP_COUNTDOWN_VAL; |
|||
} |
|||
|
|||
public GMEAuthManager setListener(GMEAuthListener listener) { |
|||
this.listener = listener; |
|||
return this; |
|||
} |
|||
|
|||
|
|||
public GMEAuthManager fromPaymentSource(String paymentSourceType) { |
|||
this.paymentSourceType = paymentSourceType; |
|||
this.explicitlyRequestedAuthType = null; |
|||
|
|||
return this; |
|||
} |
|||
|
|||
public GMEAuthManager requestExplicitly(GMEAuthType gmeAuthType) { |
|||
this.explicitlyRequestedAuthType = gmeAuthType; |
|||
this.paymentSourceType = null; |
|||
return this; |
|||
} |
|||
|
|||
public void prompt() |
|||
{ |
|||
if(explicitlyRequestedAuthType!=null) |
|||
{ |
|||
startAuthFromRequestedAuthType(); |
|||
} |
|||
else |
|||
{ |
|||
startAuthFromPaymentSourceType(); |
|||
} |
|||
|
|||
} |
|||
|
|||
private void startAuthFromPaymentSourceType() { |
|||
|
|||
} |
|||
|
|||
private void startAuthFromRequestedAuthType() { |
|||
|
|||
} |
|||
|
|||
|
|||
public interface GMEAuthListener { |
|||
void onGMEAuthSuccess(String secret, boolean isBiometricUsed); |
|||
|
|||
void onGMEAuthFailed(String errorReason); |
|||
} |
|||
|
|||
public enum GMEAuthType { |
|||
USER_PASSWORD, BIOMETRIC, OTP |
|||
} |
|||
} |
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<inset |
|||
xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:insetTop="@dimen/_40sdp" |
|||
android:drawable="@android:color/transparent" |
|||
/> |
@ -1,7 +1,7 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<inset |
|||
xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:drawable="@drawable/ic_rounded_password_prompt_bg" |
|||
android:drawable="@android:color/transparent" |
|||
android:insetTop="@dimen/_38sdp" |
|||
> |
|||
</inset> |
@ -0,0 +1,101 @@ |
|||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:app="http://schemas.android.com/apk/res-auto" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:id="@+id/rootView" |
|||
> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:orientation="vertical"> |
|||
|
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/title" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginBottom="@dimen/_15sdp" |
|||
android:layout_marginTop="@dimen/_15sdp" |
|||
android:gravity="center" |
|||
android:text="@string/enter_login_password_text" |
|||
android:textColor="@color/black" |
|||
android:textSize="@dimen/_15ssp" /> |
|||
|
|||
|
|||
<ImageView |
|||
android:id="@+id/passwordPromptImageView" |
|||
android:layout_marginTop="@dimen/_8sdp" |
|||
android:layout_marginBottom="@dimen/_8sdp" |
|||
android:layout_width="@dimen/_50sdp" |
|||
android:layout_height="@dimen/_50sdp" |
|||
android:scaleType="centerCrop" |
|||
android:layout_gravity="center" |
|||
/> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/orTextView" |
|||
android:layout_width="match_parent" |
|||
android:visibility="gone" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginTop="@dimen/_8sdp" |
|||
android:layout_marginBottom="@dimen/_16sdp" |
|||
android:layout_marginStart="@dimen/_12sdp" |
|||
android:layout_marginEnd="@dimen/_12sdp" |
|||
android:gravity="center" |
|||
android:text="@string/fingerprint_user_text" |
|||
android:textColor="@color/darkgray" |
|||
android:textSize="@dimen/_11sdp" /> |
|||
|
|||
|
|||
<com.gmeremit.online.gmeremittance_native.security.securitykeypad.SecurityKeyboardView |
|||
android:id="@+id/securityKeyboard" |
|||
android:layout_width="match_parent" |
|||
app:centerGravityInput="false" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center_vertical" |
|||
android:layout_marginEnd="@dimen/_4sdp" |
|||
android:layout_marginStart="@dimen/_4sdp" /> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeErrorTextView |
|||
android:id="@+id/passwordErrorTxt" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginLeft="@dimen/_11sdp" |
|||
android:layout_marginRight="@dimen/_11sdp" |
|||
android:paddingBottom="@dimen/_1sdp" |
|||
android:paddingTop="@dimen/_1sdp" /> |
|||
|
|||
<com.gmeremit.online.gmeremittance_native.customwidgets.GmeTextView |
|||
android:id="@+id/resend_request" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center_horizontal" |
|||
android:layout_marginStart="@dimen/_6sdp" |
|||
android:layout_marginTop="@dimen/_8sdp" |
|||
android:layout_marginEnd="@dimen/_8sdp" |
|||
android:padding="@dimen/_8sdp" |
|||
android:gravity="center" |
|||
android:text="@string/resend_request_text" |
|||
android:textColor="@color/colorPrimary" |
|||
android:textSize="@dimen/_11ssp" |
|||
android:visibility="invisible" /> |
|||
<View |
|||
android:layout_width="match_parent" |
|||
android:layout_height="0dp" |
|||
android:layout_weight="1"/> |
|||
<FrameLayout |
|||
android:id="@+id/keypadContainer" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:paddingBottom="@dimen/_8sdp" |
|||
android:layout_gravity="bottom"> |
|||
|
|||
</FrameLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<RelativeLayout |
|||
android:id="@+id/keypadBallon" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" /> |
|||
</RelativeLayout> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue