AndroidRate is a library to help you promote your Android app by prompting users to rate the app after using it for a few days.

Overview

AndroidRate Logo

AndroidRate Build Status Latest Version Supported APIs Android Arsenal Codacy Badge

AndroidRate is a library to help you promote your Android app by prompting users to rate the app after using it for a few days. Project based on Android-Rate by Shintaro Katafuchi.

AndroidRate animated screenshots

Contents

Install

Latest stable version

You can download library files from JCenter, Maven Central, JFrog Bintray (JCenter mirror), GitHub (main source), GitLab (GitHub mirror) or SourceForge (GitHub mirror).

latestVersion is Latest Version

Add the following in your app's build.gradle file:

dependencies {
    implementation "com.vorlonsoft:androidrate:${latestVersion}"
}

Latest snapshot version

If you don't want to wait for the next release, you can add the Sonatype's snapshots repository to your project root build.gradle file:

repositories {
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}

Then add the following dependency to your relevant project modules build.gradle files:

dependencies {
    implementation "com.vorlonsoft:androidrate:1.2.5-SNAPSHOT"
}

Usage

Configuration

AndroidRate library provides methods to configure it's behavior. Select the type of configuration that best describes your needs.

Nano configuration

Uses library's defaults.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  AppRate.quickStart(this); // Monitors the app launch times and shows the Rate Dialog when default conditions are met
}

Micro configuration

Configures basic library behavior only.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  AppRate.with(this)
      .setInstallDays((byte) 0)                  // default is 10, 0 means install day, 10 means app is launched 10 or more days later than installation
      .setLaunchTimes((byte) 3)                  // default is 10, 3 means app is launched 3 or more times
      .setRemindInterval((byte) 1)               // default is 1, 1 means app is launched 1 or more days after neutral button clicked
      .setRemindLaunchesNumber((byte) 1)         // default is 0, 1 means app is launched 1 or more times after neutral button clicked
      .monitor();                                // Monitors the app launch times
  AppRate.showRateDialogIfMeetsConditions(this); // Shows the Rate Dialog when conditions are met
}

Standard configuration

The choice of most corporate developers.

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  AppRate.with(this)
      .setStoreType(StoreType.GOOGLEPLAY) /* default is GOOGLEPLAY (Google Play), other options are AMAZON (Amazon Appstore), BAZAAR (Cafe Bazaar),
                                           *         CHINESESTORES (19 chinese app stores), MI (Mi Appstore (Xiaomi Market)), SAMSUNG (Samsung Galaxy Apps),
                                           *         SLIDEME (SlideME Marketplace), TENCENT (Tencent App Store), YANDEX (Yandex.Store),
                                           *         setStoreType(BLACKBERRY, long) (BlackBerry World, long - your application ID),
                                           *         setStoreType(APPLE, long) (Apple App Store, long - your application ID),
                                           *         setStoreType(String...) (Any other store/stores, String... - an URI or array of URIs to your app) and
                                           *         setStoreType(Intent...) (Any custom intent/intents, Intent... - an intent or array of intents) */
      .setTimeToWait(Time.DAY, (short) 0) // default is 10 days, 0 means install millisecond, 10 means app is launched 10 or more time units later than installation
      .setLaunchTimes((byte) 3)           // default is 10, 3 means app is launched 3 or more times
      .setRemindTimeToWait(Time.DAY, (short) 2) // default is 1 day, 1 means app is launched 1 or more time units after neutral button clicked
      .setRemindLaunchesNumber((byte) 1)  // default is 0, 1 means app is launched 1 or more times after neutral button clicked
      .setSelectedAppLaunches((byte) 1)   // default is 1, 1 means each launch, 2 means every 2nd launch, 3 means every 3rd launch, etc
      .setShowLaterButton(true)           // default is true, true means to show the Neutral button ("Remind me later").
      .set365DayPeriodMaxNumberDialogLaunchTimes((short) 3) // default is unlimited, 3 means 3 or less occurrences of the display of the Rate Dialog within a 365-day period
      .setVersionCodeCheck(true)          // default is false, true means to re-enable the Rate Dialog if a new version of app with different version code is installed
      .setVersionNameCheck(true)          // default is false, true means to re-enable the Rate Dialog if a new version of app with different version name is installed
      .setDebug(false)                    // default is false, true is for development only, true ensures that the Rate Dialog will be shown each time the app is launched
      .setOnClickButtonListener(which -> Log.d(this.getLocalClassName(), Byte.toString(which))) // Java 8+, change for Java 7-
      .monitor();                         // Monitors the app launch times

  if (AppRate.with(this).getStoreType() == StoreType.GOOGLEPLAY) { // Checks that current app store type from library options is StoreType.GOOGLEPLAY
      if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) { // Checks that Google Play is available
          AppRate.showRateDialogIfMeetsConditions(this); // Shows the Rate Dialog when conditions are met
      }
  } else {
      AppRate.showRateDialogIfMeetsConditions(this);     // Shows the Rate Dialog when conditions are met
  }
}

Default options of the Rate Dialog are as below:

  1. Google Play launches when you press the positive button. Change via AppRate#setStoreType(int), AppRate#setStoreType(int, long), AppRate#setStoreType(String...) or AppRate#setStoreType(Intent...).
  2. App is launched 10 or more days later than installation. Change via AppRate#setTimeToWait(long, short) or AppRate#setInstallDays(byte).
  3. App is launched 10 or more times. Change via AppRate#setLaunchTimes(byte).
  4. App is launched 1 or more days after neutral button clicked. Change via AppRate#setRemindTimeToWait(long, short) or AppRate#setRemindInterval(byte).
  5. App is launched 0 or more times after neutral button clicked. Change via AppRate#setRemindLaunchesNumber(byte).
  6. Each launch (the condition is satisfied if appLaunches % param == 0). Change via AppRate#setSelectedAppLaunches(byte).
  7. App shows the Neutral button ("Remind me later"). Change via setShowLaterButton(boolean).
  8. Unlimited occurrences of the display of the Rate Dialog within a 365-day period. Change via AppRate#set365DayPeriodMaxNumberDialogLaunchTimes(short).
  9. Don't re-enable the Rate Dialog if a new version of app with different version code is installed. Change via AppRate#setVersionCodeCheck(boolean).
  10. Don't re-enable the Rate Dialog if a new version of app with different version name is installed. Change via AppRate#setVersionNameCheck(boolean).
  11. Setting AppRate#setDebug(boolean) to true ensures that the Rate Dialog will be shown each time the app is launched. This feature is for development only!.
  12. There is no default callback when the button of Rate Dialog is pressed. Change via AppRate.with(this).setOnClickButtonListener(OnClickButtonListener).

OnClickButtonListener interface

You can implement OnClickButtonListener Interface and use AppRate.with(this).setOnClickButtonListener(OnClickButtonListener) to specify the callback when the button of Rate Dialog is pressed. DialogInterface.BUTTON_POSITIVE, DialogInterface.BUTTON_NEUTRAL or DialogInterface.BUTTON_NEGATIVE will be passed in the argument of OnClickButtonListener#onClickButton.

// Java 7- start
AppRate.with(this).setOnClickButtonListener(new OnClickButtonListener() {
    @Override
    public void onClickButton(final byte which) {
        // Do something
    }
})
// Java 7- end
// Java 8+ start
AppRate.with(this).setOnClickButtonListener(which -> {
    // Do something
})
// Java 8+ end

Optional custom event requirements

You can add additional optional requirements for showing dialog. Each requirement can be added/referenced as a unique string. You can set a minimum count for each such event (for e.g. "action_performed" 3 times, "button_clicked" 5 times, etc.)

AppRate.with(this).setMinimumEventCount(String, short);
AppRate.with(this).incrementEventCount(String);
AppRate.with(this).setEventCountValue(String, short);

Clear show dialog flag

When you want to show the dialog again, call AppRate#clearAgreeShowDialog().

AppRate.with(this).clearAgreeShowDialog();

Forced display of the Rate Dialog

Use this method directly if you want to force display of the Rate Dialog. Call it when some button presses on. Method also useful for testing purposes. Call AppRate#showRateDialog(Activity).

AppRate.with(this).showRateDialog(this);

Forced dismiss of the Rate Dialog

Use this method directly if you want to remove the Rate Dialog from the screen. Call AppRate#dismissRateDialog().

AppRate.with(this).dismissRateDialog();

Set custom view

Call AppRate#setView(View).

LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.custom_dialog, (ViewGroup) findViewById(R.id.layout_root));
AppRate.with(this).setView(view);

Specific theme

You can use a specific theme to inflate the dialog.

AppRate.with(this).setThemeResId(int);

Custom dialog labels

If you want to use your own dialog labels, override string xml resources on your application.

<resources>
    <string name="rate_dialog_title">Rate this app</string>
    <string name="rate_dialog_message">If you enjoy playing this app, would you mind taking a moment to rate it? It won\'t take more than a minute. Thanks for your support!</string>
    <string name="rate_dialog_ok">Rate It Now</string>
    <string name="rate_dialog_cancel">Remind Me Later</string>
    <string name="rate_dialog_no">No, Thanks</string>
</resources>

Appstores

You can use different app stores.

Google Play, Amazon Appstore, Cafe Bazaar, Mi Appstore (Xiaomi Market), Samsung Galaxy Apps, SlideME Marketplace, Tencent App Store, Yandex.Store

AppRate.with(this).setStoreType(StoreType.GOOGLEPLAY); // Google Play
AppRate.with(this).setStoreType(StoreType.AMAZON);     // Amazon Appstore
AppRate.with(this).setStoreType(StoreType.BAZAAR);     // Cafe Bazaar
AppRate.with(this).setStoreType(StoreType.MI);         // Mi Appstore (Xiaomi Market)
AppRate.with(this).setStoreType(StoreType.SAMSUNG);    // Samsung Galaxy Apps
AppRate.with(this).setStoreType(StoreType.SLIDEME);    // SlideME Marketplace
AppRate.with(this).setStoreType(StoreType.TENCENT);    // Tencent App Store
AppRate.with(this).setStoreType(StoreType.YANDEX);     // Yandex.Store

Apple App Store

/* Apple App Store, long - your Apple App Store application ID
 * e. g. 284882215 for Facebook (https://itunes.apple.com/app/id284882215) */
AppRate.with(this).setStoreType(StoreType.APPLE, long);

BlackBerry World

/* BlackBerry World, long - your BlackBerry World application ID
 * e. g. 50777 for Facebook (https://appworld.blackberry.com/webstore/content/50777) */
AppRate.with(this).setStoreType(StoreType.BLACKBERRY, long);

Chinese app stores

The first Chinese app store found on the user device will be used, if first fails, second will be used, etc. The Library doesn't check the availability of your application on the app store.

/* 19 chinese app stores: 腾讯应用宝, 360手机助手, 小米应用商店, 华为应用商店, 百度手机助手,
 * OPPO应用商店, 中兴应用商店, VIVO应用商店, 豌豆荚, PP手机助手, 安智应用商店, 91手机助手,
 * 应用汇, QQ手机管家, 机锋应用市场, GO市场, 宇龙Coolpad应用商店, 联想应用商店, cool市场 */
AppRate.with(this).setStoreType(StoreType.CHINESESTORES);

Other store

/* Any other store/stores,
 * String... - an RFC 2396-compliant URI or array of URIs to your app,
 * e. g. "https://otherstore.com/app?id=com.yourapp"
 * or "otherstore://apps/com.yourapp" */
AppRate.with(this).setStoreType(String...);

Custom intents

You can set custom action to the Positive button. For example, you want to open your custom RateActivity when the Rate button clicked.

/* Any custom intent/intents, Intent... - an intent or array of intents,
 * first will be executed (startActivity(intents[0])), if first fails,
 * second will be executed (startActivity(intents[1])), etc. */
AppRate.with(this).setStoreType(Intent...);

Check for Google Play

The following code checks that Google Play is available on the user's device. We recommend to use it if current app store type from library options is StoreType.GOOGLEPLAY.

if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) != ConnectionResult.SERVICE_MISSING) {
    // ...
}

Sample

Clone this repo and check out the sample module.

Javadoc Documentation

See generated javadoc AndroidRate documentation.

Supported Languages

AndroidRate library currently supports the following 41 languages:

  • Albanian
  • Arabic
  • Azerbaijani
  • Basque
  • Benqali
  • Bulgarian
  • Catalan
  • Chinese (zh-CN, zh-TW)
  • Croatian
  • Czech
  • Danish
  • Dutch
  • English
  • Finnish
  • French
  • German
  • Greek
  • Hebrew
  • Hindi
  • Hungarian
  • Indonesian
  • Italy
  • Japanese
  • Korean
  • Malay
  • Norwegian
  • Persian
  • Polish
  • Portuguese
  • Romanian
  • Russian
  • Serbian
  • Slovak
  • Slovenian
  • Spanish
  • Swedish
  • Thai
  • Turkish
  • Ukrainian
  • Vietnamese

Already in Use

AndroidRate library already in use in following apps:

Contribute

  1. Fork it.
  2. Create your feature branch (git checkout -b my-new-feature).
  3. Commit your changes (git commit -am 'Added some feature').
  4. Push to the branch (git push origin my-new-feature).
  5. Create new Pull Request.

License

The MIT License (MIT)

Copyright (c) 2017 - 2018 Vorlonsoft LLC

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
  • dialog error

    dialog error

    dialog error when app just back to home, when i open app again dialog error "window manager bad token". use AppRate.with(this).clearAgreeShowDialog() but nothing change. oh ya apprate.debug(true). sorry my english very bad. but android rate libarary is awesome

    bug 
    opened by kasmadi17 6
  • Logo for AndroidRate

    Logo for AndroidRate

    Hello, Good Day, i make a logo icon for your project.Because there is no logo in your project. If you want to use this icon in your project, then comment below, I will give you the source file. And if you want a change, then tell me I will change.

    androidrate-01

    enhancement 
    opened by hafizahmmed 3
  • Set OnClickListner To Nigative Button

    Set OnClickListner To Nigative Button

    i add this to onBackPressed when i click back button rating dialog launch all good but i want if you click on "No Thanks" Button dismiss dialog and exit from App

    question 
    opened by simoclick 2
  • New logo/icon proposal

    New logo/icon proposal

    Good day sir. I am a graphic designer and i am interested in designing a logo for your good project. I will be doing it as a gift for free. I just need your permission first before I begin my design. Hoping for your positive feedback. Thanks

    opened by mansya 1
  • Singleton DialogManager break the library

    Singleton DialogManager break the library

    When we want to show the rate dialog in multiple Activity or in the same activity, if the first activity that call AppRate.showRateDialogIfMeetsConditions(this); is destroyed. The next call will fail with:

    java.lang.RuntimeException: Unable to resume activity {xxx/xxx.HomeActivity}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@b857bc1 is not valid; is your activity running?
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3454)
            at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3494)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2757)
            at android.app.ActivityThread.-wrap12(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:154)
            at android.app.ActivityThread.main(ActivityThread.java:6186)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
         Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@b857bc1 is not valid; is your activity running?
            at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
            at android.app.Dialog.show(Dialog.java:329)
            at com.vorlonsoft.android.rate.AppRate.showRateDialog(AppRate.java:413)
            at com.vorlonsoft.android.rate.AppRate.showRateDialogIfMeetsConditions(AppRate.java:114)
            at xxx.activity.HomeActivity.onResume(HomeActivity.java:411)
            at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1270)
            at android.app.Activity.performResume(Activity.java:6788)
            at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3431)
    

    The DialogManager Singleton hold the first activity as context and reuse it even it was destroyed.
    If you want to keep the singleton, I think the createDialogManager function must check if the singleton context is not destroyed before reuse it.

    This issue is linked to #5. ps: I have tested with the version 1.1.9 and with the latest commit into the master branch. Thanks,

    bug 
    opened by devnied 1
  • NumberFormatException occuring on startup

    NumberFormatException occuring on startup

    It seems like recently we've been getting NumberFormatException errors when starting the app and initializing AndroidRate. I'll need to do further investigation but here's an (obfuscated) stack trace in case someone else bumps into this:

    java.lang.RuntimeException: 
      at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3840)
      at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:4016)
      at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:85)
      at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:135)
      at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:95)
      at android.app.ActivityThread$H.handleMessage (ActivityThread.java:2325)
      at android.os.Handler.dispatchMessage (Handler.java:106)
      at android.os.Looper.loop (Looper.java:247)
      at android.app.ActivityThread.main (ActivityThread.java:8656)
      at java.lang.reflect.Method.invoke (Native Method)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:602)
      at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1130)
    Caused by: java.lang.NumberFormatException: 
      at java.lang.Integer.parseInt (Integer.java:615)
      at java.lang.Short.parseShort (Short.java:118)
      at java.lang.Short.valueOf (Short.java:174)
      at java.lang.Short.valueOf (Short.java:200)
      at com.vorlonsoft.android.rate.h.b (SourceFile:12)
      at com.vorlonsoft.android.rate.a.e (SourceFile:1)
      at com.vorlonsoft.android.rate.a.T (SourceFile:7)
      at com.vorlonsoft.android.rate.a.V (SourceFile:1)
      at com.xxx.xxx.xxx.XXActivity.onCreate (SourceFile:17)
      at android.app.Activity.performCreate (Activity.java:8215)
      at android.app.Activity.performCreate (Activity.java:8199)
      at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1309)
      at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3813)
    

    Clearing the app data appears to fix it - I assume some dodgy value is being stored by AppRate and re-parsing it causes a crash.

    opened by T-Spoon 0
  • Invalid language code for Greek

    Invalid language code for Greek

    The language code for Greek should be el, not gr per the IANA registry. This incorrect language code seems to be causing apps containing this library to fail when uploaded to Google Play.

    opened by rmtheis 0
  • Add option to re-prompt at intervals after user accept/ignore

    Add option to re-prompt at intervals after user accept/ignore

    Allow the prompt to be shown again at intervals after each user action (accept/ignore).

    Track the time each time the AgreeShowDialog preference is set to false. When checking if this value is false, or it with the result of isOverLastAgreeShowFalseDate() to determine if it has been X time units since AgreeShowDialog was set to false, a result of true will continue with the rest of the evaluation.

    Defaults to off. Setting a time unit will turn the check on. Date of AgreeShowDialog = false is always tracked

    opened by sampengilly 1
  • Huawei AppGallery URI

    Huawei AppGallery URI

    To open app's page in Huawei AppGallery the following URI should be used: appmarket://details?id=...

    Currently Huawei is part of CHINESE_STORES_PACKAGES_NAMES all using DEFAULT_STORE_URI: market://details?id=...

    https://github.com/Vorlonsoft/AndroidRate/blob/master/library/src/main/java/com/vorlonsoft/android/rate/IntentHelper.java#L78 https://github.com/Vorlonsoft/AndroidRate/blob/master/library/src/main/java/com/vorlonsoft/android/rate/UriHelper.kt#L49

    opened by ivfit 0
Releases(1.2.1.Osaka)
Owner
Vorlonsoft LLC
Software development and IT consulting
 Vorlonsoft LLC
RatingRequest library is a simple android dialog for request rating and review.

Rating Request RatingRequest library is a simple android dialog for request rating and review. ##Usage Add below line in app build.gradle dependencies

Habibur Rahman 28 Aug 10, 2022
A simple Emoji Rating Bar library for Android completely written in Kotlin.

EmojiRatingBar A simple Emoji Rating Bar library for Android completely written in Kotlin. ?? Installation Add the JitPack repository to your build.gr

Unaisul Hadi 41 Aug 26, 2022
A rating scale android library

RatingScale A rating scale android library A customizable rating scale supporting a 1-10 scale. Usage In your layout.xml <?xml version="1.0" encod

Tilak Sharma 3 Mar 26, 2022
This library allows to use customized Rating Dialog inside applications.

Android Material App Rating This library allows to use customized Rating Dialog inside applications. Download compile 'com.stepstone.apprating:app-rat

StepStone Tech 476 Nov 11, 2022
A rating toggle for Android which switches between 3 rating levels: positive, neutral, and negative.

SimpleRatingView A rating toggle for Android which switches between 3 rating levels: positive, neutral, and negative. Usage Since, SimpleRatingView is

İhsan Işık 166 Nov 25, 2022
To help to promote your android app by prompting users to rate your app in a bottom Sheet.

RateBottomSheet This an Android library to help to promote your Android App by prompting users to rate your app in the Google Play Store with a materi

Farham Hosseini 5 Jul 8, 2022
Android app that helps you keep track of the medical supplements you need to take and how you spend your days

Android app that helps you keep track of the medical supplements you need to take and how you spend your days, similar to a bullet journal. It also allows you to reflect on your day, week, year, etc.

Rachelle Hu 4 Nov 10, 2022
Webclient-kotlin-sample - An example of using the http web client to promote synchronous and asynchronous https calls

Web Client Consumer Kotlin Sample The project is an example of using the http we

null 1 May 1, 2022
Android library that allows you to determine your location in a few of lines

locsimple Android library that allows you to determine your location in some lines! Benefits: automatic processing of permissions processing of enabli

Dmitry 7 Aug 31, 2022
AppUI Sample Application - display how you can create your own custom AppUI application within a few minutes

AppUI Sample Application This is an open-source project to display how you can create your own custom AppUI application within a few minutes. I have a

Formaloo 5 Sep 5, 2022
A nice weather that helps you get all information including: current weather, hourly weather and also forecasts for 16 days

WeatherForecast This is an ongoing project where I fetch all the weather data using Retrofit and Kotlin Coroutines over two APIs containing both curre

null 2 Jul 26, 2022
The library that removes all boilerplate code allowing you to display lists with few lines of code.

VsRecyclerView The library that removes all boilerplate code allowing you to display lists with few lines of code. Gradle androidExtensions { expe

Valeriy Shtaits 13 Jun 19, 2021
A simple app to test your device input sample rate.

Android touch sample rate test tool This tool can help you check the touch sample rate of the Android device. Supported input method: Touch Mouse Styl

samnyan 4 Sep 28, 2022
Brazilian Holidays: a Kotlin/Java library that provides resources to consult Brazilian holidays and business days

Leia esta documentação em Português. Brazilian Holidays Brazilian Holidays is a

Quantis 2 Oct 3, 2022
Dots indicator that shows the current position on a View Pager. It does all the work for you with a few customisations.

Dots What is Dots? Dots is a library that helps in implementing a simple yet effective dots indicator for the View Pagers used in your android code. I

Deepan 23 Feb 16, 2022
You can create awesome menus with bottom sheet experience in a few lines

You can create awesome menus with bottom sheet experience in a few lines

Mazen Rashed 19 Nov 1, 2022