An easy drop-in PIN controller for Android
PinFragment
is the primary class provided by this library. A PinFragment
should be instantiated either for a PIN creation, or for PIN validation.
Fragment toShow = PinHelper.hasDefaultPinSaved(this) ?
PinFragment.newInstanceForVerification() :
PinFragment.newInstanceForCreation();
getFragmentManager().beginTransaction()
.replace(android.R.id.container, toShow)
.commit();
A hosting Activity
should implement PinFragment.Listener
to perform actions when a PIN has been created or validated.
public interface Listener {
public void onValidated();
public void onPinCreated();
}
By default, a user's PIN is saved in the default SharedPreference
store, and validated against that store. To override this behavior, instantiate your PinFragment
with a PinFragmentConfiguration
that provides . An example of a configuration might be
PinFragmentConfiguration config =
new PinFragmentConfiguration(context)
.pinSaver(new PinSaver(){
public void onSave(String pin) {
// ...do some saving
}
}).validator(new Validator(){
public boolean isValid(String submission){
boolean valid = // ...check against where you saved the pin
return valid;
}
});
Then, instantiation of your PinFragment
might look like this
Fragment toShow = doesHavePinSavedSomewhere() ?
PinFragment.newInstanceForVerification(config) :
PinFragment.newInstanceForCreation(config);
getFragmentManager().beginTransaction()
.replace(android.R.id.container, toShow)
.commit();
In general, any time a custom PinSaver
is defined, it should follow that a custom Validator
is also defined. This may be more strictly enforced in the future.
A very common use case for providing an alternative Validator
and PinSaver
is if you persist a user's PIN remotely and validate by making a request to your server. In this case, PinFragment
can execute your saving and checking on a background thread and show a ProgressBar
while executing. To utilize this, pass implementations of AsyncSaver
and AsyncValidator
to your configuration.
PinFragmentConfiguration config =
new PinFragmentConfiguration(context)
.pinSaver(new AsyncPinSaver(){
public void onSave(String pin){
HttpClient client = //...
client.savePin(pin);
}
}).validator(new AsyncValidator(){
public boolean isValid(String submission){
// HttpClient client = ...
// boolean valid = client.comparePin(submission);
return valid;
}
});
This configuration will instruct your PinFragment
instance to run onSave()
and isValid()
in the background and post to your PinFragment.Listener
only when a PIN has been successfully created or verified, meaning you don't need to think about scheduling things to happen in the background.
This library is hosted on Maven Central; to include add the following to your pom.xml
<dependency>
<groupId>com.venmo.android.pin</groupId>
<artifactId>library</artifactId>
<version>0.1</version>
</dependency>
For gradle builds, add the following to your build.gradle
repositories {
mavenCentral()
}
dependencies {
compile 'com.venmo.android.pin:library:0.1@aar'
}
Contributions are encouraged! If you would like to contribute, fork this repository and send a pull request. Please make sure to follow the project code style if possible. .iml/codeStyleSettings
is provided for your convenience in Android Studio/IntelliJ.