A Material design Android pincode library. Supports Fingerprint.

Related tags

UI/UX LolliPin
Overview

LolliPin Android Arsenal

A Lollipop material design styled android pincode library (API 14+)

To include in your project, add this to your build.gradle file:

   //Lollipin
   compile ('com.github.orangegangsters:lollipin:2.0.0@aar') {
      transitive = true
   }

Starting from version 2.1.0 we will have a different package name:

   //Lollipin
   compile ('com.github.omadahealth:lollipin:2.1.0@aar') {
      transitive = true
   }

Demo Demo

========

By

Developers: Olivier Goutay and Stoyan Dimitrov and Dae Park

Contributors: Art Beatte IV, Alex Morgan

Designers: Yassine Bentaieb

========

Security

Password protection

The password itself is not saved, only its hash using the SHA-1 algorithm. This hash is then saved on the SharedPreferences, allowing to verify that the user entered the right PinCode, without giving the possibility to retrieve it.

Introducing Fingerprint

Once the user has enabled the password, he can also use his fingerprint scanner (using Google Api, not Samsung) to unlock his device.

========

Usage

If you want an example on how to use it, you can find an example app in this repo.

========

Preparing dependencies

We are using a custom version of RippleView that contains a RippleAnimationListener. In order to be able to fetch this dependency, you need to add these lines into your main build.gradle file:

allprojects {
    repositories {
        maven{
            url "https://github.com/omadahealth/omada-nexus/raw/master/release"
        }
        jcenter()

    }
}

========

Overriding the AppLockActivity

In order to use the "Forgot" system, we let you extend the AppLockActivity class to provide your own way of handling the user behaviour in this case (logout, delete datas etc...)

public class CustomPinActivity extends AppLockActivity {
    @Override
    public void showForgotDialog() {
        //Launch your popup or anything you want here
    }
}

========

Init

Advised to be done by extending the Application, but can be done elsewhere. The method below provides a way to enable or disable the PinCode system:

========

Enabling
LockManager<CustomPinActivity> lockManager = LockManager.getInstance();
lockManager.enableAppLock(this, CustomPinActivity.class);

Once enabled, you must extend "PinActivity" for every Activity you wish to protect.

========

Disabling
LockManager<CustomPinActivity> lockManager = LockManager.getInstance();
lockManager.disableAppLock();

========

Set up the PinCode

Whenever you want the user to set up his pin code, you need to request:

Intent intent = new Intent(MainActivity.this, CustomPinActivity.class);
intent.putExtra(AppLock.EXTRA_TYPE, AppLock.ENABLE_PINLOCK);
startActivityForResult(intent, REQUEST_CODE_ENABLE);

========

Unlock system

As soon as you enable the PinCode system, the Unlock screen will appear by itself when the user resume the app after a defined timeout. Please refer to the next section to know how to customize these values.

========

Customization

Some features are customizable:

The unlock timeout:

LockManager<CustomPinActivity> lockManager = LockManager.getInstance();
lockManager.getAppLock().setTimeout(10000);

The pin length required:

public class CustomPinActivity extends AppLockActivity {

    ...
    ...

    @Override
    public int getPinLength() {
        return 5;
    }

    ...
    ...
}

The logo displayed at the top of the page:

LockManager<CustomPinActivity> lockManager = LockManager.getInstance();
lockManager.getAppLock().setLogoId(R.drawable.security_lock);

The ignored activities:

For instance you got a login activity that you want to avoid getting the lock screen, you can ignore this activity by doing:

LockManager<CustomPinActivity> lockManager = LockManager.getInstance();
lockManager.getAppLock().addIgnoredActivity(NotLockedActivity.class);

The AppLockActivity Layout:

By providing a custom layout to getContentView() you can alter how your AppLockActivity looks. However, you must include 4 required elements:

  • TextView with an id of pin_code_step_textview
  • TextView with an id of pin_code_forgot_textview
  • PinCodeRoundView with an id of pin_code_round_view
  • KeyboardView with an id of pin_code_keyboard_view
@Override
    public int getContentView() {
        return R.layout.activity_pin;
    }

The Pin Dots:

By supplying alternate drawable resources for app:lp_empty_pin_dot and app:lp_full_pin_dot you can custimize how it looks.

<com.github.orangegangsters.lollipin.lib.views.PinCodeRoundView
                android:id="@+id/pin_code_round_view"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="@dimen/pin_code_round_top_margin"
                android:layout_marginBottom="@dimen/pin_code_elements_margin"
                app:lp_empty_pin_dot="@drawable/pin_empty_dot"
                app:lp_full_pin_dot="@drawable/pin_full_dot"/>

========

Credits

========

License

The MIT License (MIT)

Copyright (c) 2015 OrangeGangsters

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Comments
  • Fix for PIN lock bypass when app is killed or repeatedly paused

    Fix for PIN lock bypass when app is killed or repeatedly paused

    Several issues reported that the PIN lock can be bypassed, which was related to the onlyBackgroundTimeout setting. The root cause was the logic deciding when the user was last active. This PR fixes these issues.

    The issues could be reproduced in the demo app when setting onlyBackgroundTimeOut to true:

    • Launch the app
    • Set the expiry to N seconds (or use the default 10 seconds)
    • Kill the app
    • Wait N + 1 seconds
    • Launch the app

    Or (not 100% reproducible on all devices)

    • Launch the app
    • Set the expiry to N seconds (or use the default 10 seconds)
    • Send to background via home button
    • Wait N + 1 seconds
    • Launch the app
    • Send to background via home button
    • Launch the app

    This PR keeps the previous functionality and additionally enhances the behavior when onlyBackground is set to true.

    Issues addressed:

    #130 #153 #131 #99

    opened by alexkeramidas 14
  • It doesn't work when the first time I set the password

    It doesn't work when the first time I set the password

    here are my step: 1.click"Enable", set my password 2.press back button to exit 3.press recent button and swipe to clear LolliPin demo progress 4.launch LolliPin demo again , click"Check", and input the password what I see was that the keyboard shocked which means password was wrong 5.exit demo, clear demo progress, and repeat step 1,2,3,4 and this time it works

    so, what cause it and could it be fixed ?

    opened by MyateJx 14
  • Killing the app will bypass the lockpin if onlyBackgroundTimeout is true

    Killing the app will bypass the lockpin if onlyBackgroundTimeout is true

    Condition:

    • onlyBackgroundTimeout=true
    • timeout > 0 (i.e. long enough to allow the app to be closed and reopened roughly > 5 seconds)

    Killing the app while the lockscreen is visible will reset the timer allowing the user to reopen the app and bypass the lockscreen.

    I have narrowed this down to AppLockImpl.java line 382 where setLastActiveMillis() is set if onlyBackgroundTimeout is true during onActivityPaused(). Since onActivityPaused() is called when the LockScreen is displayed this will trigger the setLastActiveMillis(). When the app is killed and relaunched the LockManager thinks the app had previously been unlocked and allows entry.

    opened by wesjpaul 12
  • No resource identifier found for attributes

    No resource identifier found for attributes

    Hey there,

    I just can't get around these errors below. Could you please send me some tips?

    Error:(2) No resource identifier found for attribute 'rv_centered' in package 'my.package.example'
    Error:(2) No resource identifier found for attribute 'rv_rippleDuration' in package 'my.package.example'
    Error:(2) No resource identifier found for attribute 'rv_ripplePadding' in package 'my.package.example'
    Error:(2) No resource identifier found for attribute 'rv_color' in package 'my.package.example'
    

    When i add "compile 'com.github.traex.rippleeffect:library:1.2.4' it compiles, but i'm still unable to use PinActivity.

    opened by mseroczynski 12
  • At least one fingerprint must be enrolle

    At least one fingerprint must be enrolle

    Hi, in android 6.0 throws this error, having no mark set.

    java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use

    You could place a parameter to enable or disable fingerprint authentication?

    Thanks.

    Trace error: FATAL EXCEPTION: main Process: com.client.wittygrowth.pandco, PID: 14903 java.lang.RuntimeException: Unable to resume activity {com.client.wittygrowth.pandco/com.client.wittygrowth.pandco.ui.app.security.CustomPinActivity}: java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) at android.app.ActivityThread.-wrap11(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.createKey(FingerprintUiHelper.java:277) at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.initCipher(FingerprintUiHelper.java:241) at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.startListening(FingerprintUiHelper.java:140) at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.initLayoutForFingerprint(AppLockActivity.java:148) at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.onResume(AppLockActivity.java:82) at com.client.wittygrowth.pandco.ui.app.security.CustomPinActivity.onResume(CustomPinActivity.java:29) at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258) at android.app.Activity.performResume(Activity.java:6312) at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092) at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: java.security.InvalidAlgorithmParameterException: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:238) at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:53) at javax.crypto.KeyGenerator.init(KeyGenerator.java:189) at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.createKey(FingerprintUiHelper.java:266) at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.initCipher(FingerprintUiHelper.java:241)  at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.startListening(FingerprintUiHelper.java:140)  at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.initLayoutForFingerprint(AppLockActivity.java:148)  at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.onResume(AppLockActivity.java:82)  at com.client.wittygrowth.pandco.ui.app.security.CustomPinActivity.onResume(CustomPinActivity.java:29)  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)  at android.app.Activity.performResume(Activity.java:6312)  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  Caused by: java.lang.IllegalStateException: At least one fingerprint must be enrolled to create keys requiring user authentication for every use at android.security.keystore.KeymasterUtils.addUserAuthArgs(KeymasterUtils.java:115) at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:234) at android.security.keystore.AndroidKeyStoreKeyGeneratorSpi$AES.engineInit(AndroidKeyStoreKeyGeneratorSpi.java:53)  at javax.crypto.KeyGenerator.init(KeyGenerator.java:189)  at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.createKey(FingerprintUiHelper.java:266)  at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.initCipher(FingerprintUiHelper.java:241)  at com.github.orangegangsters.lollipin.lib.managers.FingerprintUiHelper.startListening(FingerprintUiHelper.java:140)  at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.initLayoutForFingerprint(AppLockActivity.java:148)  at com.github.orangegangsters.lollipin.lib.managers.AppLockActivity.onResume(AppLockActivity.java:82)  at com.client.wittygrowth.pandco.ui.app.security.CustomPinActivity.onResume(CustomPinActivity.java:29)  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)  at android.app.Activity.performResume(Activity.java:6312)  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)  at android.app.ActivityThread.-wrap11(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5417)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

    opened by INHack20 11
  • add sha-256 hash algorithm

    add sha-256 hash algorithm

    Hi Orange Gangsters,

    Thank you for the great library. It works perfectly on my phone. The only concern is that sha-1 might not be secure enough in my use case, which is why I opened this PR.

    Is this something you want to merge into your codebase?

    Thanks,

    Huang

    opened by hyugit 11
  • Enables reacting to user pin attempts in AppLockActivity.

    Enables reacting to user pin attempts in AppLockActivity.

    This is a squashed version of "Feature/attempt listening #12".

    By overriding

    public void onPinSuccess(int attempts)

    and/or

    public void onPinFailure(int attempts)

    you can react to a user passing or failing a pin code challenge. Example: after 5 incorrect pin attempts log a user out and close the app.

    opened by abeatte 10
  • Support Library Support is Gone

    Support Library Support is Gone

    Support for the support library v7 was added in this commit, but then the changes that enabled it were removed in this commit. Specifically, PinAcitivity was changed to extend from Activity again rather than AppCompatActivity. Since the commit message doesn't mention anything about removing the support library, I'm thinking that it might not have been intentional.

    I can make a pull request to reenable the support library, but I wanted to make sure it wasn't intentionally removed before I start.

    opened by axemorgan 9
  • Allows backing out of Pin Change and Pin Disable.

    Allows backing out of Pin Change and Pin Disable.

    Allows for use of the back button only when a user is not entering a pin in for a pin challenge. This means that if the user is changing, removing, or setting a pin they can back out and cancel the process.

    Squashed PR of "Feature/cancel #14"

    opened by abeatte 9
  • Add Secure Password Encryption

    Add Secure Password Encryption

    Hi, I would like to know if you plan to extend the encryption of this library to feature a PBKDF2 key stretching algorithm in addition with password salting. This would drastically improve the pin security. Implementations of this are very easy to find here for example: http://android-developers.blogspot.de/2013/02/using-cryptography-to-store-credentials.html

    Thank you in advance! Nico

    opened by ncioj10 8
  •  No resource identifier found for attribute

    No resource identifier found for attribute

    I get the following error when trying to use the lib. I just added the gradle dependency without adding actual code.

    [my folders]/app/build/intermediates/exploded-aar/com.github.orangegangsters/lollipin/1.0.2/res/layout/view_keyboard_button.xml Error:(2) No resource identifier found for attribute 'rv_rippleDuration' in package '[my.package.name]' Error:(2) No resource identifier found for attribute 'rv_ripplePadding' in package '[my.package.name]'

    opened by csbenz 8
  • FingerPrintUIHelper

    FingerPrintUIHelper

    I want to override the FingerPrintUIHelper methods such as showError and onAuthenticationError. What is the simplest way of doing it? Can you make the class more abstract for easy customization?

    opened by Madina-S 0
  • #157 Fix not seen in aar

    #157 Fix not seen in aar

    I could not find the code in The fix #157 in the latest aar 2.1.0 imported .Can someone tell me how to get it? When app is paused several times, the lock gets automatically unlocked.

    opened by vik17ag 0
Owner
Omada Health
We help employers and health plans tackle diabetes and heart disease in the most engaging, effective, and scalable way possible.
Omada Health
An Android library that brings the Material Design 5.1 sidebar to pre-5.1 devices.

MaterialScrollBar An Android library that brings the Material Design 5.1 scrollbar to pre-5.1 devices. Designed for Android's recyclerView. Video Imag

Turing Technologies (Wynne Plaga) 784 Nov 29, 2022
[Deprecated] Android Library that implements Snackbars (former known as Undobar) from Google's Material Design documentation.

UndoBar This lib is deprecated in favor of Google's Design Support Library which includes a Snackbar and is no longer being developed. Thanks for all

Kai Liao 577 Nov 25, 2022
An Android library that brings the Material Design 5.1 sidebar to pre-5.1 devices.

MaterialScrollBar An Android library that brings the Material Design 5.1 scrollbar to pre-5.1 devices. Designed for Android's recyclerView. Video Imag

Turing Technologies (Wynne Plaga) 784 Nov 29, 2022
A library that provides an implementation of the banner widget from the Material design.

MaterialBanner A banner displays a prominent message and related optional actions. MaterialBanner is a library that provides an implementation of the

Sergey Ivanov 252 Nov 18, 2022
An Android library supports badge notification like iOS in Samsung, LG, Sony and HTC launchers.

ShortcutBadger: The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut! Supported launchers: Sony

Leo Lin 7.2k Dec 30, 2022
DailyTags - a flexible markdown library that supports custom tags and markups

The library parses a given markup into rich text for Jetpack Compose. DailyTags comes with Markdown and HTML support by default (please, see the supported features) and is very easy to extend to support custom markups.

Dmytro 134 Dec 25, 2022
Material Design implementation for Android 4.0+. Shadows, ripples, vectors, fonts, animations, widgets, rounded corners and more.

Carbon Material Design implementation for Android 4.0 and newer. This is not the exact copy of the Lollipop's API and features. It's a custom implemen

null 3k Dec 30, 2022
A skeleton of google's appcompat android navigation drawer with material design.

Lollipop AppCompat Skeleton A skeleton of google's appcompat android navigation drawer with material design. Compatible to work on 4.0+ Based on Googl

Sachin Shinde 99 Nov 29, 2022
Material Design tap target for Android. https://sjwall.github.io/MaterialTapTargetPrompt/

Material Tap Target Prompt A Tap Target implementation in Android based on Material Design Onboarding guidelines. For more information on tap targets

Sam Wall 1.5k Jan 4, 2023
(Deprecated) A custom view component that mimics the new Material Design Bottom Navigation pattern.

BottomBar (Deprecated) I don't have time to maintain this anymore. I basically wrote the whole library in a rush, without tests, while being a serious

Iiro Krankka 8.4k Dec 29, 2022
An implementation of tap targets from the Material Design guidelines for feature discovery.

TapTargetView An implementation of tap targets from Google's Material Design guidelines on feature discovery. Min SDK: 14 JavaDoc Installation TapTar

Keepsafe 5.2k Dec 30, 2022
Drag and drop to reorder items in a list, grid or board for Android. Based on RecyclerView. Also supports swiping items in a list.

DragListView DragListView can be used when you want to be able to re-order items in a list, grid or a board. It also supports horizontal swiping of it

Magnus Woxblom 658 Nov 30, 2022
Android Material Json Form Wizard is a library for creating beautiful form based wizards within your app just by defining json in a particular format.

Android Json Wizard Android Json Wizard is a library for creating beautiful form based wizards within your app just by defining json in a particular f

Vijay Rawat 355 Nov 11, 2022
Kotlin Wrapper Library of Material-UI

kotlin-material-ui Kotlin Wrapper Library of Material-UI Core: Lab: Installation repositories { jcenter() // or maven { url 'https://dl.bintra

Subroh Nishikori 78 Nov 24, 2022
Frogo Android UI Kit - Frogo UI Design Kit Guideline

About This Project Follow-up project from frogo-ui-kit UI Kit for helping you in apps development Migrate from frogo-ui-kit Just renaming package com.

Frogobox 6 Nov 25, 2022
ScratchView 7.0 0.0 L4 Java repo is UX Design involving scratch cards like views which are scratched to reveal the information they conceal.

ScratchView Intro ScratchView repo is UX Design involving scratch cards like views which are scratched to reveal the information they conceal. There a

Harish Sridharan 1.1k Dec 24, 2022
ScratchView repo is UX Design involving scratch cards like views which are scratched to reveal the information they conceal.

ScratchView Intro ScratchView repo is UX Design involving scratch cards like views which are scratched to reveal the information they conceal. There a

Harish Sridharan 1.1k Dec 24, 2022
Awesome RunnerBe design system and more!

Honeycomb Awesome RunnerBe design system and more! Core Preview 아직 모든 요소가 구현되지 않았으며 단순히 미리보기 입니다 class MainActivity : AppCompatActivity() { overri

RunnerBe 2 Apr 21, 2022
NeoPOP was created with one simple goal; to create the next generation of a beautiful, affirmative design system

NeoPop is CRED's inbuilt library for using NeoPop components in your app

CRED 254 Dec 29, 2022