├── .github ├── FUNDING.yml └── dependabot.yml ├── .gitignore ├── .idea ├── $CACHE_FILE$ ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── compiler.xml ├── dictionaries ├── gradle.xml ├── jarRepositories.xml ├── markdown-navigator-enh.xml ├── markdown-navigator.xml ├── misc.xml ├── scopes │ └── ReadMe.xml └── vcs.xml ├── LICENSE ├── README.md ├── _config.yml ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── helpfultools │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── programmersbox │ │ │ └── helpfultools │ │ │ ├── ColorApi.kt │ │ │ ├── JavaDslBuilder.java │ │ │ ├── JavaDslMarker.java │ │ │ ├── Linting.java │ │ │ ├── MainActivity.kt │ │ │ ├── MoreActivity.kt │ │ │ ├── Names.kt │ │ │ ├── TestApp.kt │ │ │ ├── TypeToGo.kt │ │ │ ├── Utils.kt │ │ │ ├── broadcast │ │ │ └── BroadcastActivity.kt │ │ │ └── contextutility │ │ │ └── ContextActivity.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_broadcast.xml │ │ ├── activity_context.xml │ │ ├── activity_main.xml │ │ ├── activity_more.xml │ │ ├── layout_item.xml │ │ └── layout_item_two.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── programmersbox │ └── helpfultools │ └── ExampleUnitTest.kt ├── build.gradle ├── dragswipe ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── dragswipe │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── dragswipe │ │ ├── DragSwipeActionsBuilder.kt │ │ ├── DragSwipeDiffUtil.kt │ │ ├── DragSwipeExtensions.kt │ │ └── DragSwipeUtils.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── dragswipe │ └── ExampleUnitTest.kt ├── dslannotations ├── .gitignore ├── README.md ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── programmersbox │ └── dslannotations │ ├── DslClass.kt │ └── DslField.kt ├── dslprocessor ├── .gitignore ├── README.md ├── build.gradle └── src │ └── main │ └── java │ └── com │ └── programmersbox │ └── dslprocessor │ ├── DslClassProcessor.kt │ ├── DslFieldsProcessor.kt │ └── ProcessorExtensions.kt ├── flowutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── flowutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── flowutils │ │ ├── FlowExtensions.kt │ │ ├── FlowItem.kt │ │ ├── FlowItemExtensions.kt │ │ ├── JobExtensions.kt │ │ └── UIFlowExtensions.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── flowutils │ └── ExampleUnitTest.kt ├── funutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── funutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── programmersbox │ │ │ └── funutils │ │ │ ├── cards │ │ │ ├── AbstractDeck.kt │ │ │ ├── Card.kt │ │ │ └── DeckOfCards.kt │ │ │ ├── funutilities │ │ │ ├── SequenceMaker.kt │ │ │ └── TimedSequenceMaker.kt │ │ │ └── views │ │ │ ├── BubbleEmitter.kt │ │ │ ├── CheckBoxGroup.kt │ │ │ ├── DiamondLoader.kt │ │ │ ├── ExpandingSlider.kt │ │ │ ├── FingerDetector.kt │ │ │ ├── Flash.kt │ │ │ ├── SlideValuePicker.kt │ │ │ └── TableAdapter.kt │ └── res │ │ ├── drawable │ │ ├── checkbox_selector.xml │ │ ├── ic_check_box_black_24dp.xml │ │ ├── ic_check_box_outline_blank_black_24dp.xml │ │ └── ic_indeterminate_check_box_black_24dp.xml │ │ ├── layout │ │ └── table_adapter_item.xml │ │ └── values │ │ └── attrs.xml │ └── test │ └── java │ └── com │ └── programmersbox │ └── funutils │ └── ExampleUnitTest.kt ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── gsonutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── gsonutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── gsonutils │ │ ├── ApiUtils.kt │ │ ├── GsonUtils.kt │ │ └── HelpfulGsonUtils.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── gsonutils │ └── ExampleUnitTest.kt ├── helpfulutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── helpfulutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── helpfulutils │ │ ├── ActivityUtils.kt │ │ ├── AlarmUtils.kt │ │ ├── BiometricUtils.kt │ │ ├── BroadcastReceiverUtils.kt │ │ ├── CollectionUtils.kt │ │ ├── ContextUtils.kt │ │ ├── DateUtils.kt │ │ ├── DownloadUtils.kt │ │ ├── ManagerUtils.kt │ │ ├── NotificationUtils.kt │ │ ├── NumberAndroidUtils.kt │ │ ├── NumberUtils.kt │ │ ├── QuickAdapter.kt │ │ ├── RangeUtils.kt │ │ ├── Utils.kt │ │ ├── ViewUtils.kt │ │ └── views │ │ └── OverScrollBehavior.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── helpfulutils │ └── ExampleUnitTest.kt ├── loggingutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── loggingutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── loggingutils │ │ ├── Framing.kt │ │ ├── Loged.kt │ │ └── LogedInterceptor.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── loggingutils │ └── ExampleUnitTest.kt ├── loggingutilslint ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── loggingutilslint │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── programmersbox │ │ │ └── loggingutilslint │ │ │ ├── AndroidLogDetector.kt │ │ │ └── LogedIssueRegistry.kt │ └── res │ │ └── META-INF │ │ └── services │ │ └── com.android.tools.lint.client.api.IssueRegistry │ └── test │ └── java │ └── com │ └── programmersbox │ └── loggingutilslint │ └── ExampleUnitTest.kt ├── publish.gradle ├── rxutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── rxutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── rxutils │ │ ├── RxContextUtils.kt │ │ ├── RxControlsProviderService.kt │ │ └── RxUtils.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── rxutils │ └── ExampleUnitTest.kt ├── settings.gradle ├── testingplayground ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro ├── sampledata │ └── sample_colors └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── testingplayground │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── testingplayground │ │ ├── AnsiColor.kt │ │ ├── FlowDeckOfCards.kt │ │ └── RxDeckOfCards.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── testingplayground │ └── ExampleUnitTest.kt ├── testingplaygroundapp ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── testingplaygroundapp │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── programmersbox │ │ │ └── testingplaygroundapp │ │ │ ├── BindingActivity.kt │ │ │ ├── CheckboxTestActivity.kt │ │ │ ├── CustomViewActivity.kt │ │ │ ├── Games.kt │ │ │ ├── JavaDslBuilder.java │ │ │ ├── JavaDslMarker.java │ │ │ ├── Linting.java │ │ │ ├── MainActivity.kt │ │ │ ├── Names.kt │ │ │ ├── PeopleBuilder.kt │ │ │ ├── TableActivity.kt │ │ │ ├── TestApp.kt │ │ │ ├── TestingControlService.kt │ │ │ ├── Views.kt │ │ │ ├── WIPUtils.kt │ │ │ └── cardgames │ │ │ ├── CardUtils.kt │ │ │ ├── blackjack │ │ │ └── BlackjackActivity.kt │ │ │ ├── poker │ │ │ └── PokerHand.kt │ │ │ └── uno │ │ │ ├── Uno.kt │ │ │ └── UnoActivity.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ ├── ace1.png │ │ ├── ace2.png │ │ ├── ace3.png │ │ ├── ace4.png │ │ ├── b1fv.png │ │ ├── border.xml │ │ ├── clear.png │ │ ├── eight1.png │ │ ├── eight2.png │ │ ├── eight3.png │ │ ├── eight4.png │ │ ├── five1.png │ │ ├── five2.png │ │ ├── five3.png │ │ ├── five4.png │ │ ├── four1.png │ │ ├── four2.png │ │ ├── four3.png │ │ ├── four4.png │ │ ├── ic_launcher_background.xml │ │ ├── jack1.png │ │ ├── jack2.png │ │ ├── jack3.png │ │ ├── jack4.png │ │ ├── king1.png │ │ ├── king2.png │ │ ├── king3.png │ │ ├── king4.png │ │ ├── nine1.png │ │ ├── nine2.png │ │ ├── nine3.png │ │ ├── nine4.png │ │ ├── queen1.png │ │ ├── queen2.png │ │ ├── queen3.png │ │ ├── queen4.png │ │ ├── seven1.png │ │ ├── seven2.png │ │ ├── seven3.png │ │ ├── seven4.png │ │ ├── six1.png │ │ ├── six2.png │ │ ├── six3.png │ │ ├── six4.png │ │ ├── ten1.png │ │ ├── ten2.png │ │ ├── ten3.png │ │ ├── ten4.png │ │ ├── three1.png │ │ ├── three2.png │ │ ├── three3.png │ │ ├── three4.png │ │ ├── two1.png │ │ ├── two2.png │ │ ├── two3.png │ │ └── two4.png │ │ ├── layout │ │ ├── activity_binding.xml │ │ ├── activity_blackjack.xml │ │ ├── activity_checkbox_test.xml │ │ ├── activity_custom_view.xml │ │ ├── activity_main.xml │ │ ├── activity_table.xml │ │ ├── activity_uno.xml │ │ ├── binding_test_item.xml │ │ ├── card_item.xml │ │ ├── collapsed_notification.xml │ │ ├── expanded_notification.xml │ │ ├── test_item.xml │ │ └── ui_test_file.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.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 │ │ ├── dimen.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── pref_ui_test.xml │ └── test │ └── java │ └── com │ └── programmersbox │ └── testingplaygroundapp │ ├── ClassInfoExtensions.kt │ ├── ClassInformationGetter.kt │ ├── ExampleUnitTest.kt │ ├── ExampleUnitTestThree.kt │ ├── ExampleUnitTestTwo.kt │ └── ResourceMaker.kt ├── thirdpartyutils ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── programmersbox │ │ └── thirdpartyutils │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── programmersbox │ │ └── thirdpartyutils │ │ ├── BrowserUtils.kt │ │ ├── GlideUtils.kt │ │ ├── LottieUtils.kt │ │ ├── PaletteUtils.kt │ │ └── RetrofitUtils.kt │ └── test │ └── java │ └── com │ └── programmersbox │ └── thirdpartyutils │ └── ExampleUnitTest.kt └── versions.gradle /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: jakepurple13 # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: V7V3D3JI 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gradle 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: '08:00' 8 | timezone: America/New_York 9 | open-pull-requests-limit: 10 10 | reviewers: 11 | - jakepurple13 12 | ignore: 13 | - dependency-name: com.android.tools.build:gradle 14 | versions: 15 | - ">= 4.1.a, < 4.2" 16 | - dependency-name: com.squareup.okhttp3:okhttp 17 | versions: 18 | - "> 4.7.0, < 4.8" 19 | - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-android 20 | versions: 21 | - "> 1.3.5, < 2" 22 | - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-core 23 | versions: 24 | - "> 1.3.5, < 2" 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /.idea/$CACHE_FILE$: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Android 10 | 11 | 12 | JUnitJava 13 | 14 | 15 | Java 16 | 17 | 18 | LintAndroid 19 | 20 | 21 | PerformanceLintAndroid 22 | 23 | 24 | 25 | 26 | Android 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/dictionaries: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 34 | 35 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | 39 | 40 | -------------------------------------------------------------------------------- /.idea/markdown-navigator-enh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /.idea/scopes/ReadMe.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [HelpfulTools](https://github.com/jakepurple13/HelpfulTools/wiki) 2 | 3 | ![GitHub license](https://img.shields.io/github/license/jakepurple13/HelpfulTools?style=for-the-badge) 4 | ![GitHub top language](https://img.shields.io/github/languages/top/jakepurple13/helpfultools?style=for-the-badge) 5 | ![JitPack](https://img.shields.io/jitpack/v/github/jakepurple13/HelpfulTools?style=for-the-badge) 6 | 7 | ![visitors](https://page-views.glitch.me/badge?page_id=jakepurple13.HelpfulTools) 8 | 9 | Just some small simple tools that I have found myself copying+pasting to almost all projects I do. 10 | 11 | First, add JitPack: 12 | ```groovy 13 | allprojects { 14 | repositories { 15 | //... 16 | maven { url 'https://jitpack.io' } 17 | } 18 | } 19 | ``` 20 | 21 | [![](https://jitpack.io/v/jakepurple13/HelpfulTools.svg?style=flat-square)](https://jitpack.io/#jakepurple13/HelpfulTools) 22 | 23 | ```groovy 24 | implementation 'com.github.jakepurple13.HelpfulTools:flowutils:{version}' 25 | implementation 'com.github.jakepurple13.HelpfulTools:gsonutils:{version}' 26 | implementation 'com.github.jakepurple13.HelpfulTools:helpfulutils:{version}' 27 | implementation 'com.github.jakepurple13.HelpfulTools:loggingutils:{version}' 28 | implementation 'com.github.jakepurple13.HelpfulTools:rxutils:{version}' 29 | implementation 'com.github.jakepurple13.HelpfulTools:dragswipe:{version}' 30 | implementation 'com.github.jakepurple13.HelpfulTools:funutils:{version}' 31 | implementation "com.github.jakepurple13.HelpfulTools:thirdpartyutils:{version}" 32 | ``` 33 | 34 | These aren't working right now. Use version 10.2.3 if you want to use them 35 | For the dslprocessor module, also include: 36 | ```groovy 37 | //To allow kapt 38 | apply plugin: 'kotlin-kapt' 39 | //For the Annotations 40 | implementation 'com.github.jakepurple13.HelpfulTools:dslannotations:{version}' 41 | //For the actual generation 42 | kapt "com.github.jakepurple13.HelpfulTools:dslprocessor:{version}" 43 | ``` 44 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-midnight -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/programmersbox/helpfultools/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.programmersbox.helpfultools", appContext.packageName) 23 | } 24 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/ColorApi.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools 2 | 3 | data class ColorApi( 4 | val hex: Hex?, 5 | val rgb: Rgb?, 6 | val hsl: Hsl?, 7 | val hsv: Hsv?, 8 | val name: Name?, 9 | val cmyk: Cmyk?, 10 | val XYZ: XYZ?, 11 | val image: Image?, 12 | val contrast: Contrast?, 13 | val _links: _links?, 14 | val _embedded: _embedded? 15 | ) 16 | 17 | data class Cmyk(val fraction: Fraction?, val value: String?, val c: Number?, val m: Number?, val y: Number?, val k: Number?) 18 | 19 | data class Contrast(val value: String?) 20 | 21 | data class Fraction(val c: Number?, val m: Number?, val y: Number?, val k: Number?) 22 | 23 | data class Hex(val value: String?, val clean: String?) 24 | 25 | data class Hsl(val fraction: Fraction?, val h: Number?, val s: Number?, val l: Number?, val value: String?) 26 | 27 | data class Hsv(val fraction: Fraction?, val value: String?, val h: Number?, val s: Number?, val v: Number?) 28 | 29 | data class Image(val bare: String?, val named: String?) 30 | 31 | data class Name(val value: String?, val closest_named_hex: String?, val exact_match_name: Boolean?, val distance: Number?) 32 | 33 | data class Rgb(val fraction: Fraction?, val r: Number?, val g: Number?, val b: Number?, val value: String?) 34 | 35 | data class Self(val href: String?) 36 | 37 | data class XYZ(val fraction: Fraction?, val value: String?, val X: Number?, val Y: Number?, val Z: Number?) 38 | 39 | class _embedded() 40 | 41 | data class _links(val self: Self?) -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/JavaDslBuilder.java: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools; 2 | 3 | //import com.programmersbox.dslannotations.DslClass; 4 | //import com.programmersbox.dslannotations.DslField; 5 | 6 | import kotlin.Unit; 7 | import kotlin.jvm.functions.Function0; 8 | import kotlin.jvm.functions.Function1; 9 | 10 | //@DslClass(dslMarker = JavaDslMarker.class) 11 | public class JavaDslBuilder { 12 | int num = 4; 13 | 14 | //@DslField(name = "javaName", comment = "This is a java one") 15 | String name = ""; 16 | 17 | Function0 function = () -> null; 18 | 19 | //@DslField(name = "functionOne", comment = "This is a java one") 20 | Function0 function1 = new Function0() { 21 | @Override 22 | public Unit invoke() { 23 | return null; 24 | } 25 | }; 26 | 27 | static void javaDslBuild(Function1 block) { 28 | JavaDslBuilder dsl = new JavaDslBuilder(); 29 | block.invoke(dsl); 30 | dsl.function.invoke(); 31 | dsl.function1.invoke(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/JavaDslMarker.java: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools; 2 | 3 | import kotlin.DslMarker; 4 | 5 | @DslMarker 6 | public @interface JavaDslMarker { 7 | 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/Linting.java: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools; 2 | 3 | import android.os.CountDownTimer; 4 | import android.util.Log; 5 | 6 | import com.programmersbox.funutils.cards.Card; 7 | import com.programmersbox.funutils.cards.Deck; 8 | import com.programmersbox.helpfulutils.DeviceInfo; 9 | import com.programmersbox.helpfulutils.EasyCountDownTimer; 10 | import com.programmersbox.loggingutils.Loged; 11 | 12 | class Linting { 13 | void test() { 14 | Log.w("Hello", "World"); 15 | Log.wtf("Hello", "World"); 16 | Log.i("Hello", "World"); 17 | Log.v("Hello", "World"); 18 | Log.e("Hello", "World"); 19 | Log.d("Hello", "World"); 20 | 21 | Loged.w("World", "Hello"); 22 | Loged.a("World", "Hello", true); 23 | Loged.i("World", "Hello", true, true); 24 | Loged.v("World", "Hello", true, true); 25 | Loged.e("World"); 26 | Loged.d(); 27 | Loged.wtf("World", "Hello", true, true); 28 | Loged.r("World", "Hello", true, true, 2, 3, 4, 5, 6, 7); 29 | } 30 | 31 | void test2() { 32 | Log.d("Gson", new DeviceInfo.Info().toString()); 33 | Loged.d(new DeviceInfo.Info(), "Gson", true, true); 34 | } 35 | 36 | void test3() { 37 | CountDownTimer timer = EasyCountDownTimer.invoke(1000L, () -> { 38 | System.out.println("Finished"); 39 | return null; 40 | }); 41 | 42 | Deck deck = Deck.defaultDeck(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/MoreActivity.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools 2 | 3 | import android.os.Bundle 4 | import android.widget.Button 5 | import android.widget.Toast 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.programmersbox.flowutils.clicks 8 | import com.programmersbox.flowutils.collectOnUi 9 | import com.programmersbox.funutils.funutilities.SequenceListener 10 | import com.programmersbox.funutils.funutilities.SequenceMaker 11 | import com.programmersbox.funutils.funutilities.TimedSequenceMaker 12 | import kotlinx.android.synthetic.main.activity_more.* 13 | import kotlinx.coroutines.flow.map 14 | 15 | class MoreActivity : AppCompatActivity() { 16 | 17 | private val sequenceList = listOf(Directions.UP, Directions.DOWN, Directions.LEFT, Directions.RIGHT) 18 | private val achieved = { Toast.makeText(this, "You did it!", Toast.LENGTH_SHORT).show() } 19 | private val sequenceReset = { Toast.makeText(this, "Sequenced Reset", Toast.LENGTH_SHORT).show() } 20 | 21 | private val sequenceMaker = SequenceMaker(sequenceList, object : SequenceListener { 22 | override fun onAchieved() = achieved() 23 | override fun onReset() = sequenceReset() 24 | }) 25 | private val timedSequenceMaker = TimedSequenceMaker(sequenceList, 2000, object : SequenceListener { 26 | override fun onAchieved() = achieved() 27 | override fun onReset() = sequenceReset() 28 | }) 29 | 30 | private var sequence: SequenceMaker? = null 31 | 32 | override fun onCreate(savedInstanceState: Bundle?) { 33 | super.onCreate(savedInstanceState) 34 | setContentView(R.layout.activity_more) 35 | 36 | useSequence 37 | .clicks() 38 | .map { sequence = sequenceMaker } 39 | .collectOnUi { sequence?.resetSequence() } 40 | 41 | useTimed 42 | .clicks() 43 | .map { sequence = timedSequenceMaker } 44 | .collectOnUi { sequence?.resetSequence() } 45 | 46 | resetSequence 47 | .clicks() 48 | .collectOnUi { sequence?.resetSequence() } 49 | 50 | arrowSetup( 51 | upArrow to Directions.UP, 52 | downArrow to Directions.DOWN, 53 | leftArrow to Directions.LEFT, 54 | rightArrow to Directions.RIGHT 55 | ) 56 | 57 | } 58 | 59 | private fun arrowSetup(vararg pairs: Pair) = 60 | pairs.forEach { pair -> pair.first.clicks().collectOnUi { nextItem(pair.second) } } 61 | 62 | private fun nextItem(directions: Directions) = sequence?.add(directions) ?: Unit 63 | 64 | enum class Directions { UP, DOWN, LEFT, RIGHT } 65 | 66 | } -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/TestApp.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools 2 | 3 | import android.app.Application 4 | import com.programmersbox.helpfulutils.createNotificationChannel 5 | import com.programmersbox.helpfulutils.createNotificationGroup 6 | import com.programmersbox.helpfulutils.defaultSharedPrefName 7 | import com.programmersbox.loggingutils.LogLevel 8 | import com.programmersbox.loggingutils.Loged 9 | import com.programmersbox.loggingutils.LogedInterceptor 10 | 11 | class TestApp : Application() { 12 | 13 | override fun onCreate() { 14 | super.onCreate() 15 | Loged.FILTER_BY_PACKAGE_NAME = "com.programmersbox.helpfultools" 16 | Loged.TAG = "HelpfulTools" 17 | Loged.logedInterceptor = Interceptor() 18 | defaultSharedPrefName = "DefaultPrefNameTest" 19 | createNotificationChannel("testChannel") 20 | createNotificationGroup("testGroup") 21 | } 22 | 23 | } 24 | 25 | class Interceptor : LogedInterceptor { 26 | override fun log(level: LogLevel, tag: String, msg: String) { 27 | println("${level.name[0]}/$tag/$msg") 28 | } 29 | } -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/TypeToGo.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools 2 | 3 | import com.programmersbox.helpfultools.broadcast.BroadcastActivity 4 | import com.programmersbox.helpfultools.contextutility.ContextActivity 5 | 6 | enum class TypeToGo(val text: String, val clazz: Class<*>) { 7 | BLACKJACK("Sequence Maker", MoreActivity::class.java), 8 | BROADCAST("Broadcast Receivers", BroadcastActivity::class.java), 9 | CONTEXT("Context Utils", ContextActivity::class.java) 10 | } -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/broadcast/BroadcastActivity.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools.broadcast 2 | 3 | import android.annotation.SuppressLint 4 | import android.content.BroadcastReceiver 5 | import android.os.Bundle 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.programmersbox.flowutils.FlowItem 8 | import com.programmersbox.flowutils.collectOnUi 9 | import com.programmersbox.flowutils.plusAssign 10 | import com.programmersbox.helpfultools.R 11 | import com.programmersbox.helpfulutils.* 12 | import kotlinx.android.synthetic.main.activity_broadcast.* 13 | import kotlinx.coroutines.flow.combine 14 | import java.text.SimpleDateFormat 15 | import java.util.* 16 | 17 | class BroadcastActivity : AppCompatActivity() { 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | setContentView(R.layout.activity_broadcast) 22 | setTimeTick() 23 | setBatteryReceiver() 24 | setScreenReceiver() 25 | } 26 | 27 | private fun setTimeTick() { 28 | var timeTimer: BroadcastReceiver? = null 29 | timeReceiver.setOnClickListener { 30 | timeTimer = timeTick { _, _ -> 31 | runOnUiThread { timeTickText.text = SimpleDateFormat("h:mm a", Locale.getDefault()).format(System.currentTimeMillis()) } 32 | } 33 | } 34 | 35 | untimeReceiver.setOnClickListener { timeTimer?.let(this::unregisterReceiver) } 36 | } 37 | 38 | private fun setBatteryReceiver() { 39 | var battery: BroadcastReceiver? = null 40 | batteryReceiver.setOnClickListener { battery = battery { runOnUiThread { batteryText.text = it.toString() } } } 41 | unbatteryReceiver.setOnClickListener { battery?.let(this::unregisterReceiver) } 42 | } 43 | 44 | @SuppressLint("SetTextI18n") 45 | private fun setScreenReceiver() { 46 | var screenState: BroadcastReceiver? = null 47 | var screenOn: BroadcastReceiver? = null 48 | var screenOff: BroadcastReceiver? = null 49 | 50 | val screenOnFlow = FlowItem(0) 51 | val screenOffFlow = FlowItem(0) 52 | 53 | combine(screenOnFlow.flow, screenOffFlow.flow) { on, off -> on to off } 54 | .collectOnUi { screenText.text = "Screen On: ${it.first} | Screen Off: ${it.second}" } 55 | 56 | screenReceiver.setOnClickListener { 57 | screenOn = screenOn { _, _ -> screenOnFlow += 1 } 58 | screenOff = screenOff { _, _ -> screenOffFlow += 1 } 59 | screenState = screenState { 60 | when (it) { 61 | ScreenState.ON -> screenOnFlow += 1 62 | ScreenState.OFF -> screenOffFlow += 1 63 | ScreenState.UNKNOWN -> Unit 64 | } 65 | } 66 | } 67 | unscreenReceiver.setOnClickListener { 68 | screenOn?.let(this::unregisterReceiver) 69 | screenOff?.let(this::unregisterReceiver) 70 | screenState?.let(this::unregisterReceiver) 71 | } 72 | } 73 | 74 | } -------------------------------------------------------------------------------- /app/src/main/java/com/programmersbox/helpfultools/contextutility/ContextActivity.kt: -------------------------------------------------------------------------------- 1 | package com.programmersbox.helpfultools.contextutility 2 | 3 | import android.content.BroadcastReceiver 4 | import android.content.Context 5 | import android.content.Intent 6 | import android.os.Bundle 7 | import androidx.appcompat.app.AppCompatActivity 8 | import androidx.core.app.RemoteInput 9 | import com.programmersbox.gsonutils.sharedPrefObjectDelegate 10 | import com.programmersbox.helpfultools.R 11 | import com.programmersbox.helpfultools.randomNumber 12 | import com.programmersbox.helpfulutils.Battery 13 | import com.programmersbox.helpfulutils.NotificationDslBuilder 14 | import com.programmersbox.helpfulutils.batteryInfo 15 | import com.programmersbox.helpfulutils.notificationManager 16 | import com.programmersbox.loggingutils.Loged 17 | import com.programmersbox.loggingutils.f 18 | import kotlinx.android.synthetic.main.activity_context.* 19 | 20 | class ContextActivity : AppCompatActivity() { 21 | 22 | private var batteryInformation: Battery? by sharedPrefObjectDelegate() 23 | 24 | override fun onCreate(savedInstanceState: Bundle?) { 25 | super.onCreate(savedInstanceState) 26 | setContentView(R.layout.activity_context) 27 | 28 | println("Random Number is: $randomNumber") 29 | 30 | println(batteryInformation) 31 | batteryInformation = batteryInfo 32 | println(batteryInformation) 33 | 34 | notificationSetup() 35 | 36 | } 37 | 38 | private fun notificationSetup() { 39 | notificationSend.setOnClickListener { 40 | notificationManager.notify(34, NotificationDslBuilder.builder(this, channelId = "testChannel", smallIconId = R.mipmap.ic_launcher) { 41 | title = "Title" 42 | message = "Message" 43 | autoCancel = true 44 | addReplyAction { 45 | resultKey = "result" 46 | label = "label" 47 | actionTitle = "Action Title" 48 | actionIcon = R.mipmap.ic_launcher 49 | pendingActionIntent(ReplyService::class.java) 50 | } 51 | bigTextStyle { 52 | summaryText = "Summary" 53 | contentTitle = "Content Title" 54 | bigText = "Big Text" 55 | } 56 | }) 57 | } 58 | } 59 | 60 | } 61 | 62 | class ReplyService : BroadcastReceiver() { 63 | override fun onReceive(context: Context?, intent: Intent?) { 64 | RemoteInput.getResultsFromIntent(intent)?.getCharSequence("result")?.let { Loged.f(it) } 65 | context?.notificationManager?.cancel(34) 66 | } 67 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_context.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |