Skip to content

Commit

Permalink
added biometric auth for use
Browse files Browse the repository at this point in the history
  • Loading branch information
zkhan93 committed Nov 25, 2021
1 parent e99e5a1 commit 43ff812
Show file tree
Hide file tree
Showing 4 changed files with 121 additions and 18 deletions.
9 changes: 6 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,11 @@ dependencies {
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'

implementation 'com.github.tgio:rncryptor-native:0.0.9'

implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
//guava-android
// implementation 'com.google.guava:guava:23.4-android'

//implementation 'com.github.PhilJay:MPAndroidChart:v3.0.2'
//guava-android
//implementation 'com.google.guava:guava:23.4-android'

//for registering watch on gmail
implementation 'pub.devrel:easypermissions:3.0.0'
Expand All @@ -117,6 +117,9 @@ dependencies {
exclude group: 'org.apache.httpcomponents'
}

// biometric
implementation "androidx.biometric:biometric:1.1.0"

//JUnit 4 framework
testImplementation 'junit:junit:4.13.1'
// Robolectric environment
Expand Down
82 changes: 81 additions & 1 deletion app/src/main/java/io/github/zkhan93/familyfinance/App.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
package io.github.zkhan93.familyfinance;

import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;

import android.app.Application;
import android.content.SharedPreferences;
import android.os.Build;
import android.preference.PreferenceManager;
import android.util.Log;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.biometric.BiometricPrompt;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;

import com.google.firebase.database.FirebaseDatabase;

import org.greenrobot.greendao.database.Database;

import java.util.concurrent.Executor;

import io.github.zkhan93.familyfinance.models.DaoMaster;
import io.github.zkhan93.familyfinance.models.DaoSession;

Expand All @@ -17,10 +32,16 @@ public class App extends Application {
public static final boolean ENCRYPTED = false;
private DaoSession daoSession;

private Executor executor;
private BiometricPrompt biometricPrompt;
private BiometricPrompt.PromptInfo promptInfo;
private SharedPreferences spf;
private static String TAG = App.class.getSimpleName();

@Override
public void onCreate() {
super.onCreate();

spf = PreferenceManager.getDefaultSharedPreferences(this);
FirebaseDatabase.getInstance().setPersistenceEnabled(true);

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,
Expand All @@ -34,4 +55,63 @@ public void onCreate() {
public DaoSession getDaoSession() {
return daoSession;
}

public void setBiometricAuthValidFromTimeToNow() {
spf.edit().putLong(getString(R.string.pref_success_biometric_auth_at),
System.currentTimeMillis()).apply();
}

public void requestBiometricAuth(FragmentActivity activity) {
long biometricAuthThreshold = 10 * 1000;
long lastAuthAt = spf.getLong(getString(R.string.pref_success_biometric_auth_at), 0);
if (lastAuthAt > System.currentTimeMillis() - biometricAuthThreshold) {
setBiometricAuthValidFromTimeToNow();
return;
}
//only if its not very recent
executor = ContextCompat.getMainExecutor(this);
biometricPrompt = new BiometricPrompt(activity,
executor, new BiometricPrompt.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode,
@NonNull CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
Toast.makeText(getApplicationContext(),
"Authentication is required to use the app!", Toast.LENGTH_SHORT)
.show();
Log.d(TAG, errString.toString());
activity.finish();
}

@Override
public void onAuthenticationSucceeded(
@NonNull BiometricPrompt.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
setBiometricAuthValidFromTimeToNow();

}

@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
Toast.makeText(getApplicationContext(), "Authentication failed",
Toast.LENGTH_SHORT)
.show();
}
});

BiometricPrompt.PromptInfo.Builder builder = new BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
.setSubtitle("Log in using your biometric credential")
.setNegativeButtonText(getString(R.string.cancel));
if (Build.VERSION.SDK_INT > 29) {
builder = builder.setAllowedAuthenticators(BIOMETRIC_STRONG | DEVICE_CREDENTIAL);
}
promptInfo = builder.build();

// Prompt appears when user clicks "Log in".
// Consider integrating with the keystore to unlock cryptographic operations,
// if needed by your app.
biometricPrompt.authenticate(promptInfo);
}
}
47 changes: 33 additions & 14 deletions app/src/main/java/io/github/zkhan93/familyfinance/HomeActivity.java
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package io.github.zkhan93.familyfinance;

import static androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG;
import static androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL;
import static io.github.zkhan93.familyfinance.FragmentMembers.PERMISSION_REQUEST_CODE;

import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.firebase.ui.auth.AuthUI;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.biometric.BiometricPrompt;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.drawerlayout.widget.DrawerLayout;
Expand All @@ -29,9 +29,19 @@
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import io.github.zkhan93.familyfinance.vm.AppState;

import static io.github.zkhan93.familyfinance.FragmentMembers.PERMISSION_REQUEST_CODE;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.firebase.ui.auth.AuthUI;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.navigation.NavigationView;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

import java.util.concurrent.Executor;

import io.github.zkhan93.familyfinance.vm.AppState;

public class HomeActivity extends AppCompatActivity implements AppBarConfiguration.OnNavigateUpListener {

Expand All @@ -54,14 +64,15 @@ public class HomeActivity extends AppCompatActivity implements AppBarConfigurati
private View.OnClickListener fabClickListener;
private NavController navController;
private AppState appState;
private SharedPreferences spf;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appState = new ViewModelProvider(this).get(AppState.class);
setContentView(R.layout.activity_home);
familyId =
PreferenceManager.getDefaultSharedPreferences(this).getString(getString(R.string.pref_family_id), null);
spf = PreferenceManager.getDefaultSharedPreferences(this);
familyId = spf.getString(getString(R.string.pref_family_id), null);
initListeners();
setUpViewRef();
setSupportActionBar(toolbar);
Expand All @@ -74,14 +85,22 @@ protected void onCreate(Bundle savedInstanceState) {
else
fab.hide();
});


}

@Override
protected void onStart() {
super.onStart();
checkRequiredPermissions();
((App)getApplication()).requestBiometricAuth(this);
}

@Override
protected void onResume() {
super.onResume();
((App)getApplication()).requestBiometricAuth(this);
}

private void checkRequiredPermissions() {
int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest
Expand All @@ -92,7 +111,7 @@ private void checkRequiredPermissions() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest
.permission.RECEIVE_SMS)) {
//explain the need of this permission
//todo show a dialog and then on positive show request permission
//TODO: show a dialog and then on positive show request permission
Log.d(TAG, "lol we need it :D");
ActivityCompat.requestPermissions(this, new String[]{
android.Manifest.permission.RECEIVE_SMS, android.Manifest.permission
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@
<string name="pref_key_autolock" translatable="false">pref_key_autolock</string>
<string name="pref_key_allsms">pref_key_allsms</string>
<string name="pref_family_id">familyId</string>
<string name="pref_success_biometric_auth_at">success_biometric_auth_at</string>



Expand Down

0 comments on commit 43ff812

Please sign in to comment.