Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
Finally! Splitties 3.0.0 is there, and it's ready to keep iterating.
The last 2.x version, the 2.1.1 dates back from 2018-11-25, close to 3 years ago. Why did it take so long to have version 3.0.0?
Let's say making a multi-modules, multiplatform library isn't full of easy and straightforward steps. A blog post (my first!) will be published later to share that experience from start to now. Feel free to click follow on blog.louiscad.com, or on Twitter to know when the story is published.
I'll also share a roadmap for Splitties there, which I hope will get you excited for your future endeavors.
Let's get into the actual content of this release:
In case you missed it, Splitties now has a website, happily powered by Material for MKDocs. The address is splitties.louiscad.com.
The main page shows a better overview of what Splitties is about, and its content. It should be helpful for newcomers.
The setup info for each module is now upfront in their respective doc pages, be it on the website, or on GitHub, and they have been updated to recommend using the dependency notations from refreshVersions, which will also help you update Splitties, along with other libraries, and all that in less time.
Full disclosure: I am working on refreshVersions myself, in close collaboration with its author, Jean-Michel Fayard. I use it, and I totally recommend it for all Gradle projects. Splitties is using it of course.
The hasFlag
, withFlag
, and minusFlag
extensions for unsigned integers (UByte
, UShort
, UInt
, and ULong
) are no longer annotated with the @ExperimentalUnsignedTypes
annotation.
There's a new DataStorePreferences
class for the Android side, which you can use as a substitute of the Preferences
class. If you were already using SuspendPrefsAccessor
, that's all you need to change.
This AndroidX DataStore backed implementation should remove the risks of your app and their users being affected by the potential performance issues of Android platform's SharedPreferences
.
Be sure to check out the updated docs!
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
The AppCtxInitializer
class is now public, so you can put it in the list of dependencies of your own AndroidX App Startup Initializer in case it relies on appCtx
to be initialized.
In 3.0.0-rc02, changes in styledColorSL
made it break when the theme attribute was pointing to a color resource that had no selector (i.e. a non inlined plain color code like #00bbff
). This has now been fixed, and the code also got simpler.
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
By resolving a subtle issue that could break IDE preview, the version 3.0.0-alpha07 of Splitties also broke the styledColor
function and some other in come cases. If you had a color theme attribute and had a theme that was setting its value, pointing to another color resource, you'd be in luck. However, if the color value was set inline, right into the theme, it'd crash (as you can see in this issue). This release fixes this kind of problem for all the
affected functions:
styledColor
styledColorSL
styledDimen
styledDimenPxSize
styledDimenPxOffset
styledBool
styledInt
styledTxt
styledStr
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
This release removes previously deprecated code.
Make sure you don't have transitive dependencies that relied on deprecated code from a previous release of Splitties! If that's the case, you'll see the host app crash at runtime.
The "Init provider" split has been removed and is no longer published starting with this release.
You can find if you are using it by searching for its maven coordinates:
com.louiscad.splitties:splitties-initprovider
(the "Find in Path" IDE option can help you locate it).
If you used it, you'll need to move to AndroidX App Startup.
All the other previously deprecated symbols at hidden level have been removed. This completes the deprecation cycle for the upcoming Splitties 3.0.0 release.
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
This release is advancing deprecation cycles further before the upcoming 3.0.0 release.
All previously deprecated symbols were either removed, or hidden:
- Error → Hidden
- Hidden → Removed
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
This release is advancing deprecation cycles before the upcoming 3.0.0 release.
All previously deprecated symbols were either removed, or moved one step closer to it:
- Warning → Error
- Error → Hidden
- Hidden → Removed
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
Fix iOS/multiplatform publication (see issue #280).
Compiled with Kotlin 1.5.21 and kotlinx.coroutines 1.5.1-native-mt.
Other transitive dependencies have also been upgraded to the latest stable version.
It includes upgrades to various AndroidX libraries, Material Design Components 1.4.0, and Stetho 1.6.0.
This release is advancing deprecation cycles before the upcoming, long awaited 3.0.0 release.
The SendChannel.offerCatching
has been deprecated in favor of trySend
from kotlinx.coroutines 1.5+
The deprecation level of awaitCancellation()
has been raised from warning to error. Use the one from kotlinx.coroutines instead.
Dispatchers.MainAndroid
deprecation level has been raised from warning to error. Using Dispatchers.Main
is fine performance wise since kotlinx.coroutines 1.3.3.
The PotentialFutureAndroidXLifecycleKtxApi
annotation deprecation level was also raised to error.
The following symbols that were previously deprecated at error level are now hidden and will be removed in the next release:
Lifecycle.coroutineScope
Lifecycle.job
LifecycleOwner.lifecycleScope
MainDispatcherPerformanceIssueWorkaround
Raise the deprecation level of the implicit key delegates from warning to error.
Raise the deprecation level of Context.withStyledAttributes
to error.
Raise the deprecation level of ActionBar.showHomeAsUp
to error.
Compiled with Kotlin 1.4.32 and kotlinx.coroutines 1.4.3-native-mt.
This is the first release of Splitties that is published on MavenCentral! The maven coordinates are the same.
Also, there's now a documentation website on splitties.louiscad.com, check it out!
Add "calls in place exactly once" contracts for the lambdas of all the alertDialog
functions.
Add "calls in place exactly once" contracts for the lambdas of all the alertDialog
functions.
Fix rare crash that could happen when waiting for a button click if multiple ones were clicked simultaneously.
Now, only the first one to be considered clicked by the system will trigger, and the second one will be ignored.
Add "calls in place exactly once" contracts for the lambdas of all the materialAlertDialog
functions.
Replace the initializing ContentProvider
with AndroidX App Startup.
Deprecate awaitCancellation()
in favor of the one now included right into kotlinx.coroutines.
Introduce the whileStarted(Lifecyle)
extension function for Flow
to have a flow emit values only while the passed Lifecycle
is started.
Replace the initializing ContentProvider
with AndroidX App Startup.
Compiled with Kotlin 1.4.10 and kotlinx.coroutines 1.3.9-native-mt.
This release has multiplatform splits compatible with iOS, macOS and watchOS projects that use Kotlin/Native 1.4.0 and 1.4.10. Feedback is appreciated (Twitter, Kotlin's Slack, GitHub issues…).
watchOS support has been added to the following splits:
All CPU architectures are supported (arm32, arm64 & X86 for simulator).
Deprecated the transaction
and inTransaction
extension functions in favor of withTransaction
(Room KTX) and runInTransaction
(Room runtime) itself.
Now requires to opt-in to @ObsoleteContentProviderHack
.
This split will be deprecated once App Startup from AndroidX goes stable.
Deprecated symbols now have error level. Next release will remove them.
LifecycleOwner.coroutineScope
that was at error deprecation level. UseLifecycleOwner.lifecycleScope
from AndroidX instead.
Using this API now requires to opt-in to @UnreliableToastApi
so the developers acknowledge
the gotchas of android.widget.Toast
or use something else (like snackbars, banners or dialogs).
Add the following read/write extensions properties for View
:
startPadding
endPadding
leftPadding
rightPadding
The onClick
parameter changed from a crossinline
lambda to a View.OnClickListener
now
that Kotlin 1.4 brings SAM conversion for Kotlin functions taking SAM Java interfaces.
Usage should not change. Note that there is now an implicit it
parameter of type View
that
might break existing code if an outer it
was used in the onClick
lambda.
All lambdas in AndroidStyles
now have a contract. That allows you to initialize val
s declared in the outer scope.
- Only instantiate AppCompat version of Android widgets if the current theme inherits an AppCompat theme.
- All lambdas in
AppCompatStyles
now have a contract. That allows you to initializeval
s declared in the outer scope.
Add the missing AppCompat version of ToggleButton
.
- Only instantiate Material Components version of Android widgets if the current theme inherits a material theme.
- All lambdas in
MaterialComponentsStyles
now have a contract. That allows you to initializeval
s declared in the outer scope.
Add the following missing Material Components counterparts of Android widgets:
CheckBox
, RadioButton
, TextView
, AutoCompleteTextView
.
Compiled with Kotlin 1.3.72 and kotlinx.coroutines 1.3.8.
This release introduces 2 new splits:
- Alert Dialog Material (Android only) It is included in the "Android Material Components" fun pack. Thanks @ivoberger for the contribution!
- Coroutines (supports macOS, iOS, JS, JVM & Android) It is included in the "Android base" fun pack.
Add isCancellable
parameter (defaults to true
, as when unspecified) to alertDialog
builders.
viewModels { … }
forFragmentActivity
andFragment
activityViewModels { … }
forFragment
This split no longer depends on the androidx.lifecycle:lifecycle-extensions
artifact that has been deprecated in AndroidX Lifecycle 2.2.0 and is no longer published in later versions.
AndroidX Lifecycle KTX artifacts caught up with features that this split originally provided, so we've deprecated that overlap:
activityScope()
forActivity
->viewModels()
activityScope()
forFragment
->activityViewModels()
fragmentScope()
forFragment
->viewModels()
Also, we provided variants of these that took a lambda. Since AndroidX doesn't provide such a facility, they have been kept, but the old naming has been deprecated to match the AndroidX naming.
Note that these changes provide a ReplaceWith clause for easy migration.
Important: Next alpha release will move the deprecation level to error, and the alpha release after will remove them completely. (So it's best to not skip this update if you were using these extensions.)
forEachReversedWithIndex
extension for List
now has an allowSafeModifications
parameter.
When set to true
(default is false
), you can mutate the list as long as it doesn't prevent the
next iteration from happening (or that you perform a non local return to stop iterating altogether).
As usual, unsafe operations while iterating a list can result in a ConcurrentModificationException
or in an IndexOutOfBoundsException
to be thrown.
The dip
and dp
functions now return the type of their argument (Int
or Float
).
You'll need to migrate usages of the previous dp
function, so they pass a Float
. Use "Find in Path" in the IDE to find them before fixing. If you often passed the same value to dp
, the "Replace in Path" IDE option can save you even more time.
Lifecycle.isStartedFlow()
Lifecycle.isStartedFlow(timeout: Duration)
Lifecycle.isResumedFlow()
Lifecycle.isResumedFlow(timeout: Duration)
Lifecycle.stateFlow(): Flow<Lifecycle.State>
The following extension functions for Lifecycle
have been promoted to @ExperimentalSplittiesApi
(from @PotentialFutureAndroidXLifecycleKtxApi
):
createScope
createJob
awaitResumed
awaitStarted
awaitCreated
awaitState
Dispatchers.MainAndroid
is no longer needed and has been deprecated since the performance issue that affected Dispatchers.Main
has been fixed since kotlinx.coroutines 1.3.3
.
The following extension properties have been deprecated because they are now provided by AndroidX Lifecycle Runtime KTX:
Lifecycle.coroutineScope
LifecycleOwner.lifecycleScope
Lifecycle.job
has also been deprecated even though there's no as-concise replacement because it doesn't satisfy a common use case.
Now supports macOS, iOS and JS.
- Ensure all
TextView
s in the list items are at least one line tall, even if the text is empty. - Support enabled/disabled state by making child views duplicate parent state.
New ensureAllPermissions
function available in top-level and as extension for FragmentActivity
and Fragment
to request multiple permissions in a row and ensure you have them all granted.
- Now supports macOS and iOS (backed by
NSUserDefaults
, but supports custom implementation too, just like on Android). - Added
preferences
property toPrefDelegate
s. - Added
key
property toPrefDelegate
s. - Added
valueFlow()
function toPrefDelegate
s to get current value and changes of a pref field.
- The
availableAtDirectBoot
parameter has been renamed toandroidAvailableAtDirectBoot
. - The
XxxPref
classes (e.g.BoolPref
,StringPref
, etc.) are no longer inner classes but are now part of thePrefDelegate
sealed class hierarchy.
- New
resolveThemeAttribute
extension function forContext
. This is the replacement forwithStyledAttributes
.
withStyledAttributes
must be replaced by newresolveThemeAttribute
that also has an implementation that is working reliably in IDE Preview. It will be removed in a future release.
- The
snack
,longSnack
andsnackForever
extension functions now work with anyView
instead of justCoordinatorLayout
.
- Add
biometricManager
from API 29. - Add
roleManager
from API 29.
configActionBar
extension function forAppCompatActivity
.homeAsUp
extension read/write property forActionBar
.
ActionBar.showTitle
now supports reading current value.ActionBar.showHome
now supports reading current value.ActionBar.useLogo
now supports reading current value.ActionBar.showCustomView
now supports reading current value.
ActionBar.showHomeAsUp
has been deprecated and must be replaced byhomeAsUp
. It will be removed in a future release.
- Fix a very rare crash that would occur when performing two clicks or long clicks in a row (e.g. by calling
performClick
twice without a UI thread dispatch) when usingView.awaitOneClick()
,View.awaitOneLongClick()
orFloatingActionButton.showAndAwaitOneClickThenHide()
.
UiPreView
is now included by default, the extra "Views DSL IDE Preview" module is no longer needed. If you never use it in your production code, R8 should remove it from your release app. This has been done to simplify setup.- The
isInPreview
extension properties forUi
andView
allow you to condition content to show based on whether it's the actual app or the IDE preview. Note that it statically evaluates tofalse
in release builds (unlikeView.isInEditmode
), so the compiler will remove any code placed in the branch of anif (isInPreview)
condition, and will allow R8 to remove any code that was only used in IDE preview. - There's 2 new overloads of the
ViewGroup.add
extension functions that take either abeforeChild
or anafterChild
parameter. You must use the parameter name to call one of these overloads. It comes handy inViewGroup
s where the order of the childView
s matters (e.g.FrameLayout
andLinearLayout
). space
to create anandroid.widget.Space
from aUi
, aView
or aContext
reference. Thanks to @Miha-x64 for the contribution!
UiPreView
now shows known error cases in the preview itself with a red warning triangle icon.
- Add new extensions:
above
,below
,before
andafter
forConstraintLayout.LayoutParams
.
Add slider
, rangeSlider
and shapeableImageView
extensions for View
, Ui
and Context
. They can instantiate the new widgets from the version 1.2.0 of the material-components-android library.
This module has been deprecated. It will no longer published in future releases.
Its content has been moved to the main "Views DSL" split.
Compiled with Kotlin 1.3.31.
Handle empty grantResults
for permission request (#191).
Compiled with Kotlin 1.3.31.
This release introduces 3 new splits:
The most important change though, is how simpler integrating Splitties in your Android projects has become starting from this release, thanks to the new grouping artifacts.
See their content and their maven coordinates in the dedicated part of the README.
There is also new features and changes in existing splits, as detailed below.
The alert
functions have been deprecated in favor of a more accurate naming: alertDialog
.
These alertDialog
functions are now usable on Context
(vs previously only on Activity
), and they have optional parameters to specify the title, the message and even an icon (using a resource id or a Drawable
.
Also, the title
and the message
properties are now nullable, in respect to their accepted value.
The show
and showAsync
extension functions allow you to show a DialogFragment
without fearing the infamous IllegalStateException
if the state has already been saved, because it will wait for the lifecycle to be in the RESUMED state before showing the DialogFragment
.
These 2 extension functions are defined for FragmentManager
, FragmentActivity
and Fragment
.
show
is a suspending function that resumes after the lifecycle was resumed and the DialogFragment
was shown.
showAsync
is when you are outside of a coroutine but it is marked as experimental because it has "async" in its name while not returning a Deferred
. Feel free to suggest a better name in the issues or in the #splitties
channel of Kotlin's Slack.
New suspending inline extensions functions for Lifecycle
have been added for convenience:
awaitResumed
, awaitStarted
& awaitCreated
.
They can replace code like awaitState(Lifecycle.State.RESUMED)
for improved readability.
A new IconTwoLinesCheckBoxListItem
class has been added. What it does is self-explanatory.
Also, all the list items are now fully xml friendly.
The colorSL
and appColorSL
extension functions no longer return the nullable version of ColorStateList
.
All the ConstraintLayout.LayoutParams
extension functions now have overloads that allow specifying the margin.
For example, the following code:
centerHorizontally()
horizontalMargin = dip(16)
can now be written on one line: centerHorizontally(margin = dip(16))
.
That improves readability as the word "horizontal" is no longer repeated, and it is still explicit.
Two set-only extensions properties have been added for MaterialButton
:
iconResource
and iconTintAndTextColor
.
Compiled with Kotlin 1.3.21.
- The
wrapContent
andmatchParent
extensions forViewGroup
now apply forView
too. - Add
wrapInScrollView
andwrapInHorizontalScrollView
extension functions forView
. - Add experimental multiplatform support with initial Kotlin/JS support for the
Bit Flags
andCollections
splits.
- Rename
LifecycleOwner.coroutineScope
tolifecycleScope
. This change is binary compatible. - Make
wrapInRecyclerView
lambda inline. This change is not binary compatible.
- Remove contract in the
Intents
split that would cause compilation to fail when used.
Compiled with Kotlin 1.3.20.
This release introduces a new split: Views Coroutines.
- Added
radioGroup { ... }
functions in Views DSL. - Added first class support for
ConstraintLayout
barriers, guidelines and groups. - New
styledView
function for use when making an API for xml styles usage in Kotlin. See an example in AppCompatStyles. - The MaterialComponentsStyles class brings access to all the xml styles defined in Google's Material Components library for Android in a typesafe way.
- Add
materialCardView { ... }
functions in Views DSL Material. - Add
navigationView { ... }
functions in Views DSL Material. - Make
EditText
inputType typesafe with the set onlytype
extension property and theInputType
inline class. - Views DSL IDE Preview now supports
CoroutineContext
andCoroutineScope
as constructor parameters forUi
subclasses. - Added contracts for all the
lParams
functions from Views DSL and variants. Also added to theroomDb
function from Arch Room as well as theverticalListLayoutParams
andhorizontalListLayoutParams
functions from Views DSL RecyclerView. - Add support for unsigned numbers in Bit Flags (i.e.
UByte
,UShort
,UInt
andULong
).
- When using the
button
function from Views DSL,MaterialButton
is now automatically used in place ofAppCompatButton
if you also use Views DSL Material. - Make
mainHandler
async by default to avoid vSync delays. It is used forDispatchers.MainAndroid
, so it will result in speed improvements when using Lifecycle Coroutines. If you really need sync behavior, you can use the newmainHandlerSync
top level property instead. - Make
Dispatchers.MainAndroid
of typeMainCoroutineDispatcher
so theimmediate
property is available. - Make the
awaitState
function from Lifecycle Coroutines safe to use off the main thread, and document it. - Call
validate()
from thelParams { ... }
function forConstraintLayout
. - Make xml styles related classes inline again (thanks to compiler bug fixed in Kotlin 1.3.20).
- The reified generic variant of
view
from Views DSL is now an internal API. ViewFactory
and related symbols are now an internal API.- Mark some SystemServices as nullable to be instant app tolerant. That includes
WallpaperManager
,WifiManager
,WifiP2pManager
,UsbManager
,DevicePolicyManager
,FingerprintManager
,ShortcutManager
andWifiAwareManager
. - The Views DSL IDE Preview documentation now states that running the
compileDebugKotlin
gradle task is enough to update the preview. This is faster than a full build.
- Make
viewFactory
from Views DSL internal API compatible with IDE Preview.
- The
illegal
top level function from Exceptions has been deprecated in favor oferror
from Kotlin stdlib.
This release has the following new artifact:
"com.louiscad.splitties:splitties-views-coroutines:3.0.0-alpha03"
This release introduces a new split: Lifecycle Coroutines.
This release has the following new artifact:
"com.louiscad.splitties:splitties-lifecycle-coroutines:3.0.0-alpha02"
This release is compiled with Kotlin 1.3.11.
It is a breaking release (more details in the changes section), and the API is subject to changes as it is back to an alpha stage. APIs that are likely to change have an experimental annotation that triggers a warning (which can be removed by opt-in), to prevent you from using them unintentionally.
All the old support library artifacts have been replaced by AndroidX ones.
If your project has not migrated to AndroidX yet, please follow the quick steps below.
Migrating your project to AndroidX in a `fun` way. (Click to expand)
Theoretically, migrating a project to AndroidX is easy: you just select "Migrate to AndroidX" from the "Refactor" menu. Unfortunately, in addition to being unacceptably slow, it didn't work properly for Splitties (except for a past attempt which had to be abandoned for API stability reasons). Our experience was waiting minutes with an unresponsive IDE, then giving up with no other choice than force closing Android Studio, and finally getting a broken project, with some dangling fully qualified references (instead of proper import replacement). We reverted and looked for an alternative that would work properly, and perform faster.
The solution has been a Kotlin script that is a white box, and runs in a matter of seconds. You can
use it for your project too, so you can migrate to AndroidX quickly, and in a fun
way.
It is available here, and depends on this csv file.
Note that this script doesn't migrate the dependencies, because we changed the way we define
dependencies (using constants defined in buildSrc
), and it would have been harder to handle
all the edge cases, and doing it by hand with Replace in Path from IDE was quick enough for us.
If you prefer to have it, you are free to contribute and reach out in the issues or elsewhere.
To use it in your project, follow these simple steps:
- Replace the support libraries dependencies by AndroidX dependencies (and update Splitties ones if you already used it).
- Copy paste the two files linked above at the root of the gradle project.
- Edit the
expectedNumberOfModules
property defined in theAndroidX-migrator.gradle.kts
file to match the number of modules that your project has. - Make sure you have
kotlinc
1.3+ available (see easy installation in official docs here). - Open a terminal at the root of the gradle project.
- Run
kotlinc -script AndroidX-migrator.gradle.kts
and wait for completion. - Sync gradle project.
- Build the project to ensure everything has migrated properly, or fix and try again.
Now, you pass the Context
only once to the AndroidStyles
or AppCompatStyles
constructor,
and you no longer have to pass it to the subsequent functions call. It is advised to obviously
cache this instance to reduce boilerplate and avoid overhead. This is a breaking change.
The design support library no longer exists in AndroidX. It is replaced by several AndroidX artifacts and the Google Material Components library.
Consequently, the package names no longer reference "design" but "coordinatorlayout" and "material" instead.
As you can see below, the design support library dependent artifacts have been replaced. Note that Views DSL Material has a transitive dependency to Views DSL CoordinatorLayout, so you don't need to add an explicit dependency for the latter if you already use the former.
This release has the following new artifacts:
"com.louiscad.splitties:splitties-views-material:3.0.0-alpha01"
"com.louiscad.splitties:splitties-views-dsl-coordinatorlayout:3.0.0-alpha01"
"com.louiscad.splitties:splitties-views-dsl-material:3.0.0-alpha01"
This release removes these two artifacts:
"com.louiscad.splitties:splitties-views-design-styles:2.1.1"
"com.louiscad.splitties:splitties-views-dsl-design-styles:2.1.1"
This release is compiled with Kotlin 1.3.10.
- Enforce read-only in the
withExtras
extension function forActivity
. Any attempt to mutate a property inside it will result in anIllegalStateException
to be thrown, because this should be done inputExtras
instead. You can see more info in the updated KDoc of these functions. - Add a
withExtras
extension function forIntent
(previously only available forActivity
). - Add a
putExtras
extension function forActivity
(previously only available forIntent
). - Fix nullability warning in FragmentArgDelegate.
- Add KDoc to all public symbols from the Activities split.
- Add KDoc to all public symbols from the AlertDialog split.
- Add KDoc to all public symbols from the AlertDialog AppCompat split.
This release targets Android SDK 28, and splits depending on support libraries use version 28.0.0.
- System Services from API 28 are now included into the same named split.
- Update
ConfigChangesHandlingCollapsingToolbarLayout
from View DSL Design to be compatible with design support library version 28.0.0. - Update for nullability warnings brought by SDK 28.
This release targets Android SDK 27, and splits depending on support libraries use version 27.1.1.
- Room updated to version 1.1.1 in Arch Room.
- Lambdas of
onCreate
andonOpen
functions in Arch Room are nowcrossinline
. - The
LifecycleObserver
class is now marked as experimental.
This release breaks binary and source compatibility.
This is not just a compiler update for Splitties. This release already takes advantage of Kotlin 1.3 features, beyond stable coroutines:
- The
XmlStyle
class from Views DSL is now inline, for minimal footprint at runtime. SuspendPrefsAccessor
from Preferences is no longer experimental as coroutines graduated.- Functions that take a lambda in Views DSL (except
lParams
functions) have a contract. This directly translates to more freedom in your UI code as you can initialize a property later. withExtras
,putExtras
andwith
from Bundle have a contract. This allows to initialize local variables from contents of aBundle
passing through aBundleSpec
naturally!- Symbols that could change are marked as experimental, for less surprises in the future when they
are replaced, renamed or removed (still with a deprecation cycle whenever possible). Only
verticalListLayoutParams
andhorizontalListLayoutParams
extension functions forRecyclerView.LayoutManager
are experimental for now, but this could change, especially in alpha, or beta stage.
This release breaks binary and source compatibility.
It renames several package names and modules, for more consistency across the project.
View DSL has a new name: Views DSL. That also applies to its additional modules.
Just like an extra s
can make a new generation of smartphones, it can also make a new version of
Splitties.
The artifact names of all Selectable Views and View DSL changed, and so did the package names.
Consequently, after updating the artifact names and the version, you'll need to update the imports. Fortunately, this is easily done with the "Replace in Path" IDE option present in IntelliJ IDEA and Android Studio.
All you need to do is find an old import (import splitties.viewdsl.
), select it, select the
"Replace in Path" option paste (import splitties.views.dsl.
) in the second input field, and
validate.
Then, you just have to do the same for Selectable Views with import splitties.selectableviews.
and
import splitties.views.selectable.
… and voilà! You just migrated to latest Splitties version!
Here are all the artifacts added in this version. Just use the ones you need. (Click to expand)
implementation("com.louiscad.splitties:splitties-views-dsl:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-dsl-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-dsl-constraintlayout:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-dsl-design:$splitties_version")
debugImplementation("com.louiscad.splitties:splitties-views-dsl-ide-preview:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-dsl-recyclerview:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-selectable:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-selectable-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-selectable-constraintlayout:$splitties_version")
All the lines above assume you defined the splitties_version
ext property in your
root project's build.gradle
file to 2.0.0-alpha9
as shown in this snippet:
allProjects {
ext {
splitties_version = '2.0.0-alpha9'
}
}
This release removes all these artifacts:
implementation("com.louiscad.splitties:splitties-selectableviews:$splitties_version")
implementation("com.louiscad.splitties:splitties-selectableviews-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-selectableviews-constraintlayout:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-constraintlayout:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-design:$splitties_version")
debugImplementation("com.louiscad.splitties:splitties-viewdsl-ide-preview:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-recyclerview:$splitties_version")
This release breaks binary compatibility.
It removes all deprecated symbols that had their deprecation level raised to error in 2.0.0-alpha7.
Make sure you don't rely on any library that uses an old version of a Splitties artifact that relies on these previously deprecated and now removed symbols, or your app is likely not build, or to crash at runtime because of not found classes.
Raise all deprecated symbols deprecation level to error.
Use this version to make sure you don't use them in your projects, next version will remove them!
Version 2.0.0-alpha5 broke the API, this version fixes this.
This release is mostly the same as 2.0.0-alpha5, but also has 2 very important things:
- binary compatibility (minor change in Preferences experimental API excluded)
- source compatibility, except an overload resolution ambiguity in View DSL, see the migration guide for a smooth migration.
Version 2.0.0-alpha5 technically removed 2 splits (one was actually a renaming, the other one a merging).
Consequently, you have to make sure your dependencies no longer reference these removed artifacts. Easily done.
Problems arise when you depend on libraries that themselves depend on Splitties, which may be older versions. These libraries may bring transitive dependencies to old modules that will clash with ones from newer versions, and the versions they rely on may also mismatch with the ones you need, and these older versions will take precedence if they are in library modules of your project that don't depend explicitly on a newer version.
Fortunately, Gradle dependency resolution strategy allows to easily fix these issues all over your project.
All you need to do is to make sure you have the following snippet into your root project's
build.gradle
file:
allprojects {
ext {
splitties_version = '2.0.0-alpha6'
}
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def req = details.requested
if (req.group != "com.louiscad.splitties") return
if (req.name == "splitties-uithread") {
details.useTarget(
group: req.group,
name: "splitties-mainthread",
version: splitties_version
)
details.because("Splitties uithread has been renamed to mainthread")
} else if (req.name == "splitties-viewdsl-appcompat-styles") {
details.useTarget(
group: req.group,
name: "splitties-viewdsl-appcompat",
version: splitties_version
)
details.because("[Splitties] Split merged and removed")
} else {
details.useTarget(group: req.group, name: req.name, version: splitties_version)
details.because("Transitive dependencies could take precedence otherwise")
}
}
}
}
The snippet above, for all sub-projects (aka. modules):
- defines Splitties version in an
ext
property so it can be used in allbuild.gradle
files. - sets a resolution strategy for all configurations (like
implementation
orapi
) which: - redirects any usage of the old
splitties-mainthread
artifact to the newsplitties-mainthread
one. - redirects any usage of the old
splitties-viewdsl-appcompat-styles
artifact to the one it has been merged into:splitties-viewdsl-appcompat
. - makes sure all splitties artifacts versions are in sync, across all sub-projects.
If you don't do this but have a library using an old artifact in your dependencies, you'll encounter gradle sync issues, or runtime issues, and the real cause may not appear clearly (because of bugs in tooling).
uiLazy
has been deprecated in favor of mainThreadLazy
.
The wrapInRecyclerView
extension function now accepts an optional lambda to configure the wrapping
RecyclerView
easily.
This release is breaking if you come from version 2.0.0-alpha4, especially if you were using View DSL. It's highly recommended to directly migrate from version 2.0.0-alpha4 to 2.0.0-alpha6, which has a smoother migration path, and a guide to do so.
- Add consumer proguard rules for splits with optional dependencies.
- Update to Kotlin 1.2.71
- Update kotlinx.coroutines to version 0.30.2
Add allocation-free reverse List
forEach extensions: forEachReversedByIndex
and
forEachReversedWithIndex
.
Add toPendingActivities()
extension function for Array<Intent>
.
- The following previously deprecated classes have been removed:
SingleLineIconListItem
(useIconOneLineListItem
instead)TwoLinesIconListItem
(useIconTwoLinesListItem
instead)TwoLinesIconSwitchListItem
(useIconTwoLinesSwitchListItem
instead)
- All the xml files (except
view_ids.xml
) have been removed.
- The preferences are now loaded in
Dispatchers.IO
when usingSuspendPrefsAccessor
. - Fix clash with private property name and non imported extension for Preferences. (#96).
The SuspendPrefsAccessor
constructor parameter of type CoroutineDispatcher
has been removed
now that Dispatchers.IO
is always used.
If you didn't specify a custom dispatcher, you don't need to do anything.
All the final methods have been opened up, and now have the @CallSuper
annotation instead. This
makes the classes more useful to develop custom views, like the extended Floating Action Button with
SelectableConstraintLayout
where you need to clip the view in onDraw(…)
.
The dispatchDrawableHotspotChanged
overridden method in the classes of the Selectable Views splits
family was annotated with @TargetApi
, but is not correctly annotated with @RequiresApi
. This
likely caused no issue as you usually don't call this method directly but let Android do, but now,
it's fixed!
The UI Thread split has been renamed to Main thread (for the same reasons kotlinx.coroutines
replaced UI
by Dispatchers.Main
).
While the artifact has been changed, the old symbols have only been deprecated in favor of new
ones defined in new package, with new names (ui
->main
).
If you use a library that depends on the old artifact, see "Removed splits and versions sync" in version 2.0.0-alpha6 release notes.
The API of View DSL (and its additional modules) has been improved, and there's some new features, along with some deprecations.
However, this release (2.0.0-alpha5) is breaking when updating from previous versions. This has been fixed in 2.0.0-alpha6, so please skip this release if you are upgrading, and follow thoroughly the migration guide.
Regardless, there has been improvements in View DSL additional modules. Please, review them below.
The View DSL AppCompat Styles split has been merged into View DSL AppCompat.
If you use a library that depends on the old artifact, see "Removed splits and versions sync" in version 2.0.0-alpha6 release notes.
Probably the best change in this split is that now, you no longer need to specify any View
id.
If there's none and you add a constraint using extension functions from this split, an id that can't
clash with aapt/xml ids will be generated and assigned to the view so constraints work. Keep in mind
you may still want to use stable ids defined in xml or elsewhere in cases where you use views that
need to have their state saved, like a RecyclerView
, an EditText
or a CheckBox
.
Added support for chains with the two horizontalChain
and verticalChain
new extension functions
for ConstraintLayout
. Also added horizontalMargin
and verticalMargin
extension properties for
List<View>
that are designed for use in a ConstraintLayout
when you made a chain with the two
new methods that take a list of views.
When instantiating an AppBarLayout
or a CollapsingToolbarLayout
with the new appBarLayout
and
collapsingToolbarLayout
functions, you'll automatically get instances that have known bugs in the
design support library fixed, including config changes handling (supports rotation or layout changes
without recreating the Activity).
The setSingleView
extension function for RecyclerView
has been deprecated. Use the
wrapInRecyclerView
extension function for View
instead, it is simpler to use and supports
horizontal scrolling.
- Deprecated View visibility extension properties and functions in favor of Android KTX ones.
- Added
lines
write only extension property forTextView
. - Change the signature of the lambda of the
onClick
extension function forView
. It no longer passes the clickedview
. This is to avoidit
shadowing when you nest lambdas, and has been done because this parameter is almost never used. - Add 1 extension function, 1 extension property and 1 top level function, related to
View
id generation:View.assignAndGetGeneratedId()
,View.existingOrNewId
andgenerateViewId()
.
The sample of Splitties is a place where you can preview several extensions or other work that can be integrated into Splitties as a library later.
In addition to what was already present in the sample, there has been an important addition: An example of how to request a dangerous permission with a single suspend call, plus a try/catch to handle user deny.
This release has a new artifact:
implementation("com.louiscad.splitties:splitties-mainthread:$splitties_version")
This release removes these two artifacts:
implementation("com.louiscad.splitties:splitties-uithread:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-appcompat-styles:$splitties_version")
- Provide
ReplaceWith
migrations foradd
methods deprecated in version 2.0.0-alpha2. - Add default empty lambda for
startActivity(action: String…)
methods. - Compiled with Kotlin 1.2.51
There are 2 new methods: bundleOrDefault(…)
and bundleOrElse { … }
to allow default values in
BundleSpec
delegated properties.
Like for BundleSpec
, there are 2 new methods: argOrDefault(…)
and argOrElse { … }
to allow
default values in Fragment
delegated argument properties.
- The delegates previously returned by
bundle()
andbundleOrNull()
are no longer part of the public API and have been replaced by theReadWriteProperty
interface.
- The
arg()
andargOrNull()
functions have moved out of thesupport
subpackage as there's no longer any ambiguity since platform Fragments are deprecated and going away. Auto-import should import the versions from the new package for you. - The delegates previously returned by
arg()
andargOrNull()
are no longer part of the public API and have been replaced by theReadWriteProperty
interface.
- Activities: Start activities with minimal boilerplate
- Collections:
forEach
forList
s withoutIterator
allocation - Fragments: Start activities from fragments and do transactions with minimal boilerplate
- Intents: Transform
companion object
s into powerful typesafe intent specs - Material Colors: 2014 Material Design color palettes as color resources
- View DSL RecyclerView: RecyclerView extension of View DSL
- Views CardView: CardView extension of Views. Provides a
contentPadding
property - View Design: Design Support library extension of Views
- Views RecyclerView: RecyclerView extension of Views
The consume { … }
utility function from the splitties.init
package has been deprecated. Replace
it with true.also { _ -> … }
or false.also { _ -> … }
.
- New
mapNotNull
,switchMap
andswitchMapNotNull
extension functions forLiveData
. activityScope
andfragmentScope
extension functions to get aViewModel
now accept an optional lambda (which creates aViewModelProvider
under the hood. This allows to pass arguments to yourViewModel
when it's first created.observe
andobserveNotNull
now return the createdObserver
so it can be unregistered manually later if needed.
- The new
inTransaction { … }
extension function forRoomDatabase
s does the same astransaction { … }
but also returns the value of the last expression of the lambda. - New
onCreate { … }
andonOpen { … }
extension functions forRoomDatabase.Builder
.
BundleHelper
has been renamed toBundleSpec
, but a typealias keeps the source compatibility. However, there's no binary compatibility, which means you'll need to recompile any library using it.BundleSpec
and the methods relying on it can now be used safely on any thread!
Allow disabling default icon tint on list items with optional constructor parameter.
A new experimental SuspendPrefsAccessor
for coroutines users allows you to ensure you can't load
the preferences (which does I/O) on the UI thread.
The str
extension functions formatArgs
now accept null
arguments.
The higher order function add
has been deprecated because it went in the way of promoting a view
to a property easily.
Added flatButton
, imgActionButton
and largeProgressBar
.
Add baselineToBaselineOf(…)
extension function for ConstraintLayout.LayoutParams
.
UiPreView
injects a valid value into appCtx
so your Ui
s can depend on it (probably indirectly)
without breaking preview!
- New Gravity flags aliases (e.g.
gravityStartCenter
instead ofGravity.START or Gravity.CENTER_VERTICAL
). - Change case of
imageBitMap
toimageBitmap
to make it more consistent with the class nameBitmap
tooltipTxt
now accepts null to remove any tooltip previously set on the view.
Here are all the artifacts added in this version. Just use the ones you need. (Click to expand)
implementation("com.louiscad.splitties:splitties-activities:$splitties_version")
implementation("com.louiscad.splitties:splitties-collections:$splitties_version")
implementation("com.louiscad.splitties:splitties-fragments:$splitties_version")
implementation("com.louiscad.splitties:splitties-intents:$splitties_version")
implementation("com.louiscad.splitties:splitties-material-colors:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-recyclerview:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-cardview:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-design:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-recyclerview:$splitties_version")
All the lines above assume you defined the splitties_version
ext property in your
root project's build.gradle
file to 2.0.0-alpha2
as shown in this snippet:
allProjects {
ext {
splitties_version = '2.0.0-alpha2'
}
}
- Alert Dialog: Create simple alert dialogs with simple code
- Alert Dialog AppCompat: AppCompat version of Alert Dialog
- Arch Lifecycle: Extensions to get
ViewModel
s, useLiveData
and observeLifecycle
s - Arch Room: Room helpers to instantiate your DB and perform transactions in Kotlin
- Bit Flags:
hasFlag
,withFlag
andminusFlag
extensions onLong
,Int
,Short
andByte
- Bundle:
BundleHelper
to useBundle
with property syntax forIntent
extras and more - Dimensions: Android
dp
extensions forView
andContext
. Particularly handy when using View DSL - Exceptions:
illegal(…)
and similar functions that returnNothing
, handy for impossible or illegalwhen
branches - Fragment Args: Fragment arguments without ceremony thanks to delegated properties
- Init Provider: Base class for
ContentProvider
s used for automatic initialization purposes - Main Handler: Top-level
mainHandler
property to stop allocating multipleHandler
s for mainLooper
- Resources: Extensions to get resources like strings, colors or drawables easily, with support for themed attributes
- Selectable Views AppCompat: Selectable Views for AppCompatTextView
- Selectable Views ConstraintLayout: Selectable Views for ConstraintLayout
- Snackbar: Grab a snack without ceremony with
snack(…)
andlongSnack(…)
- System Services: No more
context.getSystemService(NAME_OF_SERVICE) as NameOfManager
- Toast: Show a toast by just calling
toast(yourText)
, and dodge API 25BadTokenException
- UI Thread: Properties related to Android UI thread, and
checkUiThread()
precondition checker - View DSL: Create UIs with readable Kotlin code
- View DSL AppCompat: AppCompat extension of View DSL
- View DSL AppCompat styles: AppCompat styles for View DSL
- View DSL ConstraintLayout: ConstraintLayout extension of View DSL
- View DSL Design: Design Support Library extension of View DSL
- View DSL IDE preview: Preview View DSL UIs in the IDE
- Views: Extensions function and properties on
View
s - Views AppCompat: AppCompat extension of Views. Includes helpers for
ImageView
tinting,ActionBar
and tooltip
- "Checked Lazy" replaces the "Concurrency" module.
- The groupId of the library changed from
xyz.louiscad.splitties
tocom.louiscad.splitties
. Check dependencies list below. - All previous modules migrated to Kotlin, excepted the
ViewHolder
class from the Typesafe RecyclerView module that can't be written in Kotlin at the moment due to hiding super fields not being supported. - App Context module has a new, memory leak safe
injectAsAppCtx()
method, that uses the newcanLeakMemory()
extension function onContext
that is also public. - Preferences
StringPref
andstringPref
don't allow null values anymore. UseStringOrNullPref
andstringOrNullPref
if you need nullable strings. Same forStringSetPref
andstringSetPref
. - The
isUiThread
property moved from the old "Concurrency" module to the "UI Thread" module. - Material Lists are now written in Kotlin with View DSL, fixing icon tinting support on day/night themes and behavior on long texts. Also, the naming has been improved. Old named items are now deprecated.
- Checked Lazy does no longer depend on Timber but is now more configurable, allowing to write reporting behavior if needed.
- Selectable Views has been split in base module (that includes only dependencies on Android platform), AppCompat module and ConstraintLayout module.
- Selectable Views don't support the
foreground
xml attribute from app namespace anymore, but there's a newforegroundSelector
property.
Here are all the artifacts added in this version. Just use the ones you need. (Click to expand)
implementation("com.louiscad.splitties:splitties-alertdialog:$splitties_version")
implementation("com.louiscad.splitties:splitties-alertdialog-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-appctx:$splitties_version")
implementation("com.louiscad.splitties:splitties-arch-lifecycle:$splitties_version")
implementation("com.louiscad.splitties:splitties-arch-room:$splitties_version")
implementation("com.louiscad.splitties:splitties-bitflags:$splitties_version")
implementation("com.louiscad.splitties:splitties-bundle:$splitties_version")
implementation("com.louiscad.splitties:splitties-checkedlazy:$splitties_version")
implementation("com.louiscad.splitties:splitties-dimensions:$splitties_version")
implementation("com.louiscad.splitties:splitties-exceptions:$splitties_version")
implementation("com.louiscad.splitties:splitties-initprovider:$splitties_version")
implementation("com.louiscad.splitties:splitties-mainhandler:$splitties_version")
implementation("com.louiscad.splitties:splitties-material-lists:$splitties_version")
implementation("com.louiscad.splitties:splitties-preferences:$splitties_version")
implementation("com.louiscad.splitties:splitties-resources:$splitties_version")
implementation("com.louiscad.splitties:splitties-fragmentargs:$splitties_version")
implementation("com.louiscad.splitties:splitties-selectableviews:$splitties_version")
implementation("com.louiscad.splitties:splitties-selectableviews-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-selectableviews-constraintlayout:$splitties_version")
debugImplementation("com.louiscad.splitties:splitties-stetho-init:$splitties_version")
implementation("com.louiscad.splitties:splitties-systemservices:$splitties_version")
implementation("com.louiscad.splitties:splitties-toast:$splitties_version")
implementation("com.louiscad.splitties:splitties-typesaferecyclerview:$splitties_version")
implementation("com.louiscad.splitties:splitties-uithread:$splitties_version")
implementation("com.louiscad.splitties:splitties-snackbar:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-appcompat:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-appcompat-styles:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-constraintlayout:$splitties_version")
implementation("com.louiscad.splitties:splitties-viewdsl-design:$splitties_version")
debugImplementation("com.louiscad.splitties:splitties-viewdsl-ide-preview:$splitties_version")
implementation("com.louiscad.splitties:splitties-views:$splitties_version")
implementation("com.louiscad.splitties:splitties-views-appcompat:$splitties_version")
All the lines above assume you defined the splitties_version
ext property in your
root project's build.gradle
file to 2.0.0-alpha1
as show in this snippet:
allProjects {
ext {
splitties_version = '2.0.0-alpha1'
}
}
- App Context: Have a
Context
everywhere - Concurrency: Single thread
lazy
implementations, with reporting via Timber support - Material Lists: List Items for RecyclerView implementing Material Design Guidelines
- Preferences: Property syntax for Android's SharedPreferences
- Stetho init: Have Stetho without writing any code!
- Selectable Views replaces Selectable ViewGroups
- Selectable Views now has a
SelectableTextView
. Made to use it on simple, single-line list items. - Typesafe RecyclerView now depends on Kotlin
- Typesafe RecyclerView has a new
ItemViewHolder
helper class for simple but common use cases.
This version adds the setHost(Host host)
method in ViewWrapper.Binder
interface where Host
can
be any type you want you can use from the implementing item View to communicate with your Activity,
Fragment, Presenter, or whatever. Note this adds a third type parameter to the ViewWrapper
class,
and a second one for the ViewWrapper.Binder
class.
This version adds the setViewHolder(ViewWrapper holder)
method in ViewWrapper.Binder
interface
so list item View
s can now get a reference to their ViewHolder
, and call getAdapterPosition()
on it for example.
This is the first release of Splitties. It includes two independent modules:
- Typesafe RecyclerView
- Selectable ViewGroups
For gradle projects from jcenter()
repo:
compile 'xyz.louiscad.splitties:selectableviewgroups:1.0'
compile 'xyz.louiscad.splitties:typesaferecyclerview:1.0'