# KAU Kotlin Android Utils This library contains small helper functions used throughout almost all of my other projects. The goal is to make common interactions executable in a single line. # Features * [KPrefs](#kprefs) * [Changelog Xml](#changelog) * [Extensions](#extensions) ## KPrefs A typical SharedPreference contains items that look like so: ```Java class MyPrefs { public static final String TEXT_COLOR = "text_color"; private static SharedPreference prefs = ... public static void setTextColor(int color) { prefs.edit().putInt(TEXT_COLOR, color).apply(); } public static int getTextColor() { prefs.getInt(TEXT_COLOR, 0xff000000); } } ``` KPrefs greatly simplifies it by using Kotlin's object pattern and delegates to achieve the following: ```Kotlin object KPrefSample : KPref() { var textColor: Int by kpref("TEXT_COLOR", Color.WHITE) var bgColor: Int by kpref("BG_COLOR", Color.BLACK) var isFirstLaunch: Boolean by kpref("IS_FIRST_LAUNCH", true) ... } ``` By using `KPrefSample.textColor = Color.RED` or `textView.setTextColor(KPrefSample.textColor)` we can effectively set and save the value. The values are retrieved lazily and are only done so once; future retrievals will be done with a local value, and updating a preference will both save it in the SharedPreference and update it locally. The object inherits the initializer method `fun initialize(c: Context, preferenceName: String)`, which must be invoked (preferably in the Application class) before using a preference. There is also a `reset()` method to clear the local values and have them retrieve from the SharedPreference again ## Changelog XML Create an xml resource with the following structure: ```xml ``` And show it with `context.showChangelog(@XmlRes xmlRes: Int)` As mentioned, blank items will be ignored, so feel free to create a bunch of empty lines to facilitate updating the items in the future. ## Extension Functions > "[Extensions](https://kotlinlang.org/docs/reference/extensions.html) provides the ability to extend a class with new functionality without having to inherit from the class" ### AnimUtils > Extends View * Fade In/Fade Out/Circle Reveal with callbacks * Switch texts in a TextView with a fade transition ### ColorUtils > Extends Int * Check if color is dark or light * Check if color is visible against another color * Convert color to HSV (float[]) or hex (String) * Get the disabled color of a theme * Adjust alpha > Extends String * Parses color; adds onto the original parser by supporting #AAA values > Extends View * Various tinting for different views; taken from [MDTintHelper](https://github.com/afollestad/material-dialogs/blob/master/core/src/main/java/com/afollestad/materialdialogs/internal/MDTintHelper.java) ### ContextUtils > Extends Activity * Restart an activity > Extends Context * Create a toast directly * Get resource values through `.color(id)`, `.dimen(id)`, `.drawable(id)`, `.integer(id)`, `.string(id)` * Get attribute values through resolve methods * Show a Changelog by parsing an xml resource * Check if network is available ### FragmentUtils > Extends Fragment * Directly put extras into a fragment; if a bundle does not exist, it will be created ### IIconUtils > Extends [IIcon](https://github.com/mikepenz/Android-Iconics) * toDrawable method that only requires a context; defaults to a white icon of size 24dp and uses a ColorStateList to allow for dimming ### Utils [Misc] > Extends Int * dpToPx & pxToDp conversions ### ViewUtils > Extends View * `visible()`, `invisible()`, `gone()`, `isVisible()`, `isInvisible()`, `isGone()` methods * matchParent method to set the layout params to match_parent * Create snackbar directly * Set IIcon into ImageView directly