Code Monkey home page Code Monkey logo

applock's Introduction

App Lock

Download Android Arsenal

A simple library for locking and unlocking Activities with a PIN code or Fingerprint (e.g. a child lock).

AppLock Sample

Installation

repositories {
    maveCentral()
}

dependencies {
    compile('com.guardanis:applock:3.0.2')
}

Usage

The goal of AppLock is to allow users to enroll and authenticate with a PIN or Fingerprint to lock the application from being used by unauthorized parties.

Activities

To open the Activity to create a PIN, you can simply open the AppLockActivity via (PS: If you want to use the dialog instead of the Activity (which looks cooler), see the dialog stuff below) Intents:

Intent intent = new Intent(activity, LockCreationActivity.class);
startActivityForResult(intent, LockingHelper.REQUEST_CODE_CREATE_LOCK);

To check if the user has elected to enroll in AppLock authentication, you can simply call AppLock.isEnrolled(Contect) and redirect to the UnlockActivity if the action requires authentication:

Intent intent = new Intent(activity, UnlockActivity.class);
startActivityForResult(intent, AppLock.REQUEST_CODE_ULOCK);    

If you want to do both of the above in a single step (that is, check if the user is enrolled and open the unlock flow if true), you can call:

if(!AppLock.unlockIfRequired(Activity))
    doSomethingThatRequiresLockingIfEnabled();

...

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(requestCode == LockingHelper.REQUEST_CODE_ULOCK && resultCode == Activity.RESULT_OK)
        doSomethingThatRequiresLockingIfEnabled();
}
Dialogs

If you want to do the above with a Dialog, instead of an Activity (which looks cooler), you can simply call:

new UnlockDialogBuilder(activity)
    .onUnlocked(() -> { doSomethingThatRequiresLockingIfEnabled(); })
    .onCanceled(() -> { })
    .showIfRequiredOrSuccess(TimeUnit.MINUTES.toMillies(15));

Or, create the enrollment with a Dialog:

new LockCreationDialogBuilder(this)
    .onCanceled(() -> { showIndicatorMessage("You canceled..."); })
    .onLockCreated(() -> { showIndicatorMessage("Lock created!"); })
    .show()

If you want an Activity to remain fully locked once a PIN has been entered, ensure that you override onPostResume() and call AppLock.onActivityResumed(Activity); e.g.

@Override
protected void onPostResume(){
    super.onPostResume();
    
    AppLock.onActivityResumed(this);
}

or you can simply have your Activity extend the LockableCompatActivity supplied with this library.

By default, AppLock considers a successful login as valid for 15 minutes, regardless of application state. You can shorten or extend that length by overriding the integer value for applock__activity_lock_reenable_minutes in your resources. Doing so will cause any Activity to re-open the UnlockActivity after the delay has passed. If you only want authentication present on a specific action (e.g. payments), you should use the UnlockDialogBuilder's methods posted above instead of locking the entire Activity.

To change the default length of the PIN, you can override

<integer name="applock__input_pin_item_count">4</integer>

Theme

All themes, styles, dimensions, strings, etc. are all customizable via overriding the resources. See applock/src/main/res/values/ for details.

Moved to MavenCentral

As of version 3.0.2, applock will be hosted on MavenCentral. Versions 3.0.1 and below will remain on JCenter.

TODO:

  • Allow backup authentication options

applock's People

Contributors

lucaventura avatar mattsilber avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

applock's Issues

Getting next activity without asking for lock when installed first time .

Hello @mattsilber ,

Please find my code below:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

    if (android.os.Build.VERSION.SDK_INT >= 23) {
        fingerScannerMain();
    } else {
        passwordLock();
    }
}

public void passwordLock(){

    new CreateLockDialogBuilder(this,
            new CreateLockDialogBuilder.LockCreationListener(){
                public void onLockCanceled(){ } // Dialog was closed without entry
                public void onLockSuccessful(){
                    Intent intent = new Intent(MainActivity.this, WelcomeClass.class);
                    startActivity(intent);
                }
            })
            .show();


    ActionLockingHelper.unlockIfRequired(this, new UnlockDialogBuilder.UnlockEventListener() {
        public void onCanceled() {
        } // Dialog was closed without entry

        public void onUnlockFailed(String reason) {
        } // Not called with default Dialog, instead is handled internally

        public void onUnlockSuccessful() {
            Intent intent = new Intent(MainActivity.this, WelcomeClass.class);
            startActivity(intent);
        }
    });

}

When I am running the code from android studio, it gets installed in my phone and directly opens the WelcomeClass activity rather than asking for "Enter a 4-digit code to lock app". When I press back at that time it is asking me for the lock at that time it works fine but I am not sure why it is going directly to the next activity before lock. Getting exception as well "E/WindowManager: android.view.WindowLeaked:".
Also if I clicked outside the dialog box, it does not exit the program it continues with the next activity, ideally it should not let you proceed if you touched outside the dialog box.

Expose `onAuthenticationError` error messaging

Error messages received in AuthenticationCallback#onAuthenticationError should propagate back to the UI, instead of masking all errors as R.string.applock__fingerprint_error_unknown

Trying to change the pin, how to close dialog after pin changed

I am trying to change pin in the Settings screen. But I am not able to close the dialogue after changing the pin.

ActionLockingHelper.unlockIfRequired(mContext, new UnlockDialogBuilder.UnlockEventListener(){
public void onCanceled(){ } // Dialog was closed without entry
public void onUnlockFailed(String reason){ } // Not called with default Dialog, instead is handled internally
public void onUnlockSuccessful(){
new CreateLockDialogBuilder(mContext,
new CreateLockDialogBuilder.LockCreationListener(){
public void onLockCanceled(){ } // Dialog was closed without entry
public void onLockSuccessful(){
ActionLockingHelper.unlockIfRequired(mContext, new UnlockDialogBuilder.UnlockEventListener(){
public void onCanceled(){ } // Dialog was closed without entry
public void onUnlockFailed(String reason){ } // Not called with default Dialog, instead is handled internally
public void onUnlockSuccessful(){
// Want to close the dialog here
}
});
}
})
.show();
}
});

Translations

It would be great if this library would be translated.

I would suggest using Weblate, as it makes it very easy for non-technical translators. They have free hosting for Open Source projects: https://weblate.org/en-gb/hosting/ (scroll down to "Weblate proudly supports libre projects")

error while using this library

Hi , i am using this library for pin lock in my app, but i am getting error , please find the below

java.lang.NullPointerException: Attempt to invoke virtual method 'void com.guardanis.applock.pin.PINItemAnimator.cancel()' on a null object reference
11-10 15:03:46.275 30423-30423/competent.groove.feetport W/System.err:     at com.guardanis.applock.pin.PINInputView.cancelPreviousAnimation(PINInputView.java:183)
11-10 15:03:46.275 30423-30423/competent.groove.feetport W/System.err:     at com.guardanis.applock.pin.PINInputView.animate(PINInputView.java:173)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at com.guardanis.applock.pin.PINInputView.animateLastIn(PINInputView.java:169)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at com.guardanis.applock.pin.PINInputView.afterTextChanged(PINInputView.java:154)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.widget.TextView.sendAfterTextChanged(TextView.java:7706)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:9494)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:972)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:516)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.text.method.NumberKeyListener.onKeyDown(NumberKeyListener.java:121)
11-10 15:03:46.276 30423-30423/competent.groove.feetport W/System.err:     at android.widget.TextView.doKeyDown(TextView.java:5812)
11-10 15:03:46.277 30423-30423/competent.groove.feetport W/System.err:     at android.widget.TextView.onKeyDown(TextView.java:5625)
11-10 15:03:46.277 30423-30423/competent.groove.feetport W/System.err:     at android.view.KeyEvent.dispatch(KeyEvent.java:2632)
11-10 15:03:46.277 30423-30423/competent.groove.feetport W/System.err:     at android.view.View.dispatchKeyEvent(View.java:8416)
11-10 15:03:46.278 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.278 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1495)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2361)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1709)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.app.Activity.dispatchKeyEvent(Activity.java:2712)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:543)
11-10 15:03:46.279 30423-30423/competent.groove.feetport W/System.err:     at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:315)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2276)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4090)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4052)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3604)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3657)
11-10 15:03:46.280 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3623)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3740)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3631)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3797)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3604)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3657)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3623)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3631)
11-10 15:03:46.283 30423-30423/competent.groove.feetport W/System.err:     at 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.