├── .circleci └── config.yml ├── .gitignore ├── LICENSE ├── README.md ├── build.gradle ├── demo ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── minibugdev │ │ └── drawablebadge │ │ └── demo │ │ └── DemoActivity.kt │ └── res │ ├── drawable-hdpi │ ├── ic_bug_report.png │ ├── ic_bug_report_white.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── drawable-mdpi │ ├── ic_bug_report.png │ ├── ic_bug_report_white.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── drawable-xhdpi │ ├── ic_bug_report.png │ ├── ic_bug_report_white.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── drawable-xxhdpi │ ├── ic_bug_report.png │ ├── ic_bug_report_white.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── drawable-xxxhdpi │ ├── ic_bug_report.png │ ├── ic_bug_report_white.png │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── drawable │ ├── ic_notifications.xml │ └── selector_badge.xml │ ├── layout │ └── activity_demo.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── library ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── minibugdev │ │ │ └── drawablebadge │ │ │ └── DrawableBadge.kt │ └── res │ │ └── values │ │ ├── colors.xml │ │ └── dimens.xml │ └── test │ ├── java │ └── com │ │ └── minibugdev │ │ └── drawablebadge │ │ └── DrawableBadgeBuilderTest.kt │ └── resources │ └── robolectric.properties ├── screenshot.png └── settings.gradle /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | jobs: 3 | build: 4 | docker: 5 | - image: circleci/android:api-29 6 | environment: 7 | - TERM: dumb 8 | - JVM_OPTS: -Xmx1024m 9 | - _JAVA_OPTIONS: "-Xmx1024m" 10 | steps: 11 | - checkout 12 | - restore_cache: 13 | key: jars-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "build.gradle" }}-{{ checksum "library/build.gradle" }} 14 | - run: 15 | name: Download Dependencies 16 | command: ./gradlew androidDependencies 17 | - save_cache: 18 | paths: 19 | - ~/.gradle 20 | - ~/.m2 21 | key: jars-{{ checksum "gradle/wrapper/gradle-wrapper.properties" }}-{{ checksum "build.gradle" }}-{{ checksum "library/build.gradle" }} 22 | - run: 23 | name: Run Tests 24 | command: ./gradlew :library:test 25 | - store_artifacts: 26 | path: library/build/reports 27 | destination: reports -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | .DS_Store 5 | /build 6 | /captures 7 | .externalNativeBuild 8 | .idea -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Teeranai.P 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Drawable Badge 2 | [![CircleCI](https://circleci.com/gh/minibugdev/DrawableBadge.svg?style=shield)](https://circleci.com/gh/minibugdev/DrawableBadge) 3 | [![Release](https://jitpack.io/v/minibugdev/DrawableBadge.svg)](https://jitpack.io/#minibugdev/DrawableBadge/2.0.1) 4 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/minibugdev/DrawableBadge/master/LICENSE) 5 | 6 | Drawable Badge is a android library for adding badges to drawables. 7 | 8 | ![Drawable Badge Android Library](https://github.com/minibugdev/DrawableBadge/blob/master/screenshot.png?raw=true) 9 | 10 | ## Usage 11 | Generate drawable with badge 12 | ``` kotlin 13 | val drawable = DrawableBadge.Builder(context) 14 | .drawableResId(R.mipmap.ic_launcher_round) 15 | .badgeColor(R.color.badgeColor) 16 | .badgeSize(R.dimen.badge_size) 17 | .badgeGravity(Gravity.CENTER_VERTICAL or Gravity.Start) 18 | .badgeMargin(R.dimen.badge_margin) 19 | .textColor(R.color.textColor) 20 | .showBorder(true) 21 | .badgeBorderColor(R.color.badgeBorderColor) 22 | .badgeBorderSize(R.dimen.badge_border_size) 23 | .maximumCounter(99) 24 | .showCounter(true) 25 | .build() 26 | .get(99) 27 | ``` 28 | Apply to image view. 29 | ``` kotlin 30 | imageViewBadge.setImageDrawable(drawable) 31 | ``` 32 | 33 | ## Customize 34 | - `drawableResId`: Drawable resource id to added badges. 35 | - `drawable`: Drawable to added badges. 36 | - `bitmap`: Bitmap to added badges. 37 | - `textColor`: Badge text color resource id, default `#FFFFFF`. 38 | - `badgeColor`: Badge color resource id , default `#FF0000`. 39 | - `badgeSize`: Badge size supported `@DimenRes` or `@Px`, default `16dp`. 40 | - `badgeGravity`: Position of badge by [Android Gravity](https://developer.android.com/reference/android/view/Gravity) which need to added. default `Gravity.TOP or Gravity.END`. 41 | - `badgeMargin`: Badge margin supported `@DimenRes` or `@Px`, default `0`. 42 | - `showBorder`: Set visible of badge border, default `true`. 43 | - `badgeBorderColor`: Badge border color resource id , default `#FFFFFF`. 44 | - `badgeBorderSize`: Badge border size supported `@DimenRes` or `@Px`, default `0.5dp`. 45 | - `maximumCounter`: Maximum counter text will append with `+`, default and not more than `99`. 46 | - `showCounter`: Set visible of badge counter number, default `true`. 47 | 48 | #### Deprecated 49 | - `badgePosition`: Position of Badge which need to added. 50 | 51 | ## Download 52 | ``` groovy 53 | repositories { 54 | maven { url 'https://jitpack.io' } 55 | } 56 | ``` 57 | 58 | ``` groovy 59 | compile 'com.github.minibugdev:drawablebadge:2.0.1' 60 | ``` 61 | 62 | 63 | ## License 64 | ``` 65 | MIT License 66 | 67 | Copyright (c) 2017 Teeranai.P 68 | 69 | Permission is hereby granted, free of charge, to any person obtaining a copy 70 | of this software and associated documentation files (the "Software"), to deal 71 | in the Software without restriction, including without limitation the rights 72 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 73 | copies of the Software, and to permit persons to whom the Software is 74 | furnished to do so, subject to the following conditions: 75 | 76 | The above copyright notice and this permission notice shall be included in all 77 | copies or substantial portions of the Software. 78 | 79 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 80 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 81 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 82 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 83 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 84 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 85 | SOFTWARE. 86 | ``` 87 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.4.21' 3 | ext.androidx_version = '1.2.0' 4 | ext.android_annotation_version = '1.1.0' 5 | 6 | ext.test_runner_version = '1.2.0' 7 | ext.junit_version = '4.12' 8 | ext.mockk_version = '1.9.2' 9 | ext.robolectric_version = '4.4' 10 | 11 | repositories { 12 | jcenter() 13 | google() 14 | } 15 | dependencies { 16 | classpath 'com.android.tools.build:gradle:4.1.1' 17 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 18 | classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' 19 | 20 | // NOTE: Do not place your application dependencies here; they belong 21 | // in the individual module build.gradle files 22 | } 23 | } 24 | 25 | allprojects { 26 | repositories { 27 | jcenter() 28 | google() 29 | } 30 | } 31 | 32 | task clean(type: Delete) { 33 | delete rootProject.buildDir 34 | } 35 | -------------------------------------------------------------------------------- /demo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /demo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | apply plugin: 'kotlin-android-extensions' 4 | 5 | android { 6 | compileSdkVersion 30 7 | buildToolsVersion "30.0.3" 8 | defaultConfig { 9 | applicationId "com.minibugdev" 10 | minSdkVersion 15 11 | targetSdkVersion 30 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | sourceSets { 22 | main.java.srcDirs += 'src/main/kotlin' 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation project(':library') 28 | implementation "androidx.appcompat:appcompat:$androidx_version" 29 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 30 | } 31 | -------------------------------------------------------------------------------- /demo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/teeranai/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /demo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /demo/src/main/java/com/minibugdev/drawablebadge/demo/DemoActivity.kt: -------------------------------------------------------------------------------- 1 | package com.minibugdev.drawablebadge.demo 2 | 3 | import android.os.Bundle 4 | import android.view.Gravity 5 | import androidx.appcompat.app.AppCompatActivity 6 | import com.minibugdev.drawablebadge.DrawableBadge 7 | import kotlinx.android.synthetic.main.activity_demo.* 8 | 9 | class DemoActivity : AppCompatActivity() { 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | setContentView(R.layout.activity_demo) 14 | registerEvents() 15 | } 16 | 17 | private fun registerEvents() { 18 | buttonTopLeft.setOnClickListener { drawBadge(1, Gravity.TOP or Gravity.START) } 19 | buttonTopRight.setOnClickListener { drawBadge(50, Gravity.TOP or Gravity.END) } 20 | buttonBottomLeft.setOnClickListener { drawBadge(99, Gravity.BOTTOM or Gravity.START) } 21 | buttonBottomRight.setOnClickListener { drawBadge(100, Gravity.BOTTOM or Gravity.END) } 22 | buttonCenterHorizontal.setOnClickListener { drawBadge(100, Gravity.CENTER_HORIZONTAL or Gravity.TOP) } 23 | buttonCenterVertical.setOnClickListener { drawBadge(100, Gravity.CENTER_VERTICAL or Gravity.START) } 24 | buttonReset.setOnClickListener { drawBadge(0, Gravity.TOP or Gravity.END) } 25 | } 26 | 27 | private fun drawBadge(number: Int, gravity: Int) { 28 | val drawableResId = when (radioGroup.checkedRadioButtonId) { 29 | R.id.radioButtonSelectorDrawable -> R.drawable.selector_badge 30 | R.id.radioButtonVectorDrawable -> R.drawable.ic_notifications 31 | else -> R.drawable.ic_launcher 32 | } 33 | 34 | DrawableBadge.Builder(applicationContext) 35 | .drawableResId(drawableResId) 36 | .badgeColor(R.color.badgeColor) 37 | .badgeSize(R.dimen.badge_size) 38 | .badgeGravity(gravity) 39 | .textColor(R.color.textColor) 40 | .showBorder(true) 41 | .badgeBorderColor(R.color.borderColor) 42 | .badgeBorderSize(R.dimen.badge_border_size) 43 | .maximumCounter(99) 44 | .badgeMargin(10f) 45 | .showCounter(true) 46 | .build() 47 | .get(number) 48 | .let { drawable -> imageViewBadge.setImageDrawable(drawable) } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_bug_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-hdpi/ic_bug_report.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_bug_report_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-hdpi/ic_bug_report_white.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-mdpi/ic_bug_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-mdpi/ic_bug_report.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-mdpi/ic_bug_report_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-mdpi/ic_bug_report_white.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_bug_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xhdpi/ic_bug_report.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_bug_report_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xhdpi/ic_bug_report_white.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_bug_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxhdpi/ic_bug_report.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_bug_report_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxhdpi/ic_bug_report_white.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_bug_report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxxhdpi/ic_bug_report.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_bug_report_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxxhdpi/ic_bug_report_white.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/minibugdev/DrawableBadge/fc5879769ec5b2ca7a2b1820b9a903039639009c/demo/src/main/res/drawable-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /demo/src/main/res/drawable/ic_notifications.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demo/src/main/res/drawable/selector_badge.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /demo/src/main/res/layout/activity_demo.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 16 | 20 | 21 | 27 | 28 | 33 | 34 | 39 | 40 | 41 | 45 | 46 |