[{Ep. 1} Include 50 more] Libraries All Awesome Android Developer Libraries in GitHub V.1
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.
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)
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
}
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.
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 = preferencesval dropDownListItems = LinkedList<DropDownList.Item>()
var item: DropDownList.Itemitem = 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)
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)
}
}
}
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
- Add to build.gradle in app level
implementation 'com.github.tntkhang:full-screen-image-view-library:1.1.0'
- 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
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
*/
}
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..
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
- Changes language on-the-fly
- Persists the changes in
Preferences
automatically - Detects changes when activity loads from backstack
- Detects Right-To-Left (RTL) languages and updates layout direction
- 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.
📱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();
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.
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.
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
- install and run Arduino module;
- pair your Android device and Arduino Bluetooth module;
- 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 { }
}
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(...)
}
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();
});
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
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="" />
🧀 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") }
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 ")
}}
📱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();
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
))
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
}
}
}
}
📱 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
}
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" />
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
- Use USGS Earthquake API
- Use Material Design 2
- Dark Mode
Demo application is available in Release
Libraries & Dependencies
- android-maps-utils: Handy extensions to the Google Maps Android API
- GravitySnapHelper: A SnapHelper that snaps a RecyclerView to an edge
- Support libraries: appcompat / recyclerview / constraintlayout
- Material Design 2: MaterialCardView / MaterialButton / Bottom App Bars / ExtendedFloatingActionButton
- FastAdapter: The bullet proof, fast and easy to use adapter library, which minimizes developing time to a fraction
- Square Retrofit / Okhttp / Logging-Interceptor
- RxAndroid Reactive Extensions for Android
- Firebase Core / Crashlytics
- ButterKnife: Bind Android views and callbacks to fields and methods.
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
- What SurveyKit does for you
- What SurveyKit does not (yet) do for you
- Library Setup
- Add the repository
- Add the dependency
- Usage
- Add and find the survey in the xml
- Create survey steps
- Create a Task
- Evaluate the results
- Configure
- Start the survey
- Custom steps
- Comparison to ResearchKit on iOS
- Author
- Contributing
- License
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 is1500
.setDirection(Direction)
set auto scroll direction, default isDirection.RIGHT
.setCycle(boolean)
set whether automatic cycle when auto scroll reaching the last or first item, default istrue
.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 isSlideBorderMode.NONE
.setStopScrollWhenTouch(boolean)
set whether stop auto scroll when touching, default istrue
.setBorderAnimation(boolean)
set whether animating when auto scroll at the last or first item, default istrue
.- You cannot combine with ViewPagerIndicator if
setCycle(true)
.
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
🌝🌚🌚Indicator decorator is an indicator that can be used in ViewPager2 and RecyclerView.
What’s New in 0.1.1? 🎉
- [Feature] Indicators to overlap. Use
isOverlap
(#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
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();
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()
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" />
🦚 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
- ColorPickerView in layout
- ColorListener
- ActionMode
- Create using builder
- Restore and save
- Pallette from Gallery
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
ใครสนใจ มา 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
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.