[{Ep. 1} Include 50 more] Libraries All Awesome Android Developer Libraries in GitHub V.1

Ponglang Petrung
36 min readJan 24, 2020

cr : Build a better website! Responsive WordPress themes for every site style!

Visualmodo builds amazing drag & drop page builder smart WordPress themes for any site purpose https://visualmodo.com/ e-commerce, portfolio, landing-page, creative, health, restaurant, agency, blogs and much more site solutions! #responsive #template #plugins #themes #WordPress #onepage #ecommerce #marketing #wedding #website #gym #fitness #health #blog #store #shop Create your own website with Visualmodo!

Happy New Years 2020

Hi Everyone, Hello everyone. To read Or never read This is also the time of the entry of the blog. Has come to write again, has collected Libraries again, which would like to say that throughout the library has been collected for 2–3 years since the first article “Android Droidcon Developer Library GitHub update 14/02/60 Update Library Together on Valentine’s Day “The love story of Andrew.” At that time, it was said that the era in which Boom had a lot to write at that time. Because of the change from Java language to Kotlin because at that time the developers had to adapt in time With a world that must change Speaking when he first entered this industry, hehe

Come to know for a while It has changed to make the mobile industry accept that there are many changes. Because starting from the era of using android to write java, because from what I have observed, there is a beautiful Custom view to hope for User to download our App which admits that it is very difficult to use without having to config and must provide support versions of all Android versions. From the issue of Fragment, each version of android is a bug that doesn’t have an Android Jetpack. Anyone who wants to know that Android Jetpack can read this article. Can this

But now, in the kotlin collection functions, you can use without worrying.

[UPDATE] 100 Open-source Android apps written in Kotlin. Organized by Tech Stack and Architecture/Patterns.

Or can take what I have summarized Will be used examples and how to use Shortcut image style That subjects that use java straight

Kotlin’s collection How to use memo

Top 10 Trending Android and iOS Libraries in September

Here’s my first edition of trending Android and iOS (5+5) libraries on GitHub during the month of September 2019.

32 Tips For Every Web Developer In 2020

10 Awesome JavaScript Libraries for Front-End Developers in 2020

Mobile App UI Library

51. fancyDialog

52.ColorPickerView

ชีวิตของคนเราจะต้องไปต่อ หากมีลมหายใจ ก็ควรมันหาอะไร ทำไร ก้ควรทำก่อนที่สายก่อนแก้ เพราะมันไม่สามารถย้อนกลับมาไม่ได้

โปรดติดตามตอนที่ 2

[Include Libraries All for 2019 -2020 First] Awesome Android Libraries — 2019 of Years Android Developer Library GitHub V.2

1.GoldMovies

The GoldMovies is based on Kotlin, MVVM architecture, coroutines, dagger, koin, and material designs & animations.

Module structure

The module structure is designed to try several different architectures.

Entity module : composed of entity models for persisting in database and response models for fetching data from network requests.

Network module :composed of abstractions for RESTful requests. And ApiResponseModel for standardizing a raw request model. An Interceptor for requesting every time with a query parameter api_key

Unit Tests to verify RESTful requests abstractions via a testing web server and mocked data.

Common-ui module composed of adapters and viewholders for composing recyclerview’s item via databinding. And some factories and extensions related to custom views.

Mvvm module is the implementation of user interfaces on the application. Based on mvvm architecture (view-databinding-viewmodel-model) with the repository pattern.

2.TabScrollAttacher

Attach TabLayout and RecyclerView. Useful for categorizing RecyclerView items.

What? 🤔

It is not a custom TabLayout or RecyclerView. It is just a helper library to attach to your RecyclerView with your TabLayout. If you don't want to go with sticky header RecyclerView or something like that, and also want to provide a good experience when your user is scrolling the content, this small library is for you.

How? 🤨

You fetch your product list and their categories. All you need to do is calcualate start index for all categories. Attacher will do the rest.

If your backend guy returns this json,

CategoryA -> 10 items (between 0..10)
CategoryB -> 20 items (between 10..30)
CategoryC -> 30 items (between 30..60)

Then your offset list will be,

//3 tabs and their offset indexes in total list.
val categoryIndexOffsetList = [0,10,30]

Then? 🙄

Then you attach.

TabScrollAttacher(tabLayout, recyclerView, categoryIndexOffsetList)

3.MapDrawingManager

MDM is a library with the help of we can draw many different shapes like polygon, polyline and many more on the google map with editable mode.

Key Features:

  • Draw any shape by touch on map
  • Resize any shape by drag
  • Remove any individual or all shapes from map
  • Auto calculate the size of shapes drawn on map
  • Customize shapes properties like color, stroke etc
  • Easy callbacks for shapes draw, update and remove

Usage

// Simple Initialization
supportMapFragment.getMapAsync { googleMap ->
val mapDrawingManager = MDMBuilder(baseContext).withMap(googleMap).build()
mapDrawingManager?.removeListener = this //OnShapeRemoveListener
mapDrawingManager?.drawListener = this //OnShapeDrawListener
mapDrawingManager?.shapeType = ShapeType.POLYGON
}

4.FabFilter

Android app to showcase complex animations

Notes

  • Read my article on Medium that breaks down these animations
  • Download the APK or build code to view the app!
  • UI was designed by Yaroslav Zubko. You can find it here.
  • You can control the animation speed by opening the nav drawer and adjusting it.

5.DropDownTipsList

Android Drop Down Tips List: A library for showing app tips on Android

A simple library for showing app tips on Android.

Tips can be set to be shown after a specific amount of time. They can also have an action button that will execute a provided Runnable and dismiss the tip when pressed.

Used in this app (also shown in “In-app example” gif below)

Kotlin

The title, description, action button text and action runnable can be set when creating an Item.

setAppearAfter() must also be called with:

  • an initial time (Long) to start “counting down” from (e.g. app install time)
  • a time in hours until the tip item is shown,
  • a preference key which is used to store if an item has been dismissed (so it doesn’t show again)

How to Use :

val dropDownList: DropDownList = findViewById(R.id.drop_down_list)
dropDownList.preferences = preferences
val dropDownListItems = LinkedList<DropDownList.Item>()
var item: DropDownList.Item
item = DropDownList.Item(
title = "Enter a title",
description = "Enter a description",
actionText = getString(android.R.string.ok),
action = Runnable {
// ...
}
)
item.setAppearAfter(appInstallTime, 0, "drop_list_example1")
dropDownListItems.add(item)
item = DropDownList.Item(
title = "Example Item 2",
description = "Example Description 2",
actionText = "Action 2",
action = Runnable {
// ...
}
)
item.setAppearAfter(appInstallTime, 0, "drop_list_example2")
dropDownListItems.add(item)
item = DropDownList.Item(
title = "Tip with no action",
description = "Tip description"
)
item.setAppearAfter(appInstallTime, 12, "drop_list_example2")
dropDownListItems.add(item)
dropDownList.addAll(dropDownListItems)

6.ImagePickerView

Usage

Add ImagePickerView your Activity or Fragments Example.

ImagePickerView.Builder()
.setup {
config {
name { RESULT_NAME }
max { 5 }
}
}
.start(this) // if used fragment, .start(requireContext())

Finish image select task, update ui for onActivityResult received data

For Example

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
val images = data?.getParcelableArrayListExtra<Uri>(RESULT_NAME)
images?.let {
(recycler_view.adapter as ImageAdapter).submitList(it)
}
}
}

7.full-screen-image-view

This is a library to help developer faster on view an image full screen which has some gesture like double tap to zoom, span, zoom in/out, move.

Setup

  1. Add to build.gradle in app level
implementation 'com.github.tntkhang:full-screen-image-view-library:1.1.0'
  1. Call open a FullScreenImageViewActivity and sent some appropriate data.
Intent fullImageIntent = new Intent(MainActivity.this, FullScreenImageViewActivity.class);
// uriString is an ArrayList<String> of URI of all images
fullImageIntent.putExtra(FullScreenImageViewActivity.URI_LIST_DATA, uriString);
// pos is the position of image will be showned when open
fullImageIntent.putExtra(FullScreenImageViewActivity.IMAGE_FULL_SCREEN_CURRENT_POS, pos);
startActivity(fullImageIntent);

https://github.com/tntkhang/full-screen-image-view

8.ExpandableBottomBar

A new way to improve navigation in your app

Its really easy integrate to your project

Usage

Really simple as I wrote earlier

Firstly, you should declare your view in xml file

<github.com.st235.lib_expandablebottombar.ExpandableBottomBar
android:id="@+id/expandable_bottom_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="20dp"
app:exb_backgroundCornerRadius="25dp"
app:exb_backgroundColor="#2e2e2e"
app:exb_itemInactiveBackgroundColor="#fff"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

Then you should add menu items to your navigation component

val bottomBar: ExpandableBottomBar = findViewById(R.id.expandable_bottom_bar)bottomBar.addItems(
ExpandableBottomBarMenuItem.Builder(context = this)
.addItem(R.id.icon_home, R.drawable.ic_bug, R.string.text, Color.GRAY)
.addItem(R.id.icon_go, R.drawable.ic_gift, R.string.text2, 0xFFFF77A9)
.addItem(R.id.icon_left, R.drawable.ic_one, R.string.text3, 0xFF58A5F0)
.addItem(R.id.icon_right, R.drawable.ic_two, R.string.text4, 0xFFBE9C91)
.build()
)
bottomBar.onItemSelectedListener = { view, menuItem ->
/**
* handle menu item clicks here,
* but clicks on already selected item will not affect this callback
*/
}

bottomBar.onItemReselectedListener = { view, menuItem ->
/**
* handle here all the click in already selected items
*/
}

9.RotateLabelView

This is library to help you to add a sticky rotation label into your view.

xample Usage

<com.qifan.library.RotateLabelView
android:id="@+id/rotate_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
app:background_color="@color/colorAccent"
app:label="Android"
app:layout_constraintEnd_toEndOf="@id/image"
app:layout_constraintTop_toTopOf="@id/image"
app:text_color="@android:color/white"
app:text_size="15sp" />

10.AppHead

Head View like Facebook Messenger for Android.

Components

AppHead has 3 main components

  • HeadView: the draggable & dismissable view.
  • DimissView: the view at the bottom that acts as bounds within which the HeadView can be dimissed.
  • BadgeView(optinal): displays the number of notifications.

Usage

The most simple usage

AppHead.create(R.drawable.ic_messenger) {
headView { onClick {..} }
}.show(activity)

Or using builders (proper for Java)

builder = Head.Builder(R.drawable.icon).headView(HeadView.Args().onClick {..})
AppHead(builder).show(activity)

All available options

AppHead.create(R.drawable.ic_messenger_red) {
headView {
layoutRes(R.layout.app_head_red, R.id.headImageView)
onClick {..}
onLongClick {..}
alpha(0.9f)
allowBounce(false)
onFinishInflate {..}
setupImage {..}
onDismiss {..}
dismissOnClick(false)
preserveScreenLocation(false)
}
badgeView {
count("100")
position(BadgeView.Position.TOP_END)
}
dismissView {
alpha(0.5f)
scaleRatio(1.0)
drawableRes(R.drawable.ic_dismiss)
onFinishInflate {..}
setupImage {..}
}
}.show(this)

Customize Components Layouts

In addition to configuring all options of the components, you also can define full custom components layouts. To customize HeadView, DimissView or BadgeView you must define the rootview as HeadView, DimissView or BadgeView

11. AppLocker

I decided to open source my side project SecureBox. I’m sure most of us are suffering in some android’s APIs. This application already has some user on Play Store market. So this open source project provides you the working solution about specific API’s. Below, you will find a list of technical things to learn from this project. You can download app from Play Store

App Features

  • App locker
  • Fingerprint Validation
  • Vault Image/Video file (File Encryption/Decryption)
  • Block call (Blacklist)
  • Private Browser
  • Take intruders photo secretly (Camera 1 API)

What can I learn

  • RxJava 2
  • Dagger 2
  • Room Database
  • ViewModel & LiveData
  • Work Manager
  • FingerPrint API
  • App Usage Stat Manager (Is any app comes to foreground/background)
  • Background & Foreground Services (covers all android versions)
  • MVVM pattern using ViewState
  • DataBinding; Binding Adapter, Binding Conversion and more.
  • Kotlin Delegates
  • File Cryptography in Android
  • Call Screening Service (For creating custom dialer app)
  • Custom Browser
  • Camera 1 API to take photo without preview.
  • Overlay Activity from background Service
  • more..

12.locale-helper-android

Change Language Programmatically in Android : http://gunhansancar.com/change-langua…

This is a helper library to change the language programmatically in Android.

Android by default uses the locale of the device to select the appropriate language dependent resources. And most of the time this behaviour is enough for common applications.

However, there are cases where you would want to change the language of your app and the UI of the app. As a result, LocaleHelper has emerged.

Features

  1. Changes language on-the-fly
  2. Persists the changes in Preferences automatically
  3. Detects changes when activity loads from backstack
  4. Detects Right-To-Left (RTL) languages and updates layout direction
  5. Small footprint (~3KB, ~50 methods), easy to use

13. BannerViewPager

Tencent Video,QQ Music,KuGou,AliPay,Tmall,TaoBao,YouKu,Himalaya,NetEase Music,Bilibili ect. All of above App’s Banner can be implements By BannerViewPager.

14.MaterialDialog-Android

📱Introduction

MaterialDialog library is built upon Google’s Material Design library. This API will be useful to create rich, animated, beautiful dialogs in Android app easily. This library implements Airbnb’s Lottie library to render After Effects animation in app. Refer this for Lottie documentation.

Types of Dialog

MaterialDialog library provides two types of dialog i.e.

1. Material Dialog2. Bottom Sheet Material DialogThis is basic material dialog which has two material buttons (Same as Android’s AlertDialog) as you can see below.This is Bottom Sheet material dialog which has two material buttons which is showed from bottom of device as you can see below.

Bottom Sheet Material Dialog

BottomSheetMaterialDialog class is used to create Bottom Sheet Material Dialog. Its static Builder class is used to instantiate it. After building, to show the dialog, show() method of BottomSheetMaterialDialog is used.

BottomSheetMaterialDialog mBottomSheetDialog = new BottomSheetMaterialDialog.Builder(this)
.setTitle("Delete?")
.setMessage("Are you sure want to delete this file?")
.setCancelable(false)
.setPositiveButton("Delete", R.drawable.ic_delete, new BottomSheetMaterialDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
Toast.makeText(getApplicationContext(), "Deleted!", Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
})
.setNegativeButton("Cancel", R.drawable.ic_close, new BottomSheetMaterialDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
Toast.makeText(getApplicationContext(), "Cancelled!", Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
})
.build();
// Show Dialog
mBottomSheetDialog.show();

15.HR-Vertical-Calender

HR Vertical calendar

The HR Vertical calendar for Android.

Demo

This awesome calendar is designed to meet more complex business requirements for Android development. And it’s easy to make a custom perfect ui. This calender is more flexible to adapt different ui and the complicated logic.

Vertical Calendar

The vertical calendar is build with ListView whose child item is CalendarCard with some information text. What you need to do is to setAdapter for the ListView.

Custom the UI

If you have a better design for the calender, you’ll find it’s easy to change to another style. It’s more convenient than System Calendar ui kit.

16.crypto-tracker

About

Demo application with statistics of some cryptocurrencies.

API

Provided by CoinMarketCap.

API key

In CurrencyService class replace API_KEY in each header.

Resources

Original icons provided by cryptocurrency-icons.

17.AndroidColorX

AndroidColorX (i.e: Android Color Extensions) is an Android library written in Kotlin that provides color utilities as Kotlin extension functions. The library relies on AndroidX ColorUtils for some of its calculations.

To convert a color type to any of the other types, you can use the extensions provided for it.

val color = Color.parseColor("#e91e63")val rgb = color.asRgb()
val argb = color.asArgb()
val hex = color.asHex()
val hsl = color.asHsl()
val hsla = color.asHsla()
val hsv = color.asHsv()
val cmyk = color.asCmyk()
val colorHsl = HSLColor(hue = 210f, saturation = 0.5f, lightness = 0.5f)val colorInt = colorHsl.asColorInt()
val rgb = colorHsl.asRgb()
val argb = colorHsl.asArgb()
val hex = colorHsl.asHex()
val cmyk = colorHsl.asCmyk()
val hsla = colorHsl.asHsla()
val hsv = colorHsl.asHsv()

The same extensions are available for all the mentioned color types. Note that when converting from a color with an alpha component (i.e: ARGB or HSLA) to one without it (i.e: RGB or HSL) it will be a lossy conversion. If it's the other way around, conversions will assume full alpha (255 or 1f).

Also note that conversions from colors that store their components as Float (i.e: cmyk, hsl, hsla) to colors that store them as Int (i.e: RGBColor, ColorInt) and back will imply precision loss.

18.EasyReveal

EasyReveal is an extensible reveal library that contains various reveal animations. (Demo apk)

Getting started

Creating custom reveals

One of the core focuses of this library was extensibility. Creating your own reveal animation is as simple as extending ClipPathProvider and implementing the getPath() method. getPath() provides the Path for a given percent value on the provided view. The path gotten from getPath() is then used to clip the view using canvas.clipPath(path, op) (The op value is provided by the ClipPathProvider as well).

API Documentation

Documentation generated using Dokka : chrisvin.github.io/EasyReveal

The End?

No, infact, EasyReveal was a library that I created since I needed (but was unable to find) an extensible library for view clipping. Hence, the true form of EasyReveal is infact a view clipping library, who’s most obvious usecase is designing customizable reveal animations.

The first version of LiquidSwipe used EasyReveal as a dependency. If you like this library, you will probably love LiquidSwipe.

19.android-remote-temperature-control-client

Android Remote Temperature Control Client

About

Remote client for Arduino temperature project. Main functionality working and tested on real system (see more here).

Before start

  1. install and run Arduino module;
  2. pair your Android device and Arduino Bluetooth module;
  3. install and run Android application and select Arduino Bluetooth module from devices list.

20.Flourish

🎩 A polished and dynamic way to show up layouts.

Usage

Basic Example

Here is a basic example of implementing Flourish using Flourish.Builder class.

Flourish flourish = new Flourish.Builder(parentLayout)
// sets the flourish layout for showing and dismissing on the parent layout.
.setFlourishLayout(R.layout.layout_flourish_main)
// sets the flourishing animation for showing and dismissing.
.setFlourishAnimation(FlourishAnimation.BOUNCE)
// sets the orientation of the starting point.
.setFlourishOrientation(FlourishOrientation.TOP_LEFT)
// sets a flourishListener for listening changes.
.setFlourishListener(flourishListener)
// sets the flourish layout should be showed on start.
.setIsShowedOnStart(false)
// sets the duration of the flourishing.
.setDuration(800L)
.build();

Create using kotlin dsl

This is how to create an instance of Flourish using kotlin dsl.

val myFlourish = createFlourish(parentLayout) {
setFlourishLayout(R.layout.layout_flourish_main)
setFlourishAnimation(FlourishAnimation.ACCELERATE)
setFlourishOrientation(FlourishOrientation.TOP_RIGHT)
setIsShowedOnStart(true)
setFlourishListener { }
}

21.EasyWayLocation

This library contain all utils related to google location. like, getting lat or long, Address and Location Setting dialog, many more…

What’s New in Ver 2.0

  • Route Draw a. simple. b. animation.
  • Make sure performance is good by using kotlin coroutine.
  • Draw route between origin and destination through waypoints.
  • The callback of the complete route draws with time and distance between waypoints and destinations.

22.noticeboard

NoticeBoard is a changelog library for Android API 21+. It helps developers display the history of changes in their applications.

It shows a list of Release or UnRelease which contains a list of Change.

It receives a source of changes and config.

You can find a sample code of NoticeBoard in this repository.

NoticeBoardSample app is now available on Google Play.

Usage

The pin function is used to show a change log list. It receives a lambda to make clients config their noticeboards.

Default configs are the following:
TITLE: NoticeBoard
DISPLAY_IN: Activity
SOURCE_TYPE: Dynamic with empty list

NoticeBoard(this).pin {
// configs
title(...)
displayIn(...)
colorProvider(...)
source(...)
}

23.PreviewImageCollection

A library to make a mosaic with a preview of multiple images

Usage

Sample of usage

<pereira.agnaldo.previewimgcol.ImageCollectionView
android:id="@+id/imageCollectionView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
app:backgroundColor="@color/colorAccent"
app:baseRowHeight="150dp"
app:imageMargin="1dp"
app:pinchToZoom="true"
app:showExternalBorderMargins="true"
app:maxImagePerRow="3"
app:maxRows="2" />

Programmatically

var collectionView = findViewById(R.id.imageCollectionView)

collectionView.maxRows = ImageCollectionView.NO_ROW_LIMITS
collectionView.maxRows = 10

collectionView.maxImagePerRow =3

collectionView.imageMargin = 10

collectionView.baseImageHeight = 150

collectionView.mBackgroundColor = Color.WHITE

collectionView.pinchToZoom = true

ollectionView.showExternalBorderMargins = true

val bitmap = ...
collectionView.addImage(bitmap)

val bitmap2 = ...
collectionView.addImage(bitmap2, object : ImageCollectionView.OnImageClickListener {
override fun onClick(bitmap: Bitmap, imageView: ImageView) {
Toast.makeText(imageView.context, "Test Click on image ...", Toast.LENGTH_LONG).show()
}
})

collectionView.setOnMoreClicked(object : ImageCollectionView.OnMoreClickListener {
override fun onMoreClicked(bitmaps: List<Bitmap>) {
Toast.makeText(collectionView.context, "on mode clicked ", Toast.LENGTH_LONG)
.show()
}
})
ImageCollectionView collectionView = (ImageCollectionView) findViewById(R.id.imageCollectionView);Bitmap bitmap = ...;
imageCollectionView.addImage(bitmap);

Bitmap bitmap2 = ...;
imageCollectionView.addImage(bitmap, (bmp, imageView) -> {
Toast.makeText(context, "Test Click image 08", Toast.LENGTH_LONG).show();
});

imageCollectionView.setOnMoreClicked(bitmaps -> {
Toast.makeText(context, "OnMoreClicked", Toast.LENGTH_LONG).show();
});

24.validationedittext

Edit text validation library using MVVM ( ViewModel + LiveData)

This is a simple library that facilitates text validation and error handling in a user-friendly way on EditText with (TextInputLayout support). For MVVM + data binding stack

open class ErrorCodeException(
open val errorCode: Int,
open vararg val args: Any?
) : ValidationException()
open class StringException(val reason: String) : ValidationException()open class ResException(
@StringRes val resString: Int,
vararg val args: Any?
) : ValidationException()

25.jubako

A small API to help display rich content in a RecyclerView such as a wall of carousels

In this simple example we use some of Jubako’s convenience extensions to compose a RecyclerView with 100 rows.

Firstly the extension function RecyclerView.withJubako expresses which RecyclerView we want to load into (passing context) and then we follow up with a call to load describing what we want to load inside its lambda argument.

We can then make calls to Jubako’s withView extension function to specify each view (just a regular android.view.View) we wish to display for a row in our recycler that conveniently constructs the necessary boilerplate under the hood.

In the example we just print out 100 rows of static content, but Jubako was built to do much more than that.

Mostly this approach might work for simple applications, but under the hood Jubako offers more verbose construction to support more complicated scenarios.

The best place to start right now with Jubako is to check it the examples in the jubako-sample app in this repository.

Documentation is rough right now so the best place to begin would be to run & study the examples

26:SmoothBottomBar

A lightweight Android material bottom navigation bar library

  • Use SmoothBottomBar callbacks in your activity
bottomBar.onItemSelected = {
status.text = "Item $it selected"
}
bottomBar.onItemReselected = {
status.text = "Item $it re-selected"
}

OR

bottomBar.setOnItemSelectedListener(object: OnItemSelectedListener {
override fun onItemSelect(pos: Int) {
status.text = "Item $pos selected"
}
})
bottomBar.setOnItemReselectedListener(object: OnItemReselectedListener {
override fun onItemReselect(pos: Int) {
status.text = "Item $pos re-selected"
}
})

Customization

<me.ibrahimsn.lib.SmoothBottomBar
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="70dp"
app:menu=""
app:backgroundColor=""
app:indicatorColor=""
app:sideMargins=""
app:itemPadding=""
app:textColor=""
app:itemFontFamily=""
app:textSize=""
app:iconSize=""
app:iconTint=""
app:iconTintActive=""
app:activeItem=""
app:duration="" />

27:IndicatorScrollView

🧀 Reacts dynamically with an indicator when the scroll is changed.

IndicatorScrollView

IndicatorScrollView is a scrollView for reacting with IndicatorView when scroll is changed.
It extends NestedScrollView. So it must have a ViewGroup child like what LinearLayout or RelativeLayout.

IndicatorView

IndicatorView is an indicator view for reacting to IndicatorScrollView when the scroll is changed.
It should be used in IndicatorScrollView.

Create using builder class

We can create an instance of the IndicatorView using IndicatorView.Builder class.

val indicatorView = IndicatorView.Builder(this)
.setIndicatorItemPadding(16)
.setExpandingRatio(0.2f)
.setExpandingAllItemRatio(1.0f)
.build()

28:DoubleLift

🦋 Expands and collapses a layout’s horizontal and vertical sequentially.

Create using builder class

We can create an instance of DoubleLiftLayout using the DoubleLiftLayout.Builder class.

val myDoubleLiftLayout = DoubleLiftLayout.Builder(context)
.setFoldedWidth(200)
.setFoldedHeight(100)
.setCornerRadius(6)
.setLiftHorizontalDuration(400)
.setLiftVerticalDuration(200)
.setOnExpandListener { toast("expanded: $it") }
.build()

Expand and Collapse

We can expand and collapse using the below methods.

doubleLiftLayout.expand() // expand the width and height size sequentially.
doubleLiftLayout.collapse() // collapse the width and height size sequentially.

or we can do something after expanded using lambda.

doubleLiftLayout.expand { toast("expanded") }
doubleLiftLayout.collapse { toast("collapsed") }

29:InstagramVideoButton

This library is inspired by the instagram video button having the same animation, look and feel.

Kotlin

val instagramVideoButton = findViewById<InstagramVideoButton>(R.id.instagram_video_button)
instagramVideoButton.enablePhotoTaking(true)
instagramVideoButton.enableVideoRecording(true)
instagramVideoButton.setVideoDuration(10000)

Observe !!

instagramVideoButton.actionListener =  object : InstagramVideoButton.ActionListener {
override fun onStartRecord() {
Log.e("MY TAG", "CALL the on start record ")

}
override fun onEndRecord() {
Log.e("MY TAG", "CALL the on end record ")
}
override fun onSingleTap() {
Log.e("MY TAG", "CALL the on single tap record ")
}
override fun onDurationTooShortError() {
Log.e("MY TAG", "CALL the on on duration record ")
}override fun onCancelled() {
Log.e("MY TAG", "CALL the on on cancel record ")
}
}

30:Flat-Dialog-Android

📱Android Library to implement beautiful dialogs in android apps easily

How to use

final FlatDialog flatDialog = new FlatDialog(ExempleActivity.this);
flatDialog.setTitle("Login")
.setSubtitle("write your profile info here")
.setFirstTextFieldHint("email")
.setSecondTextFieldHint("password")
.setFirstButtonText("CONNECT")
.setSecondButtonText("CANCEL")
.withFirstButtonListner(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(ExempleActivity.this, flatDialog.getFirstTextField(), Toast.LENGTH_SHORT).show();
}
})
.withSecondButtonListner(new View.OnClickListener() {
@Override
public void onClick(View view) {
flatDialog.dismiss();
}
})
.show();

31:ActivityCircularReveal

A library for starting & finishing Android activities with a circular reveal animation

A library for starting & finishing Android activities with a circular animation.

Code based on & modified from this article: https://android.jlelse.eu/a-little-thing-that-matter-how-to-reveal-an-activity-with-circular-revelation-d94f9bfcae28

Usable in Lollipop 5.0+ projects. Circular reveal only working in Lollipop 5.1+.

Usage

In the activity you are starting another one from:

Kotlin

CircularReveal.presentActivity(CircularReveal.Builder(
this,
viewClicked,
Intent(this, OtherActivity::class.java),
1000
))

32:ElegantDialog

A beautiful, customizable and interactive dialog for Android written in Kotlin/Java 😍

Features

Here are some fancy stuff:

  • Top background customization
  • Bottom background customization
  • Custom layout(RecyclerView etc)
  • Custom icons(buttons and title)
  • Color customizations (Icons and Text)
  • Text customizations (Buttons, title and content)
  • Custom fonts (title and content)
  • Image loading using Glide or Picasso

33:BottomDrawer

BottomSheet with animations https://medium.com/@heyalex/bottom-sh…

You can make your own HandleView and implement TranslationUpdater interface for getting callbacks. Or you can use defined handle views by library like PlainHandleView or PullHandleView (check sample app).

After customizing theme and choosing handle view, you need to override configureBottomDrawer method and pass theme, handle view to BottomDrawerFragment.

So the following example will make Google Tasks fragment like on main preview:

class GoogleTaskExampleDialog : BottomDrawerFragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
super.onCreateView(inflater, container, savedInstanceState)
return inflater.inflate(R.layout.your_layout, container, false)
}
override fun configureBottomDrawer(): BottomDrawerDialog {
return BottomDrawerDialog.build(context!!) {
theme = R.style.Plain
//configure handle view
handleView = PlainHandleView(context).apply {
val widthHandle =
resources.getDimensionPixelSize(R.dimen.bottom_sheet_handle_width)
val heightHandle =
resources.getDimensionPixelSize(R.dimen.bottom_sheet_handle_height)
val params =
FrameLayout.LayoutParams(widthHandle, heightHandle, Gravity.CENTER_HORIZONTAL)
params.topMargin =
resources.getDimensionPixelSize(R.dimen.bottom_sheet_handle_top_margin)
layoutParams = params
}
}
}
}

34:sonloader-library

📱 Android library to open JSON from assets

Usage

Put the json file in the assets package on the android project (src / main / assets / filename.json). For more information, see Where do I place the ‘assets’ folder in Android Studio?

Get JSON as a string:

JSONLoader.with(getApplicationContext())
.fileName("filename.json")
.get(new StringLoaderListener() {
@Override
public void onResponse(String response) {
// response as String
}
@Override
public void onFailure(IOException error) {
// error
}
});

Get JSON as JSON Object:

JSONLoader.with(getApplicationContext())
.fileName("filename.json")
.getAsJSONObject(new JSONObjectLoaderListener() {
@Override
public void onResponse(JSONObject response) {
// response as JSONObject
}
@Override
public void onFailure(Exception error) {
// error
}
});

Get JSON as JSON Array:

JSONLoader.with(getApplicationContext())
.fileName("filename.json")
.getAsJSONArray(new JSONArrayLoaderListener() {
@Override
public void onResponse(JSONArray response) {
// response ad JSONArray
}
@Override
public void onFailure(Exception error) {
// error
}
});

35:View404

🍀 Easy way to implement 404 not found screens for android.

Use Simple Custom Layout

View404 supports Custom Layout Class for More Simple!

If you want to dismiss ‘not found’ View on your ViewGroup,

if(view404 != null) {
view404?.dismiss(R.anim.view404_fade_out_default)
view404 = null
}

36:android-color-wheel

ColorWheel

ColorWheel is a library for Android that provides HSV Color Wheel and Linear Gradient Seek Bar UI elements that can be used to pick ARGB color.

Requirements

The minimal required Android API version is 19 (Android 4.4).

Getting Started

To start using the views just add ColorWheel or GradientSeekBar to your xml layout file:

<com.apandroid.colorwheel.ColorWheel
android:id="@+id/colorWheel"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.apandroid.colorwheel.gradientseekbar.GradientSeekBar
android:id="@+id/gradientSeekBar"
android:layout_width="match_parent"
android:layout_height="match_parent" />

37:WrapContentViewPager

Wrap Content View Pager Library For Android. By using this, your view pager will be automatically wrap it’s height according to the current page.

WrapContentViewPager Details

By using this your viewpager can be wraped according to the current selected Fragment’s view. You don’t need to write extra code. Just follow the sample app steps and enjoy :)

38:earthquake

🌐 Earthquake app with USGS Earthquakes API https://www.uplabs.com/posts/earthquake

Requirements

  • Android Studio 3.5.1
  • JDK 8
  • Android SDK 29
  • Supports API Level +21
  • Material Components 1.1.0-beta01

Highlights

Demo application is available in Release

Libraries & Dependencies

Credit

39:SurveyKit

Android library to create beautiful surveys (aligned with ResearchKit on iOS)

SurveyKit: Create beautiful surveys on Android (inspired by ResearchKit Surveys on iOS)

Do you want to display a questionnaire to get the opinion of your users? A survey for a medical trial? A series of instructions in a manual-like style?
SurveyKit is an Android library that allows you to create exactly that.

Thematically it is built to provide a feeling of a professional research survey. The library aims to be visually clean, lean and easily configurable. We aim to keep the functionality close to iOS ResearchKit Surveys.

This is an early version and work in progress. Do not hesitate to give feedback, ideas or improvements via an issue.

Overview: Creating Research Surveys

40:androidx-auto-scroll-view-pager

Auto scroll viewpager working with Androidx libraries

Androidx Auto Scroll ViewPager

  • ViewPager which can auto scrolling, cycling, decelerating.
  • ViewPager which can be slided manually in parent ViewPager.
  • ViewPager which is compatible with AndroidX library.
  • ViewPager which is written in Kotlin and be supported for a long time.
  • setInterval(long) set auto scroll time in milliseconds, default is 1500.
  • setDirection(Direction) set auto scroll direction, default is Direction.RIGHT.
  • setCycle(boolean) set whether automatic cycle when auto scroll reaching the last or first item, default is true.
  • setScrollDurationFactor(double) set the factor by which the duration of sliding animation will change.
  • setSlideBorderMode(SlideBorderMode) set how to process when sliding at the last or first item, default is SlideBorderMode.NONE.
  • setStopScrollWhenTouch(boolean) set whether stop auto scroll when touching, default is true.
  • setBorderAnimation(boolean) set whether animating when auto scroll at the last or first item, default is true.
  • You cannot combine with ViewPagerIndicator if setCycle(true).

41:parse-android-test-app

Random Notes

About

Test Android application for Parse test server.

Features

  • managing the simple entity (Note);
  • sync data with the server;
  • restore data from the server;
  • sign up from the application with email address or Facebook account;
  • sign in to the server with email or Facebook.

Not handling exceptions

  • Internet connection unavailable status;
  • Parse Server connection unavailable status.

Facebook auth

Resources

42:IndicatorDecorator

🌝🌚🌚Indicator decorator is an indicator that can be used in ViewPager2 and RecyclerView.

What’s New in 0.1.1? 🎉

  • [Feature] Indicators to overlap. UseisOverlap (#2)
  • [Feature] Indicator background setting method added (#4)

43:DotsIndicatorWithoutViewpager

Paging dots indicator to use it without viewpager, you can use it with swipe gestures, buttons, etc..

Usage

Layout

Simple usage

<com.mazenrashed.dotsindicator.DotsIndicator  
android:id="@+id/dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dots_count="4"
/>

More options

<com.mazenrashed.dotsindicator.DotsIndicator  
android:id="@+id/dots_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:dot_height="7dp"
app:dot_width="7dp"
app:dots_count="4"
app:first_dot_height="14dp"
app:first_dot_width="14dp"
app:first_selected_dot_resource="@drawable/ic_home_white_24dp"
app:first_unselected_dot_resource="@drawable/ic_home_gray_24dp"
app:selected_dot_resource="@drawable/circle_white"
app:unselected_dot_resource="@drawable/circle_gray"
app:margins_between_dots="17dp"
app:selected_dot_scale_factor="1.4"
/>

Set selection

dotsIndicator.setDotSelection(position)

Select listener

dotsIndicator.onSelectListener = {  
Toast.makeText(this, "page $it selected", Toast.LENGTH_SHORT).show()
}

Set or change dots count

dotsIndicator.initDots(dotsCount)

44:dialogPlus

An Android library that lets you create a custom dialog in a simple and easy way ,with different types which you can use easily without any boilerplate code and with a great flexibility to fit your desired user interface.

Many types of dialogs provided: Message, Confirmation Dialog(a yes/no dialog), Code Entry, Success, Error, Multi Options, List, Rating, Year Picker, Month Picker , Day Picker, Month/Year Picker, Month/Day Picker, Date Picker(Fully functional and can accept minimum date or maximum date), and Localized Country Picker Dialog(32 Languages supported).

2.1 MESSAGE:

new DialogPlusBuilder("Message Dialog", "message dialog_plus sample\n Welcome Back")
//@ColorRes int positiveBackground, @ColorRes int negativeColorRes, @ColorRes int headerBgColor
.setTexts("alright")
.setBackgrounds(R.color.colorPrimary, R.color.colorAccent)
.buildMessageDialog(new DialogListener() {//implement functions
})
.show(this.getSupportFragmentManager(), "Message Dialog");

45:VSpot

A nice focus view intro for your app. Focus a specific view on first time launch

This library allows to show intro of your app or a specific view that you want to high-light when you add new features to app.

Sample Screen

Sample usage in your activity:
new VSpotView.Builder(this)
.setTitle("Spoti Title Text")
.setContentText("Spoti Description Text\n .....Spoti Description Text\n .....Spoti Description Text .....")
.setGravity(VSpotView.Gravity.AUTO) //optional
.setDismissType(VSpotView.DismissType.outSide) //optional - default dismissable by TargetView
.setTargetView(view)
.setContentTextSize(12)//optional
.setTitleTextSize(14)//optional
.build()
.show();

46:android-upi-payment

UpiPayment Library for Android (AndroidX)

A UpiPayment library for integrating upi payments using existing upi supported apps like googple pay, bhim etc.

An android library for integrating payment using existing upi apps.

Kotlin

// note: always create new instance of PaymentDetail for every new payment/order
var payment = PaymentDetail(
vpa="wangsunhakhun@oksbi",
name = "Wangsun Hakhun",
payeeMerchantCode = "", // only if you have merchantCode else pass empty string
txnRefId = "", // if you pass empty string we will generate txnRefId for you
description = "description",
amount = "2.00") // format of amount should be in decimal format x.x (eg 530.00), max. 2 decimal places
// note: always create new instance of UpiPayment for every new payment/order
UpiPayment(this)
.setPaymentDetail(payment)
.setUpiApps(UpiPayment.UPI_APPS)
.setCallBackListener(object : UpiPayment.OnUpiPaymentListener{
override fun onSubmitted(data: TransactionDetails) {
//transaction pending: use data to get TransactionDetails
}
override fun onSuccess(data: TransactionDetails) {
//transaction success: use data to get TransactionDetails
}
override fun onError(message: String) {
//user backpress or transaction failed
}
}).pay()

47:AutoLinkTextViewV2

AutoLinkTextView is a TextView that supports automatic detection of Hashtags (#), Mentions (@) , URLs (http://), Phone Nubers and emails

AutoLinkTextViewV2 is the new version of the AutoLinkTextView.

The main differences between the old and new version are

  • Fully migration to Kotlin
  • Added several new features
  • Some improvements and fixes

It supports automatic detection and click handling for

  • Hashtags (#)
  • Mentions (@)
  • URLs (http://)
  • Phone Numbers
  • Emails
  • Custom Regex

48:FormInputs

Sample Usage!

Spinner

<com.omarshehe.forminputkotlin.FormInputSpinner
android:id="@+id/gender"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:form_hint="Select gender"
app:form_array="@array/array_gender"
app:form_isMandatory="true"
app:form_label="Gender"
app:form_showValidIcon="false"/>

Auto Complete

<com.omarshehe.forminputkotlin.FormInputAutoComplete
android:id="@+id/country"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:form_array="@array/array_country"
app:form_height="40dp"
app:form_hint="Your country"
app:form_inputType="text"
app:form_isMandatory="true"
app:form_label="Country" />

49:ExpandableLayout

🦚 An expandable layout that shows a two-level layout with an indicator.

ExpandableLayout

Here is a basic example of implementing ExpandableLayout.

<com.skydoves.expandablelayout.ExpandableLayout
android:id="@+id/expandable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
app:expandable_duration="300"
app:expandable_isExpanded="false" // expand the second layout initially or not.
app:expandable_parentLayout="@layout/layout_parent" // sets the parent layout.
app:expandable_secondLayout="@layout/layout_second" // sets the second layout.
app:expandable_showSpinner="true" // shows the spinner or not.
app:expandable_spinner="@drawable/ic_arrow_down" // sets the spinner's drawable.
app:expandable_spinner_animate="true" // animates the spinner when expanding or collapse.
app:expandable_spinner_margin="14dp" // sets the margin to the spinner.
app:expandable_spinner_size="32dp" // sets the spinner size.
/>

Create using builder class

We can create an instance of ExpandableLayout using the builder class.

val myExpandableLayout = expandableLayout(context) {
setParentLayoutResource(R.layout.layout_parent)
setSecondLayoutResource(R.layout.layout_second)
setShowSpinner(true)
setSpinnerAnimate(true)
setSpinnerMargin(12f)
setSpinnerRotation(90)
setDuration(200)
setO

50:rtable

RecyclerView that works as table, with pagination and table headers.

Component implements a recyclerview, shows table headers and also has pagination.

Screenshots

How to use

Add in repository section (project gradle file)

maven { url "https://jitpack.io" }

Component only works with androidx, add the following libs:

implementation "androidx.appcompat:appcompat:1.0.0-alpha3"
implementation "androidx.recyclerview:recyclerview:1.0.0-alpha3"
implementation 'com.github.viktor:rtable:1.0.0'

Add the xml element in your activity layout:

<com.viktor.rtable.RecyclerViewTable
android:id="@+id/grid_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

51 fancyDialog

Simple Alert Dialog With Fancy Style

How to used

val dialog = FancyDialogBuilder(this, R.style.CustomDialog)
.withImageIcon(R.drawable.ic_new_message)
.withTitleTypeFace(R.font.roboto_bold)
.withSubTitleTypeFace(R.font.roboto_medium)
.withActionPositiveTypeFace(R.font.roboto_bold)
.withActionNegativeTypeFace(R.font.roboto_bold)
.withTextGravity(CENTER)
.withPanelGravity(END)
.withTitle(R.string.dialog_text_title)
.withSubTitle(R.string.dialog_text_message)
.withPositive(R.string.dialog_action_yes) { view, dialog -> dialog.dismiss() }
dialog.show()

52 ColorPickerView

ColorPickerView implements getting HSV colors, ARGB values, Hex color codes from
any image drawables or your gallery pictures by tapping on the desired color.
Supports alpha & brightness slider bar, dialog, and auto saving & restoring selected data.

Table of Contents

2. AlphaSlideBar
3. BrightnessSlideBar
4. ColorPickerDialog
5. FlagView
6. AlphaTileView
7. ColorPickerView Methods
8. Other Libraries

You have followed the group:

https://android-arsenal.com

http://www.tellmehow.co/

ใครสนใจ มา join line ได้ครับ รับจำนวนจำกัด ใครปัญหา ชอบแชร์ มีเรื่องอะไรใหม่ๆ สามารถ join เข้าได้เลยครับ 😁

หากสนใจ ก็สามารถ join ได้ที่นี้เลยครับ . หรือ scan qrcode . ไปได้เลย

[Android Github Dev] คุณได้รับคำเชิญให้เข้าร่วมสแควร์ของ LINE
https://line.me/ti/g2/UVVDK6Z5EE
Android Developer

Thank you for joining: https://www.facebook.com/groups/883546485084033/?fref=ts I created a group of Android Developers Android and Kotlin Droidcon Github library. If you have any questions, you can ask. You can join in the App Telegram. https://t.me/joinchat/IhB5KQ0aXC7ckNgjRaBaCw Now join Android Developers And Kotlin Droidcon Github Library Community Telegram App to help each other. Joining Link:

Android Open Source Projects [inclusion] [SUM] [Join user groups] There is a problem with Android projects and want to give answers. What's new or want to update the robot continuously. Can join. Line: po56789 or inbox on the page, come to join, please just !!!!
Thank you

แฟนเพจ PongPloy Zone AppDev

Link : https://www.facebook.com/PPAndroid-Github-Dev-Zone-170227463027435/notifications/

แฟนเพจ PongPloy Zone AppDev

PPAndroid Github Dev Zone

https://www.facebook.com/PPAndroid-Github-Dev-Zone-170227463027435/

Thanks ขอฝาก link old blog บล็อกที่ผ่านๆ มาด้วยนะครับ^^

Part 1: [Great] Interesting Android Library — April 2017 for Android GitHub Developer Library
Part 2: [Popular] Android library May — September ( cobeisfresh ) 2017 for Android GitHub Developer Library
Part 3: Lovely Android Library May — September ( cobeisfresh ) 2017 for Android GitHub Developer Library
Part 3: [Top 40] Featured Android Library — September 2017 For Android Developers GitHub
Part 5: [50Top] Awesome Android Libraries — February March April 2018 Android Developer Library GitHub
Part 6: [Include 61 Libraries All for 2018 ] Awesome Android Libraries — 2018 October — December Android Developer Library GitHub

ใครสนใจ มา join line ได้ครับ รับจำนวนจำกัด ใครปัญหา ชอบแชร์ มีเรื่องอะไรใหม่ๆ สามารถ join เข้าได้เลยครับ 😁

หากสนใจ ก็สามารถ join ได้ที่นี้เลยครับ . หรือ scan qrcode . ไปได้เลย

Thank you for joining: https://www.facebook.com/groups/883546485084033

กราบๆ

[Android Github Dev] คุณได้รับคำเชิญให้เข้าร่วมสแควร์ของ LINE
https://line.me/ti/g2/UVVDK6Z5EE
Android Developer

I created a group of Android Developers Android and Kotlin Droidcon Github library. If you have any questions, you can ask. You can join in the App Telegram. Now join Android Developers And Kotlin Droidcon

Android Developers And Kotlin Droidcon Github Library
https://t.me/AndroidDevelopersAndKotlin

Please Use Telegram App to help each other. Joining Link:

Android Open Source Projects [inclusion] [SUM] [Join user groups] There is a problem with Android projects and want to give answers. What's new or want to update the robot continuously. Can join. Line: po56789 or inbox on the page, come to join, please just !!!!
Thank you

แฟนเพจ PongPloy Zone AppDev

Link : https://www.facebook.com/PPAndroid-Github-Dev-Zone-170227463027435/notifications/

Language learning application APP .

EN

Practice writing, reading, Kai-ABC, this application. Designed to be easy to use, uncomplicated, with illustrations and sound for train children to read according to Thai-English consonants clearly.Practice writing all 44 Thai consonants from chicken to hawk and 26 English consonants since A-Z makes it easy to learn and remember.This application is suitable for Thai students. And foreigners studying Thai languageAnd in the future, may add more games to children

Thai :

ฝึกเขียน อ่าน ก ไก่-ABC แอพพลิเคชั่นนี้ ออกแบบมาให้ใช้งานง่าย ไม่ซับซ้อน โดยมีภาพประกอบพร้อมเสียงสำหรับฝึก ให้เด็กๆ ท่องตาม อ่านเสียงพยัญชนะ ไทย — อังกฤษ ได้ชัดเจน ฝึกเขียนพยัญชนะไทยทั้ง 44 ตัว ตั้งแต่ ก ไก่ จนถึง ฮ นกฮูก และ พยัญชนะภาษาอังกฤษทั้ง 26 ตัว ตั้งแต่ A-Z ทำให้ง่ายต่อการเรียนรู้และจดจำแอพพลิเคชั่นนี้เหมาะสำหรับเด็กนักเรียนไทย และชาวต่างชาติที่ศึกษาภาษาไทยและต่อไปในอนาคต อาจจะเพิ่ม เกม ให้เด็กมาสนใจมากขึ้น

Download : App link : https://play.google.com/store/apps/details?id=com.pongploydev.education.mediaapp

Include library collections in the past.

--

--