Android validation library which helps developer boil down the tedious work to three easy steps.

Overview

API JCenter JitPack Build & Test Travis CI Status CircleCI Status Codacy Badge Android Arsenal Android Weekly Trusted By Many Apps AppBrain

AwesomeValidation

Introduction

Implement validation for Android within only 3 steps. Developers should focus on their awesome code, and let the library do the boilerplate. And what's more, this could help keep your layout file clean.

Steps

  1. Declare validation style;
  2. Add validations;
  3. Set a point when to trigger validation.

Sample code

// Step 1: designate a style
AwesomeValidation mAwesomeValidation = new AwesomeValidation(BASIC);
// or
AwesomeValidation mAwesomeValidation = new AwesomeValidation(COLORATION);
mAwesomeValidation.setColor(Color.YELLOW);  // optional, default color is RED if not set
// or
AwesomeValidation mAwesomeValidation = new AwesomeValidation(UNDERLABEL);
mAwesomeValidation.setContext(this);  // mandatory for UNDERLABEL style
// setUnderlabelColor is optional for UNDERLABEL style, by default it's holo_red_light
mAwesomeValidation.setUnderlabelColorByResource(android.R.color.holo_orange_light); // optional for UNDERLABEL style
mAwesomeValidation.setUnderlabelColor(ContextCompat.getColor(this, android.R.color.holo_orange_dark)); // optional for UNDERLABEL style
// or
AwesomeValidation mAwesomeValidation = new AwesomeValidation(TEXT_INPUT_LAYOUT);
mAwesomeValidation.setTextInputLayoutErrorTextAppearance(R.style.TextInputLayoutErrorStyle); // optional, default color is holo_red_light if not set
// by default, it automatically sets focus to the first failed input field after validation is triggered
// you can disable this behavior by
AwesomeValidation.disableAutoFocusOnFirstFailure();

// Step 2: add validations
// support regex string, java.util.regex.Pattern and Guava#Range
// you can pass resource or string
mAwesomeValidation.addValidation(activity, R.id.edt_name, "[a-zA-Z\\s]+", R.string.err_name);
mAwesomeValidation.addValidation(activity, R.id.edt_tel, RegexTemplate.TELEPHONE, R.string.err_tel);
mAwesomeValidation.addValidation(activity, R.id.edt_email, android.util.Patterns.EMAIL_ADDRESS, R.string.err_email);
mAwesomeValidation.addValidation(activity, R.id.edt_year, Range.closed(1900, Calendar.getInstance().get(Calendar.YEAR)), R.string.err_year);
mAwesomeValidation.addValidation(activity, R.id.edt_height, Range.closed(0.0f, 2.72f), R.string.err_height);
// or
mAwesomeValidation.addValidation(editText, "regex", "Error info");

// to validate TextInputLayout, pass the TextInputLayout, not the embedded EditText
AwesomeValidation mAwesomeValidation = new AwesomeValidation(TEXT_INPUT_LAYOUT);
mAwesomeValidation.addValidation(activity, R.id.til_email, Patterns.EMAIL_ADDRESS, R.string.err_email);

// to validate the confirmation of another field
String regexPassword = "(?=.*[a-z])(?=.*[A-Z])(?=.*[\\d])(?=.*[~`[email protected]#\\$%\\^&\\*\\(\\)\\-_\\+=\\{\\}\\[\\]\\|\\;:\"<>,./\\?]).{8,}";
mAwesomeValidation.addValidation(activity, R.id.edt_password, regexPassword, R.string.err_password);
// to validate a confirmation field (don't validate any rule other than confirmation on confirmation field)
mAwesomeValidation.addValidation(activity, R.id.edt_password_confirmation, R.id.edt_password, R.string.err_password_confirmation);

// to validate with a simple custom validator function
mAwesomeValidation.addValidation(activity, R.id.edt_birthday, new SimpleCustomValidation() {
    @Override
    public boolean compare(String input) {
        // check if the age is >= 18
        try {
            Calendar calendarBirthday = Calendar.getInstance();
            Calendar calendarToday = Calendar.getInstance();
            calendarBirthday.setTime(new SimpleDateFormat("dd/MM/yyyy", Locale.US).parse(input));
            int yearOfToday = calendarToday.get(Calendar.YEAR);
            int yearOfBirthday = calendarBirthday.get(Calendar.YEAR);
            if (yearOfToday - yearOfBirthday > 18) {
                return true;
            } else if (yearOfToday - yearOfBirthday == 18) {
                int monthOfToday = calendarToday.get(Calendar.MONTH);
                int monthOfBirthday = calendarBirthday.get(Calendar.MONTH);
                if (monthOfToday > monthOfBirthday) {
                    return true;
                } else if (monthOfToday == monthOfBirthday) {
                    if (calendarToday.get(Calendar.DAY_OF_MONTH) >= calendarBirthday.get(Calendar.DAY_OF_MONTH)) {
                        return true;
                    }
                }
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }
}, R.string.err_birth);

// to validate with your own custom validator function, warn and clear the warning with your way
mAwesomeValidation.addValidation(activity, R.id.spinner_tech_stacks, new CustomValidation() {
    @Override
    public boolean compare(ValidationHolder validationHolder) {
        if (((Spinner) validationHolder.getView()).getSelectedItem().toString().equals("< Please select one >")) {
            return false;
        } else {
            return true;
        }
    }
}, new CustomValidationCallback() {
    @Override
    public void execute(ValidationHolder validationHolder) {
        TextView textViewError = (TextView) ((Spinner) validationHolder.getView()).getSelectedView();
        textViewError.setError(validationHolder.getErrMsg());
        textViewError.setTextColor(Color.RED);
    }
}, new CustomErrorReset() {
    @Override
    public void reset(ValidationHolder validationHolder) {
        TextView textViewError = (TextView) ((Spinner) validationHolder.getView()).getSelectedView();
        textViewError.setError(null);
        textViewError.setTextColor(Color.BLACK);
    }
}, R.string.err_tech_stacks);

// Step 3: set a trigger
findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mAwesomeValidation.validate();
    }
});

// Optional: remove validation failure information
findViewById(R.id.btn_clr).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mAwesomeValidation.clear();
    }
});

Attention

  • It works perfectly with Fragment, but please pay attention to Fragment's lifecycle. You should set the validate() inside Fragment's onActivityCreated instead of onCreateView or any other early stage.

  • UNDERLABEL validation style doesn't support ConstraintLayout at the moment, please use other validation styles. There is an open issue here.

Import as dependency

For Gradle it's easy - just add below to your module's build.gradle (it's available on JCenter):

dependencies {
    implementation 'com.basgeekball:awesome-validation:4.2'
}

Alternatively, it's also available on JitPack:

  • Add it in your root build.gradle at the end of repositories:
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  • Add the dependency
dependencies {
    implementation 'com.github.thyrlian:AwesomeValidation:v4.2'
    // you can also use the short commit hash to get a specific version
    // implementation 'com.github.thyrlian:AwesomeValidation:GIT_COMMIT_HASH'
}

Screenshots

Release guide

  • Update version number in build.gradle, gradle.properties and README
  • Create new git tag: v*.*
  • Run ./gradlew clean build && ./gradlew generateRelease to generate release zip file
  • Run ./gradlew bintrayUpload to create a new version in bintray (first make sure that environment variables BINTRAY_USER & BINTRAY_KEY are set)
  • Upload release zip file manually to bintray, make sure to check 'Explode this archive'

Stargazers over time

Stargazers over time

License

Copyright (c) 2014-2021 Jing Li. See the LICENSE file for license rights and limitations (MIT).

Comments
  • TextInputLayout validation doesn't work.

    TextInputLayout validation doesn't work.

    It doesn't work with the TextInputLayout validation. Implementation: ` Java Code

    AwesomeValidation awesomeValidation = new AwesomeValidation(ValidationStyle.TEXT_INPUT_LAYOUT);
    
    awesomeValidation.addValidation(getActivity(), R.id.test_til_email,Patterns.EMAIL_ADDRESS, R.string.error_email);
    
     awesomeValidation.validate()
    

    *XML

    <android.support.design.widget.TextInputLayout
            android:id="@+id/test_til_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="enter email" />
        </android.support.design.widget.TextInputLayout>
    
    opened by khadkarajesh 12
  • Focus runs away ... :(

    Focus runs away ... :(

    https://gyazo.com/c41f51d2253ea5dbef0dcdb0d290c252

            val validation = AwesomeValidation(ValidationStyle.TEXT_INPUT_LAYOUT)
            validation.addValidation(
                    address_edittext_layout,
                    Patterns.EMAIL_ADDRESS,
                    getString(R.string.incorrect_input_type)
            )
            val passwordRegex = "(?=.*[a-zA-Z])(?=.*[\\d]).{8,}"
            validation.addValidation(
                    password_edittext_layout,
                    passwordRegex,
                    getString(R.string.incorrect_password)
            )
    

    validation.validate() is fired on TextWatcher#afterTextChanged Is there a solution?

    opened by rnitame 11
  • Scroll to error field

    Scroll to error field

    Is there a way to scroll and focus on the error field? Right now, all invalid fields are red, but the page stays scrolled to the bottom when it's a long form.

    Thank you, Igor

    opened by IgorGanapolsky 10
  • Problem when using another language..

    Problem when using another language..

    The validation from a-z or A-Z is not working when using another language input. Which does not contain these alphabets. Please help SUNIL THOMBARE, INDIA, Pune +91-9423009650

    opened by SunilThombare 8
  • How to Add validation on dynamically added fragment editttext

    How to Add validation on dynamically added fragment editttext

    I am working on an android app In which similar Fragments(each fragment containing some edit-texts) are added to activity pro-grammatically. I want to validate all fragment edit text data on activity button click event so that all data can be validated.How this can achieved?

    opened by rohitbhoite 8
  • Don't validate invisible or gone fields

    Don't validate invisible or gone fields

    When a field is gone or invisible, it is impossible for the user to fill it. Maybe it is possible to don't validate it ?

    Validator.java; Method checkFields :

    protected boolean checkFields(ValidationCallback callback)
    {
            boolean result = true;
            mHasFailed = false;
            for (ValidationHolder validationHolder : mValidationHolderList)
            {
    // Patch
               if (validationHolder.getEditText() != null
                    && validationHolder.getEditText().getVisibility() != View.VISIBLE)
                {
                    continue;
                }
    // End Patch        
    
                if (validationHolder.isRegexType())
                ...
    
    opened by MatthieuFereyre 8
  • validate() always return true in DialogFragment

    validate() always return true in DialogFragment

    Hi, i'm using AwesomeValidation to validate some fields in a DialogFragment but everytime i click my button the validation method always return true. I've already put my addValidation's and my clickEventListener in onActivityCreated as the README suggests but still not working, also, i've check i'm usging the right activity, here is the code of onViewCreated and onActivityCreated:

     @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            name = view.findViewById(R.id.name);
            lastName = view.findViewById(R.id.last_name);
            address = view.findViewById(R.id.address);
            phoneNumber = view.findViewById(R.id.phone_number);
            courtDate = view.findViewById(R.id.court_date);
            cancelDialog = view.findViewById(R.id.cancel_dialog);
            confirmDialog = view.findViewById(R.id.confirm_dialog);
            cancelDialog.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dismiss();
                }
            });
    
        }
    
    @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            simpleCustomValidation = new SimpleCustomValidation() {
                @Override
                public boolean compare(String s) {
                    if(s.length()>=3){
                        return true;
                    }
                    return false;
                }
            };
            awesomeValidation.addValidation(getActivity(), R.id.name,simpleCustomValidation,R.string.err_name);
            awesomeValidation.addValidation(getActivity(), R.id.last_name, simpleCustomValidation,R.string.err_last);
            awesomeValidation.addValidation(getActivity(), R.id.address, simpleCustomValidation,R.string.err_address);
            awesomeValidation.addValidation(getActivity(), R.id.phone_number, Patterns.PHONE,R.string.err_address);
            confirmDialog.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.i("DIALOG FRAGMENT","awesome validation result: "+awesomeValidation.validate());
                    if(awesomeValidation.validate()){
                        onDatosCheckIn listener = (onDatosCheckIn) getActivity();
                        listener.onFinish(name.getText().toString(),lastName.getText().toString(),
                                address.getText().toString(),phoneNumber.getText().toString());
                    }
                }
            });
        }
    

    ¿So, where is the problem?

    opened by isairuiz 5
  • Crash when triggering .validate() twice

    Crash when triggering .validate() twice

    I got this exception when user clicking validate button twice

    E/AndroidRuntime: FATAL EXCEPTION: main
                      Process: br.com.moneto, PID: 19109
                      java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
                          at android.view.ViewGroup.addViewInner(ViewGroup.java:4937)
                          at android.view.ViewGroup.addView(ViewGroup.java:4768)
                          at android.view.ViewGroup.addView(ViewGroup.java:4708)
                          at com.basgeekball.awesomevalidation.utility.ViewsInfo.restoreViews(SourceFile:32)
                          at com.basgeekball.awesomevalidation.validators.UnderlabelValidator.halt(SourceFile:81)
                          at com.basgeekball.awesomevalidation.AwesomeValidation.clear(SourceFile:190)
                          at br.com.moneto.presentation.maqvirtual.MaqVirtualClientsNewActivity.saveClient(MaqVirtualClientsNewActivity.kt:77)
                          at br.com.moneto.presentation.maqvirtual.MaqVirtualClientsNewActivity$onCreate$1.onClick(MaqVirtualClientsNewActivity.kt:68)
                          at android.view.View.performClick(View.java:6294)
                          at android.view.View$PerformClick.run(View.java:24770)
                          at android.os.Handler.handleCallback(Handler.java:790)
                          at android.os.Handler.dispatchMessage(Handler.java:99)
                          at android.os.Looper.loop(Looper.java:164)
                          at android.app.ActivityThread.main(ActivityThread.java:6494)
                          at java.lang.reflect.Method.invoke(Native Method)
                          at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
    
    opened by pedrovilela 5
  • mAwesomeValidation.validate()

    mAwesomeValidation.validate()

    if (mAwesomeValidation.validate()) { //awsome validator implemented inside fragment, gives below error

    Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference

    opened by hafs-r 5
  • Remove Guava Dependency

    Remove Guava Dependency

    Hi:

    Guava dependency takes a lot of space when releasing a build. So having the Dependency is such a problem with the usage on an Android App.

    It should be removed, so at least up to 4Mb of space can be saved up.

    enhancement help wanted 
    opened by MiguelChan 5
  • when EditText show validation error tooltip in pager

    when EditText show validation error tooltip in pager

    hi!

    i have 2 pages. and i can scroll page to left and after that i have see second page

    when i scroll - validation tooltip sticky to the left side of screen

    i have attached img pic_2 pic_3 pic_4

    opened by boomsya 5
  • Doesn't AwesomeValidation works on DialogFragments?

    Doesn't AwesomeValidation works on DialogFragments?

    I have implemented AwesomeValidation on other Fragment classes (moving .validate() to onViewCreated() instead of onActivityCreated as it's now deprecated - that should be changed in README- ). But whenever I try to implement it on DialogFragments it does nothing.

    Do I need to implement the method in a different way if it's a DialogFragment or is AwesomeValidation only usable in Activity and Fragment classes?

    I couldn't find any information about that on README.

    opened by alberto-diaz15 0
  • Duplicate Underlabels When Validating Twice

    Duplicate Underlabels When Validating Twice

    I encountered an error when using the UNDERLABEL style.

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:5034) at android.view.ViewGroup.addView(ViewGroup.java:4865) at android.view.ViewGroup.addView(ViewGroup.java:4805) at com.basgeekball.awesomevalidation.utility.ViewsInfo.restoreViews(SourceFile:32) at com.basgeekball.awesomevalidation.validators.UnderlabelValidator$2.onTextChanged(SourceFile:131) at android.widget.TextView.sendOnTextChanged(TextView.java:9754) at android.widget.TextView.handleTextChanged(TextView.java:9851) at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:12509) at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:1263) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:575) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:506) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:36) at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:843) at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:197) at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183) at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:341) at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

    I have 4 EditText views, two of which are using basic regex validation, and two that are using SimpleCustomValidation. My validations are run on a button click. If there has already been an underlabel added, a duplicate one gets right below. When an attempt is made to change the value in the EditText, the above exception gets thrown. I tried adding in a validation.clear() after all my validation.addValidation() calls.

    It may also be worth mentioning that I am using androidx libraries. My other validations are working as intended. The only difference here is that this is on an Activity instead of a Fragment.

    opened by mbobic93 2
  • Kotlin Migration: Convert tests to Kotlin part 1

    Kotlin Migration: Convert tests to Kotlin part 1

    • Fixes: https://github.com/thyrlian/AwesomeValidation/issues/74.
    • Converted test classes AwesomeValidationTest, ValidationHolderTest, ValidationStyleTest to Kotlin.
    • Ensured all the tests are running and are passed successfully.
    • Added Kotlin version 1.3.50 to the project.
    opened by shbhmnk 1
  • UNDERLABEL doesn't work on ConstraintLayout

    UNDERLABEL doesn't work on ConstraintLayout

    device-2017-07-09-134358

    For given layout:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="anddev.mat.pckplace.CreateAccount">
    
        <EditText
            android:id="@+id/email"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:ems="10"
            android:inputType="textEmailAddress"
            android:text="[email protected]"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <EditText
            android:id="@+id/password"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:ems="10"
            android:inputType="textPassword"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/email" />
    
        <Button
            android:id="@+id/joinButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="Join"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/password" />
    
        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.185" />
    
    </android.support.constraint.ConstraintLayout>
    
    bug 
    opened by matiit 8
Owner
Jing Li
Code ⌨ & Play 🏀 傾奇者, @freenowtech, formerly @ViacomInc @eBay, @heremaps, @sony, @MotorolaMobilityLLC, 50+ one arm pushups in 1min, 吃得多穿得少
Jing Li
Bulletin helps you to "swipe" through your favorite events in the campus and gives you the perfect match for your better experience

Bulletin helps you to "swipe" through your favorite events in the campus and gives you the perfect match for your better experience. Right swipe to add event to your calendar and left swipe to view the next event.

GDSC Navrachana University 7 Feb 11, 2022
Using Resilience4J, this is a Demo project which uses a Library as background and manages all its requests.

Using Resilience4J, this is a Demo project which uses a Library as background and manages all its requests. This library can rent books online and the usage rate is extremely high. There is a reactive way to access, which is the one normally used, but sometimes, the system needs a bit of help from an old machine running a non-reactive MVC Spring application using JPA. Let's make this in Kotlin and find the best solution!

João Filipe Sabino Esperancinha 2 Jan 10, 2022
vShell (Virtual Shell) — a successor of Termux project which provides an alternate implementation of the Linux terminal emulator for Android OS

vShell (Virtual Shell) — a successor of Termux project which provides an alternate implementation of the Linux terminal emulator for Android OS

null 2 Feb 1, 2022
An auto IBCS API response status checking tool which test tax, address and account module

IB IBCS API Test Tool An auto IBCS API response status checking tool which test tax, address and account module. Getting Started Cd to the cloned dire

Gabriel Liu 0 Oct 15, 2021
Recruitment Task App - record time which a user spends on tasks defined by himself

Recruitment-Task The purpose of this application is to record time which a user spends on tasks defined by himself. The user can add new tasks. New ta

Sylwester Zieliński 0 Feb 9, 2022
Starter-Android-Library - Starter Android Library is an Android Project with Modular Architecture.

Starter-Android-Library - Starter Android Library is an Android Project with Modular Architecture.

OpenBytes 1 Feb 18, 2022
ZXing ("Zebra Crossing") barcode scanning library for Java, Android

Project in Maintenance Mode Only The project is in maintenance mode, meaning, changes are driven by contributed patches. Only bug fixes and minor enha

ZXing Project 30.5k Dec 27, 2022
An android library for displaying fps from the choreographer and percentage of time with two or more frames dropped

DEPRECATED TinyDancer is deprecated. No more development will be taking place. Check out the Google Android developer documentation for UI performance

Friendly Robot 1.9k Jan 3, 2023
Android Library to help you with your runtime Permissions.

PermissionHelper Android Library to help you with your runtime Permissions. Demo Android M Watch it in action. Pre M Watch it in action. Nexus 6 (M) N

Kosh Sergani 1.2k Dec 14, 2022
A plug and play ;) android library for displaying a "rate this app" dialog

Easy Rating Dialog This lib provides a simple way to display an alert dialog for rating app. Default conditions to show: User opened the app more than

Fernando Martínez 111 Dec 30, 2022
Android library that manages your app's cached data with ease.

Teller Android library that makes your apps faster. Teller facilitates the downloading, saving, and reading of the cached data of your app. Keep your

Levi Bostian 14 Apr 2, 2022
Tutorial For openJDK 11 and AGP 7.0.0+ | Tutorial Multi Library Android in 1 Project | Groovy

jitpack-library-guide For openJDK 11 and AGP 7.0.0 + Please read every single note for detail Tutorial Click Here Kotlin DSL Click Here Repository for

Faisal Amir 7 Dec 10, 2022
AboutLibraries is a library to offer some information of libraries.

AboutLibraries .. allows you to easily create an used open source libraries fragment/activity within your app. All the library information is automati

Mike Penz 3.1k Jan 3, 2023
Makes Google play in app purchase library (BillingClient) into a flowable that can easily be used in compose world

Billy the android Our goal is to make a modern api of BillingClient so that it is easier to use in compose world. This library is still early beta and

Stefan Wärting 16 Dec 14, 2022
Simple Artificial Neural Network java library

SANN Simple Artificial Neural Network java library WIP Creating neural network Variant 1 //create new net (input, hidden, default len, output) Net net

Korpusov Maxim 14 Oct 11, 2022
A library to display pokemon with Shakespearean descriptions

Pokemon Shakespeare SDK A library to display pokemon with Shakespearean descriptions Dependencies Java 11 Retrofit Picasso Material Appcompat Usage Cr

Keenen Charles 0 Nov 12, 2021
ArduinoJava - A project that uses the JSSC library

ArduinoJava este es un proyecto que utiliza la libreria JSSC para connectarse al

null 0 Jan 24, 2022
Editframe Kotlin Client library

Editframe Kotlin Client library Installing Add the project to your gradle dependencies.

editframe 2 Apr 7, 2022
Open-source Desktop library to connect Alsat pardakht peyment API

Open-source Desktop library to connect Alsat pardakht peyment API

Alsat Pardakht 3 Apr 4, 2022