diff --git a/build.gradle b/build.gradle index 91d449bbe9b..344b3d7fd22 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,6 @@ ext { okHttp3Version = '3.3.1' flipTableVersion = '1.0.1' butterKnifeVersion = '8.0.1' - + mifosPasscodeVersion = '0.3.0' } \ No newline at end of file diff --git a/mifosng-android/build.gradle b/mifosng-android/build.gradle index 081345d6b57..0c406c1f63b 100755 --- a/mifosng-android/build.gradle +++ b/mifosng-android/build.gradle @@ -214,6 +214,10 @@ dependencies { compile 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1' compile 'com.github.bumptech.glide:glide:3.7.0' + + //mifos passcode + compile "com.mifos.mobile:mifos-passcode:$mifosPasscodeVersion" + // Android Testing Support Library's runner and rules androidTestCompile "com.android.support.test:runner:$rootProject.runnerVersion" androidTestCompile "com.android.support.test:rules:$rootProject.rulesVersion" diff --git a/mifosng-android/src/main/java/com/mifos/App.java b/mifosng-android/src/main/java/com/mifos/App.java index ba2e5af84c5..c1a390980cc 100755 --- a/mifosng-android/src/main/java/com/mifos/App.java +++ b/mifosng-android/src/main/java/com/mifos/App.java @@ -18,7 +18,7 @@ import com.mifos.mifosxdroid.injection.component.ApplicationComponent; import com.mifos.mifosxdroid.injection.component.DaggerApplicationComponent; import com.mifos.mifosxdroid.injection.module.ApplicationModule; -import com.mifos.utils.ForegroundChecker; +import com.mifos.mobile.passcode.utils.ForegroundChecker; import com.raizlabs.android.dbflow.config.FlowConfig; import com.raizlabs.android.dbflow.config.FlowManager; @@ -66,7 +66,7 @@ public void onCreate() { .build(); StrictMode.setVmPolicy(policy); } - ForegroundChecker.init(); + ForegroundChecker.init(this); } public ApplicationComponent getComponent() { diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/SplashScreenActivity.java b/mifosng-android/src/main/java/com/mifos/mifosxdroid/SplashScreenActivity.java index f844fc00d59..cf3f65db9bb 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/SplashScreenActivity.java +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/SplashScreenActivity.java @@ -12,6 +12,7 @@ import com.mifos.mifosxdroid.core.MifosBaseActivity; import com.mifos.mifosxdroid.login.LoginActivity; import com.mifos.mifosxdroid.passcode.PassCodeActivity; +import com.mifos.mobile.passcode.utils.PassCodeConstants; import com.mifos.utils.PrefManager; @@ -29,7 +30,10 @@ protected void onCreate(Bundle savedInstanceState) { + BaseUrl.API_ENDPOINT + BaseUrl.API_PATH); startActivity(new Intent(SplashScreenActivity.this, LoginActivity.class)); } else { - startActivity(new Intent(SplashScreenActivity.this, PassCodeActivity.class)); + Intent intent = new Intent(SplashScreenActivity.this, + PassCodeActivity.class); + intent.putExtra(PassCodeConstants.PASSCODE_INITIAL_LOGIN, true); + startActivity(intent); } finish(); } diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/core/MifosBaseActivity.java b/mifosng-android/src/main/java/com/mifos/mifosxdroid/core/MifosBaseActivity.java index fea3e8d4258..d3ddd9058b9 100755 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/core/MifosBaseActivity.java +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/core/MifosBaseActivity.java @@ -12,7 +12,6 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; -import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SwitchCompat; import android.support.v7.widget.Toolbar; import android.view.MenuItem; @@ -26,15 +25,14 @@ import com.mifos.mifosxdroid.injection.component.DaggerActivityComponent; import com.mifos.mifosxdroid.injection.module.ActivityModule; import com.mifos.mifosxdroid.passcode.PassCodeActivity; +import com.mifos.mobile.passcode.BasePassCodeActivity; import com.mifos.utils.Constants; -import com.mifos.utils.ForegroundChecker; import com.mifos.utils.PrefManager; /** * @author fomenkoo */ -public class MifosBaseActivity extends AppCompatActivity implements BaseActivityCallback, - ForegroundChecker.Listener { +public class MifosBaseActivity extends BasePassCodeActivity implements BaseActivityCallback { protected Toolbar toolbar; private ActivityComponent mActivityComponent; @@ -175,22 +173,7 @@ public void clearFragmentBackStack() { } @Override - protected void onResume() { - super.onResume(); - ForegroundChecker.get().addListener(this); - ForegroundChecker.get().onActivityResumed(); - } - - @Override - protected void onPause() { - super.onPause(); - ForegroundChecker.get().onActivityPaused(); - } - - @Override - public void onBecameForeground() { - Intent intent = new Intent(this, PassCodeActivity.class); - intent.putExtra(Constants.INTIAL_LOGIN, false); - startActivity(intent); + public Class getPassCodeClass() { + return PassCodeActivity.class; } } diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/passcode/PassCodeActivity.java b/mifosng-android/src/main/java/com/mifos/mifosxdroid/passcode/PassCodeActivity.java index 9dbf918efa0..b99d59e46c6 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/passcode/PassCodeActivity.java +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/passcode/PassCodeActivity.java @@ -1,197 +1,29 @@ package com.mifos.mifosxdroid.passcode; import android.content.Intent; -import android.os.Bundle; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.NestedScrollView; -import android.support.v7.widget.AppCompatButton; import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; -import android.widget.Toast; import com.mifos.mifosxdroid.R; import com.mifos.mifosxdroid.SplashScreenActivity; -import com.mifos.mifosxdroid.core.MifosBaseActivity; import com.mifos.mifosxdroid.core.util.Toaster; import com.mifos.mifosxdroid.online.DashboardActivity; -import com.mifos.utils.Constants; -import com.mifos.utils.EncryptionUtil; -import com.mifos.utils.PassCodeView; -import com.mifos.utils.PrefManager; +import com.mifos.mobile.passcode.MifosPassCodeActivity; +import com.mifos.mobile.passcode.utils.EncryptionUtil; -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; - -public class PassCodeActivity extends MifosBaseActivity implements PassCodeView.PassCodeListener { - - @BindView(R.id.cl_rootview) - NestedScrollView clRootview; - - @BindView(R.id.btn_forgot_passcode) - AppCompatButton btnForgotPasscode; - - @BindView(R.id.pv_passcode) - PassCodeView passCodeView; - - @BindView(R.id.btn_skip) - AppCompatButton btnSkip; - - @BindView(R.id.btn_save) - AppCompatButton btnSave; - - @BindView(R.id.tv_passcode) - TextView tvPasscodeIntro; - - @BindView(R.id.iv_visibility) - ImageView ivVisibility; - - private int counter = 0; - private boolean isInitialScreen; +public class PassCodeActivity extends MifosPassCodeActivity { @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_pass_code); - getActivityComponent().inject(this); - ButterKnife.bind(this); - - isInitialScreen = getIntent().getBooleanExtra(Constants.INTIAL_LOGIN, false); - - if (PrefManager.getPassCodeStatus()) { - btnSkip.setVisibility(View.GONE); - btnSave.setVisibility(View.GONE); - tvPasscodeIntro.setVisibility(View.GONE); - btnForgotPasscode.setVisibility(View.VISIBLE); - //enabling passCodeListener only when user has already setup PassCode - passCodeView.setPassCodeListener(this); - } - } - - @OnClick(R.id.btn_skip) - public void skip() { - startDashBoardActivity(); - } - - @OnClick(R.id.btn_save) - public void savePassCode() { - if (isPassCodeLengthCorrect()) { - PrefManager.setPassCode(EncryptionUtil.getHash(passCodeView.getPasscode())); - startDashBoardActivity(); - } + public int getLogo() { + return R.drawable.mifos_logo; } @Override - public void passCodeEntered(String passcode) { - String passwordEntered = EncryptionUtil.getHash(passCodeView.getPasscode()); - boolean isPassCodeCorrect = PrefManager.getPassCode().equals(passwordEntered); - if (counter == 3 && !isPassCodeCorrect) { - Toast.makeText(getApplicationContext(), R.string.incorrect_passcode_more_than_three, - Toast.LENGTH_SHORT).show(); - PrefManager.clearPrefs(); - startSplashActivity(); - return; - } - - if (isPassCodeLengthCorrect()) { - if (isPassCodeCorrect) { - startDashBoardActivity(); - finish(); - } else { - counter++; - passCodeView.clearPasscodeField(); - Toaster.show(clRootview, R.string.incorrect_passcode); - } - } - } - - @OnClick(R.id.btn_forgot_passcode) - public void forgotPassCode() { - PrefManager.clearPrefs(); - startSplashActivity(); - } - - @OnClick(R.id.btn_one) - public void clickedOne() { - passCodeView.enterCode(getString(R.string.one)); - } - - @OnClick(R.id.btn_two) - public void clickedTwo() { - passCodeView.enterCode(getString(R.string.two)); - } - - @OnClick(R.id.btn_three) - public void clickedThree() { - passCodeView.enterCode(getString(R.string.three)); - } - - @OnClick(R.id.btn_four) - public void clickedFour() { - passCodeView.enterCode(getString(R.string.four)); - } - - @OnClick(R.id.btn_five) - public void clickedFive() { - passCodeView.enterCode(getString(R.string.five)); - } - - @OnClick(R.id.btn_six) - public void clickedSix() { - passCodeView.enterCode(getString(R.string.six)); - } - - @OnClick(R.id.btn_seven) - public void clickedSeven() { - passCodeView.enterCode(getString(R.string.seven)); - } - - @OnClick(R.id.btn_eight) - public void clickedEight() { - passCodeView.enterCode(getString(R.string.eight)); - } - - @OnClick(R.id.btn_nine) - public void clickedNine() { - passCodeView.enterCode(getString(R.string.nine)); - } - - @OnClick(R.id.btn_zero) - public void clickedZero() { - passCodeView.enterCode(getString(R.string.zero)); - } - - @OnClick(R.id.btn_back) - public void clickedBackSpace() { - passCodeView.backSpace(); - } - - @OnClick(R.id.iv_visibility) - public void visibilityChange() { - passCodeView.revertPassCodeVisibility(); - if (!passCodeView.passcodeVisible()) { - ivVisibility.setColorFilter(ContextCompat.getColor(PassCodeActivity.this, - R.color.light_grey)); - } else { - ivVisibility.setColorFilter(ContextCompat.getColor(PassCodeActivity.this, - R.color.gray_dark)); - } - } - private boolean isPassCodeLengthCorrect() { - if (passCodeView.getPasscode().length() == 4) { - return true; - } - Toaster.show(clRootview, getString(R.string.error_passcode)); - return false; - } - - private void startDashBoardActivity() { + public void startNextActivity() { startActivity(new Intent(this, DashboardActivity.class)); - finish(); } - private void startSplashActivity() { + @Override + public void startLoginActivity() { Intent i = new Intent(PassCodeActivity.this, SplashScreenActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(i); @@ -199,10 +31,13 @@ private void startSplashActivity() { } @Override - public void onBackPressed() { - //enabling back press only for initial login. - if (isInitialScreen) { - super.onBackPressed(); - } + public void showToaster(View view, int msg) { + Toaster.show(view, msg); + } + + @Override + public int getEncryptionType() { + return EncryptionUtil.ANDROID_CLIENT; } + } diff --git a/mifosng-android/src/main/java/com/mifos/utils/EncryptionUtil.java b/mifosng-android/src/main/java/com/mifos/utils/EncryptionUtil.java deleted file mode 100644 index 48c44d3016f..00000000000 --- a/mifosng-android/src/main/java/com/mifos/utils/EncryptionUtil.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.mifos.utils; - -import android.util.Log; - -/** - * Created by mayankjindal on 30/06/17. - */ - -public class EncryptionUtil { - - static { - try { - System.loadLibrary("encryption"); - } catch (UnsatisfiedLinkError e) { - Log.e("LoadJniLib", "Error: Could not load native library: " + e.getMessage()); - } - } - - private static final native String getPassCodeHash(String passcode); - - public static String getHash(String passCode) { - return getPassCodeHash(passCode); - } -} diff --git a/mifosng-android/src/main/java/com/mifos/utils/ForegroundChecker.java b/mifosng-android/src/main/java/com/mifos/utils/ForegroundChecker.java deleted file mode 100644 index a919ad6d3df..00000000000 --- a/mifosng-android/src/main/java/com/mifos/utils/ForegroundChecker.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.mifos.utils; - -import android.os.Handler; - -/** - * Created by mayankjindal on 18/07/17. - */ - -public class ForegroundChecker { - public static final long CHECK_DELAY = 500; - public static final int MIN_BACKGROUND_THRESHOLD = 60; - public static final String TAG = ForegroundChecker.class.getName(); - - public interface Listener { - public void onBecameForeground(); - } - - private static ForegroundChecker instance; - - private boolean foreground = false, paused = true; - private Handler handler = new Handler(); - private Listener listener; - private Runnable check; - private long backgroundTimeStart; - - public static ForegroundChecker init() { - if (instance == null) { - instance = new ForegroundChecker(); - } - return instance; - } - - public static ForegroundChecker get() { - return instance; - } - - private ForegroundChecker() { - backgroundTimeStart = -1; - } - - public boolean isForeground() { - return foreground; - } - - public boolean isBackground() { - return !foreground; - } - - public void addListener(Listener listener) { - this.listener = listener; - } - - public void onActivityResumed() { - paused = false; - boolean wasBackground = !foreground; - foreground = true; - - if (check != null) - handler.removeCallbacks(check); - - if (wasBackground) { - - int secondsInBackground = (int) ((System.currentTimeMillis() - backgroundTimeStart) / - 1000); - - if (backgroundTimeStart != -1 && secondsInBackground >= MIN_BACKGROUND_THRESHOLD && - listener != null && PrefManager.getPassCodeStatus()) { - listener.onBecameForeground(); - } - - } - } - - public void onActivityPaused() { - paused = true; - - if (check != null) - handler.removeCallbacks(check); - - handler.postDelayed(check = new Runnable() { - @Override - public void run() { - if (foreground && paused) { - foreground = false; - backgroundTimeStart = System.currentTimeMillis(); - - } - } - }, CHECK_DELAY); - } -} diff --git a/mifosng-android/src/main/java/com/mifos/utils/PassCodeView.java b/mifosng-android/src/main/java/com/mifos/utils/PassCodeView.java deleted file mode 100644 index 6fba6ce8bc9..00000000000 --- a/mifosng-android/src/main/java/com/mifos/utils/PassCodeView.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.mifos.utils; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.util.AttributeSet; -import android.view.View; - -import com.mifos.mifosxdroid.R; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by mayankjindal on 18/07/17. - */ - -public class PassCodeView extends View { - - private Paint emptyCirclePaint, fillCirclePaint; - private final int PASSWORD_LENGTH = 4; - private List passwordList; - private boolean isPasscodeVisible; - private PassCodeListener passCodeListener; - - public PassCodeView(Context context) { - super(context); - init(); - } - - public void setPassCodeListener(PassCodeListener passCodeListener) { - this.passCodeListener = passCodeListener; - } - - public PassCodeView(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - init(); - } - - public PassCodeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(); - } - - - private void init() { - emptyCirclePaint = new Paint(); - emptyCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.primary)); - emptyCirclePaint.setAntiAlias(true); - emptyCirclePaint.setStyle(Paint.Style.STROKE); - emptyCirclePaint.setStrokeWidth(1f); - - fillCirclePaint = new Paint(); - fillCirclePaint.setColor(ContextCompat.getColor(getContext(), R.color.primary)); - fillCirclePaint.setAntiAlias(true); - fillCirclePaint.setTextSize(getResources().getDimension(R.dimen.text_medium)); - fillCirclePaint.setStyle(Paint.Style.FILL); - - passwordList = new ArrayList<>(); - isPasscodeVisible = false; - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - int stackSize = passwordList.size(); - int xPosition = getWidth() / (PASSWORD_LENGTH * 2); - for (int i = 1; i <= PASSWORD_LENGTH; i++) { - if (stackSize >= i) { - if (!isPasscodeVisible) { - canvas.drawCircle(xPosition, getHeight() / 2, 8f, fillCirclePaint); - } else { - canvas.drawText(passwordList.get(i - 1), xPosition , getHeight() / 2 + - getHeight() / 8, fillCirclePaint); - } - } else { - canvas.drawCircle(xPosition , getHeight() / 2, 8f, emptyCirclePaint); - } - xPosition += getWidth() / PASSWORD_LENGTH; - } - } - - public void enterCode(String character) { - if (passwordList.size() < PASSWORD_LENGTH) { - passwordList.add(character); - invalidate(); - } - if (passwordList.size() == PASSWORD_LENGTH && passCodeListener != null) { - passCodeListener.passCodeEntered(getPasscode()); - } - } - - public String getPasscode() { - StringBuilder builder = new StringBuilder(); - for (String character : passwordList) { - builder.append(character); - } - return builder.toString(); - } - - public void clearPasscodeField() { - passwordList.clear(); - invalidate(); - } - - public void backSpace() { - if (passwordList.size() > 0) { - passwordList.remove(passwordList.size() - 1); - invalidate(); - } - } - - public void revertPassCodeVisibility() { - isPasscodeVisible = !isPasscodeVisible; - invalidate(); - } - - public boolean passcodeVisible() { - return isPasscodeVisible; - } - - public interface PassCodeListener { - void passCodeEntered(String passcode); - } -} diff --git a/mifosng-android/src/main/jniLibs/arm64-v8a/libencryption.so b/mifosng-android/src/main/jniLibs/arm64-v8a/libencryption.so deleted file mode 100644 index f79154f3ae3..00000000000 Binary files a/mifosng-android/src/main/jniLibs/arm64-v8a/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/armeabi-v7a/libencryption.so b/mifosng-android/src/main/jniLibs/armeabi-v7a/libencryption.so deleted file mode 100644 index 52f63d4fbb4..00000000000 Binary files a/mifosng-android/src/main/jniLibs/armeabi-v7a/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/armeabi/libencryption.so b/mifosng-android/src/main/jniLibs/armeabi/libencryption.so deleted file mode 100644 index 27efdb77f2c..00000000000 Binary files a/mifosng-android/src/main/jniLibs/armeabi/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/mips/libencryption.so b/mifosng-android/src/main/jniLibs/mips/libencryption.so deleted file mode 100644 index 291d987f9e8..00000000000 Binary files a/mifosng-android/src/main/jniLibs/mips/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/mips64/libencryption.so b/mifosng-android/src/main/jniLibs/mips64/libencryption.so deleted file mode 100644 index 1120182eca6..00000000000 Binary files a/mifosng-android/src/main/jniLibs/mips64/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/x86/libencryption.so b/mifosng-android/src/main/jniLibs/x86/libencryption.so deleted file mode 100644 index b90cb8e07b1..00000000000 Binary files a/mifosng-android/src/main/jniLibs/x86/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/jniLibs/x86_64/libencryption.so b/mifosng-android/src/main/jniLibs/x86_64/libencryption.so deleted file mode 100644 index db39b1ca0c7..00000000000 Binary files a/mifosng-android/src/main/jniLibs/x86_64/libencryption.so and /dev/null differ diff --git a/mifosng-android/src/main/res/layout/activity_pass_code.xml b/mifosng-android/src/main/res/layout/activity_pass_code.xml deleted file mode 100644 index c7ac087178d..00000000000 --- a/mifosng-android/src/main/res/layout/activity_pass_code.xml +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file