Lifecycle-aware library to show fully customizable snacks.
Inspired by Cicerone and Surf-Navigation.
// TODO
The main idea is to use fragments as snacks. In that way a user of this library has full controll of creating, rendering, showing and hiding snacks.
Create SnackController
class App: Application() {
val snackController = SnackController.create(this)
}
Create a fragment file which you want to use as a snack
class ExampleSnackFragment: Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_snack_example, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// TODO extract your data from arguments here
}
}
Create a snack class and implement Snack
interface
data class ExampleSnack(val text: String): Snack {
override val containerId: Int = android.R.id.content
override val timeoutMs: Long = 1500L
override val animations: Animations = FromBottomToBottomAnimations
override val className: String = "ru.sharipov.example.ExampleSnackFragment"
override val tag: String = "ExampleSnackFragment $text"
override fun prepareBundle(bundle: Bundle) {
bundle.putString(SNACK_TEXT_ARGS, text)
}
companion object {
const val SNACK_TEXT_ARGS = "SNACK_TEXT_ARGS"
}
}
Show and hide snack
val snack = ExampleSnack(text = "Some useful information for the user here")
snackController.open(snack)
//snackController.close(snack)
- Use custom
containerId
if you want snacks to appear in some particular container - Set
timeoutMs
field as null if you don't want your snacks to hide automatically - Be sure to keep tags unique throughout all snacks, especially if they appear on the screen at the same time
- Check out the
example
module to see more examples of usage - You can override
animations
field if you want something extraordinary ;) - You can pass custom fragment factory to SnackNavigationLifecycleCallbacks if you want to gain full access over fragment creation
1. Migrate to FragmentFactory for fragment creation instead of using reflection.
2. Implement snack queue and config with strategies of adding snacks to queue when the navigator is not able to show them, drop oldest or even show only last added.
3. Add tests.
4. Add documentation.
5. More examples.
6. Deploy artefacts to have the ability of using the library with the gradle.
Top snack with fade animations
Screenrecorder-2022-03-27-15-53-55-359.mp4
Bottom snack with slide animations
Screenrecorder-2022-03-27-15-54-00-556.mp4
Complicated snack
It has it's own state, no timeout and it is shown in custom container