Chris Banes Profile Banner
Chris Banes Profile
Chris Banes

@chrisbanes

47,391
Followers
319
Following
784
Media
9,747
Statuses

🇬🇧
Joined January 2009
Don't wanna be here? Send us removal request.
@chrisbanes
Chris Banes
2 years
Like a lot of the Android team yesterday, I resigned from @Twitter 🫡💙 Personally, I’m going to take a break and work out I want to do next. I just want to say thank you to all of the tweeps who made my time so great. #LoveWhereYouWorked Short 🧵 /1
73
165
3K
@chrisbanes
Chris Banes
2 years
@ScuderiaFerrari Your own race strategists?
15
18
2K
@chrisbanes
Chris Banes
3 years
At the end of next week, I'll be leaving my role @Android and @Google , and on to something new:
131
63
1K
@chrisbanes
Chris Banes
6 years
More MotionLayout explorations 🎆 This entire UI is orchestrated in MotionLayout, and (mostly) defined in 2 XML files. There is no CoordinatorLayout here. 🤯
24
245
1K
@chrisbanes
Chris Banes
7 years
This fragment transition has taken 2+ days of my life, but I think it the result is worth it 🕺🤸  #AndroidDev Code:
23
151
909
@chrisbanes
Chris Banes
3 years
My funemployment ended this week, as I've started as a Staff Software Engineer @Twitter , working on the Android Core UI team. Thanks for all of the kind words and messages which I received lately! 😁
80
14
893
@chrisbanes
Chris Banes
2 years
Hellllloooo fourth manager in a week.
18
15
869
@chrisbanes
Chris Banes
5 years
🤔 Have you ever wanted to animate the on-screen keyboard on Android? Well now you can in Android 11 DP2! 🎉 Check out our new sample showing you how. 👩‍💻:
14
174
826
@chrisbanes
Chris Banes
5 years
One of my favourite changes in #AndroidR is the revamp of the WindowInsets API For example, we now have way to detect when _and_ where the IME is visible on screen ⌨️📐
Tweet media one
34
194
768
@chrisbanes
Chris Banes
6 years
I'm having too much fun with MotionLayout 🕺 Same deal as before, all of this is driven by MotionLayout. #AndroidDev
18
128
746
@chrisbanes
Chris Banes
2 years
My job search is over. In a few weeks, I’ll be joining the OS team at @CashApp , and I can’t wait. Taking 6 months out has been so good for my mental health. I know I am privileged to be able to do that, but I was feeling burnt out. The time out has helped immensely 🧘‍♂️
76
6
711
@chrisbanes
Chris Banes
1 year
After about 12 months of hacking, refactoring and migrating everything to @kotlin and Compose Multiplatform, I've finally got running on iOS. There's a *lot* which is broken and needs to be fixed, but this app is 100% @kotlin 🤯 #ComposeMultiplatform
29
52
707
@chrisbanes
Chris Banes
5 years
Finally back home after #io19 and vacation. Was a great trip, speaking on the Shoreline Amphitheatre and seeing everyone from around the world 🗺️. Oh, I also upgraded my relationship to the higher-tier fiancé plan 💍😆
Tweet media one
75
4
672
@chrisbanes
Chris Banes
5 years
Just over a week ago, I upgraded to the new lifetime plan 💍
Tweet media one
61
9
647
@chrisbanes
Chris Banes
1 year
🤯 Still blows my mind how easy it is to call native APIs from #KotlinMultiplatform In this PR, I delegate to a native iOS 'bottom sheet' with a UIDatePicker, all written in Kotlin, and driven from Compose.
16
71
632
@chrisbanes
Chris Banes
10 days
@Matt212YT Or in other words… Drive to Survive (I’ll see myself out)
2
1
623
@chrisbanes
Chris Banes
5 years
TIL you can install an app by dragging and dropping the APK onto an Android Emulator 🤯
25
122
525
@chrisbanes
Chris Banes
6 years
Since everyone liked my coroutines animation, here's a quick screen record for those that missed my "Android Suspenders" talk #kotlinconf18
8
93
528
@chrisbanes
Chris Banes
11 months
Introducing 💠 Haze, a glass-like blur modifier for Compose (Jetpack & Multiplatform). Still early days, but I really like the immersive-ness that can be achieved by using it on utility UI (like toolbars). Let me know what you think.
20
64
447
@chrisbanes
Chris Banes
5 years
Really 💖 these @AndroidDev UI #Kotlin Coroutine extension functions lately. They make orchestrating sequential UI operations much simpler. Blog post incoming... 🚀
Tweet media one
7
69
389
@chrisbanes
Chris Banes
1 year
I've been doing lots of @kotlin Multiplatform lately, and have been using Xcode as much as @androidstudio . How iOS devs are productive without being able to look at the source code underneath is beyond me. Android devs are spoilt with Jetpack Compose and Kotlin being open source
23
32
388
@chrisbanes
Chris Banes
5 years
🚧 The drawer behavior is changing. Users will be able to open the drawer by peeking the drawer, and then swiping. Big benefit is that this works with existing apps with "old" DrawerLayout versions.
46
104
373
@chrisbanes
Chris Banes
2 years
Enjoy the last change I merged before leaving the birdhouse...
Tweet media one
20
10
374
@chrisbanes
Chris Banes
10 months
🚀 Excited to kick off my 'SwiftUI for Jetpack Compose devs' series! 🔄 Dive into the world of cross-platform development, with the first post on state management. Check it out 🔗: #SwiftUI #JetpackCompose #MobileDev
Tweet media one
8
69
374
@chrisbanes
Chris Banes
3 years
We have something cool coming in the next Accompanist release: Modifier.placeholder() #JetpackCompose Awesome work by @fornewid for the initial work 🙌 Here's a sneak preview:
12
61
363
@chrisbanes
Chris Banes
22 days
📺 After almost 8 years since I started working on Tivi, I’ve finally released v1.0. It’s built in Kotlin and Compose Multiplatform, from a single codebase, published for Android and iOS. Download links in 🧵
19
25
354
@chrisbanes
Chris Banes
5 years
Having to write some `.java` for the first time in a long time... So far I've forgotten to add a `void` return type (many times), missed many semi-colons, tried to write a top-level static method, tried to use string templates. 🤦 @kotlin has spoilt me.
13
27
331
@chrisbanes
Chris Banes
6 years
Just spent 30 mins trying to work out why something wasn't working.... You got me again `override onCreate(Bundle, PersistableBundle)`
19
33
316
@chrisbanes
Chris Banes
7 years
I'm starting a small blog series on fragment transitions. First post is about getting them working. #AndroidDev
7
92
315
@chrisbanes
Chris Banes
5 years
I'll soon be marrying someone who has no problem with having 48 tabs open. Is it too late to cancel the wedding? 🙅
Tweet media one
45
18
316
@chrisbanes
Chris Banes
2 years
The 'advanced' @AndroidDev talks at #GoogleIO this year 🫢
Tweet media one
25
34
309
@chrisbanes
Chris Banes
7 years
Nested scrolling just got a major upgrade in the Support Library; big improvements to flinging in AppBarLayout 🎢
8
115
311
@chrisbanes
Chris Banes
4 years
🚀 Accompanist v0.7.0 for #JetpackCompose has been released with 4 new libraries! 📖 HorizontalPager + VerticalPager layouts! (aka ViewPager) 🔵 Pager indicators 🍫 System UI Controller 🌊 Flow layouts 🏡We also have a new home, package name and group id
14
53
310
@chrisbanes
Chris Banes
1 year
TIL that IntelliJ/Android Studio has a widescreen monitor setting. ↔ It lays out bottom docked panels to be displayed within any panels on the left/right. Basically, the bottom docked panels aren't displayed all the way on the edges now. I much prefer it.
Tweet media one
14
40
303
@chrisbanes
Chris Banes
3 months
Task: Post a local notification at a specific time iOS: Less than 10 lines of code, ezpz Android: Need to set an alarm for the given time, create a BroadcastReceiver to run, create a NotificationChannel, and finally post the notification. About 150 lines. 🤦
14
19
300
@chrisbanes
Chris Banes
1 year
Tivi v0.9.3 for Android is out! There's so much in this release: - Built using @kotlin Compose Multiplatform - Migrations and refactoring throughout - Predictive back support for Android 14 users 👇 🧑‍💻: ▶️:
7
24
286
@chrisbanes
Chris Banes
3 years
Introducing Snapper 🐊 for #JetpackCompose Snapper can be summarized as SnapHelper for LazyRow & LazyColumn, adding item snapping, maximum fling distance, snap position, and more.
6
47
282
@chrisbanes
Chris Banes
6 years
More playing with MotionLayout 2.0.0-alpha3, this time on the new KeyTrigger functionality. KeyTrigger allows you to run methods on views at specified times during a transition. ⏲ 👇 This example calls show() on a FloatingActionButton at 60%, and hide() at 70%
Tweet media one
6
50
277
@chrisbanes
Chris Banes
7 years
Anyone interested in a generic touch listener which allows the following? (HorizontalScrollView deep within ScrollView)
26
28
276
@chrisbanes
Chris Banes
5 years
For anyone interested in how this is done, see here 👇
@AndroidMakersFR
Android Makers by droidcon
5 years
5
69
480
5
40
276
@chrisbanes
Chris Banes
2 years
Currently writing this #JetpackCompose blog post. Already 2000+ words in and only ~60% through. Might need to split it up ✂️
Tweet media one
14
14
272
@chrisbanes
Chris Banes
6 years
"RxJava to Coroutines" - what I've been working on recently #AndroidDev
4
84
266
@chrisbanes
Chris Banes
7 years
2017: - Gave 3 talks ( @droidconNYC , @droidconUK , @droidconkr ) - Became a manager 🤯 - Gave myself time at work to breathe (a lot less support lib eng) 😴 2018: - 4 month trip around Asia ⛱️🏖️ - Emigrating to Sydney 🐨 - Goal: Create something 👨‍💻
13
1
268
@chrisbanes
Chris Banes
4 years
Coming soon to AndroidX Core! ⌨️ All of the new WindowInsets type have been backported, as well as the new `setDecorFitsSystemWindows()`. Should hopefully be in v1.5.0-alpha02 🤞
Tweet media one
5
40
266
@chrisbanes
Chris Banes
5 years
I suppose there are worse places to be writing my #io19 slides #t
Tweet media one
10
2
266
@chrisbanes
Chris Banes
5 years
If you use both the command line and @androidstudio when developing projects, you'll have seen this pesky warning: "Daemon could not be reused" AS bundles its own JDK, which your shell environment doesn't know about. Use this function to sync them up and re-use the daemon 👇:
Tweet media one
14
60
264
@chrisbanes
Chris Banes
3 years
🎉 It's the release you've all been waiting for... 🎉 🎉 🎉 🎉 Accompanist 0.15.0 will be released tonight 🙃
17
12
262
@chrisbanes
Chris Banes
5 years
Here's something for 🌟 MotionLayout 🌟 #AndroidDev MotionLayout currently doesn't work as a nested scrolling child, which breaks some common scenarios, like using it in a Bottom Sheet. So I wrote an extension class to add it: 👇 Here it is in action:
6
56
260
@chrisbanes
Chris Banes
4 years
The WindowInsets updates have been added to WindowInsetsCompat in AndroidX Core v1.5.0-alpha02 , which was released today. 🎉 That includes the `ime()` type, allowing you can check the keyboard visibility and size ⌨️
8
57
257
@chrisbanes
Chris Banes
1 year
So let me guess this right… a platform whose main income is serving ads, is rate limiting everyone to some stupidly low amount, and thus serve less ads. Genius.
Tweet media one
11
17
252
@chrisbanes
Chris Banes
3 years
📐 Just released Insetter v0.6.0! The big feature in this release is 💫 super 💫 easy support for animated window insets. The sample code below is literally all you need to achieve the effect on the right.
2
32
252
@chrisbanes
Chris Banes
4 years
Just landed in #JetpackCompose , is the new `AnimatedVisibility` composable. Hello layout transitions 🙋 The FloatingActionButton and list item animations are all just simple calls to: AnimatedVisibility(visible = true/false) { … } Example PR:
7
31
242
@chrisbanes
Chris Banes
2 years
My team shipped #JetpackCompose and all of our internal supporting infra internally, supporting a bunch of teams, enabling them to move soooo much faster. We fully built out our design system as part of this too. /2
3
10
245
@chrisbanes
Chris Banes
3 years
Congrats to the Communities team! 👏 And the best bit? A large chunk of this is implemented in #JetpackCompose
@HiCommunities
Communities
3 years
Android is HERE! if you’re on Android, you can now engage in Communities via the Twitter app (make sure to update to the latest version!)
Tweet media one
Tweet media two
65
231
767
8
13
245
@chrisbanes
Chris Banes
6 years
Yesterday I stole a load of code from @crafty to implement the 'saturate on image load' pattern. Many animation. Much color. 🌈
8
32
238
@chrisbanes
Chris Banes
2 years
MDC bottom sheets + #JetpackCompose nested scrolling currently don't work so well, so I ended up creating a workaround. BottomSheetInteropNestedScrollingBox() enables layouts like LazyColumn to work nicely with MDC bottom sheets 🎉 gist:
4
44
237
@chrisbanes
Chris Banes
2 years
Thank you to my amazing team: @mrmans0n @_sierraobryan @Flubarb @wsferguson @yoali_sb @1taylorsandusky @dankim @llgoodChristian There are loads of tweeps who l'm definitely missing here 💙 Good luck to everyone. If you need anything, let me know. /end 🧵
16
4
236
@chrisbanes
Chris Banes
7 months
Just landed WebAssembly support to Haze 💠 Kotlin Multiplatform and Compose Multiplatform made it far too easy. This is the _exact_ same code that we use on iOS and JVM, working on the web too. 🔗:
4
19
235
@chrisbanes
Chris Banes
7 years
Small tip for Room users: enable main thread queries when debugging. You can now query the DB from the debugger #AndroidDev
Tweet media one
4
69
230
@chrisbanes
Chris Banes
1 year
Spent the morning setting up a new @GooglePlay Developer console account + new app. This app is internal + closed alpha testing only. I don't know how, but they've managed to make this one of the most bureaucratic things I've ever done. It's easier to do a tax return than this.
20
12
226
@chrisbanes
Chris Banes
3 years
Why you should always provide a Modifier parameter in your #JetpackCompose composables:
8
60
225
@chrisbanes
Chris Banes
7 years
I'm liking RxJava + LiveData together. Business up front(end) with LiveData, party in the back(end) with Rx.
Tweet media one
7
43
221
@chrisbanes
Chris Banes
11 months
New blog post in progress. I've needed this blog post for too long... (looking for reviewers who can check my SwiftUI too 😅)
Tweet media one
5
14
218
@chrisbanes
Chris Banes
5 years
Wife: Do you know all the codes, or just one code? Me: I know Java, Kotlin + others Wife: Can you teach me the Matrix code? Me: I can offer the red pill of #AndroidDev lifecycle wierdness, Dagger issues, and OEM WTF. Or the blue pill of Jetpack Compose*... Wife: wut
6
19
214
@chrisbanes
Chris Banes
2 years
I'm not an interaction designer, but this looks... weird. Hiding any kind of feature behind a gesture isn't great UX. You can get away with pull-to-refresh as it's so common (as long as you cater for a11y too). Pull-to-filter though...
@signalapp
Signal
2 years
On Android, pull down on your chat list to show *just* your unread messages. Clear notifications quickly and respond to your waiting friends.
45
59
842
22
5
210
@chrisbanes
Chris Banes
4 years
⌨️ Remember when I said the team was working on backporting the WindowInsetsAnimation APIs? Well it just landed 💣 thanks to @vadimcaen : Should be released in the first AndroidX release of 2021.
7
29
209
@chrisbanes
Chris Banes
3 years
This week is hack week at @TwitterEng , so I've spent the week integrating @CashApp 's Paparazzi to screenshot test our #JetpackCompose components on CI 💫. No devices necessary.
4
24
203
@chrisbanes
Chris Banes
3 years
♻️ Just updated my blog post about the effects that #JetpackCompose has on the APK size, build time of . I re-ran all of the stats using Compose 1.0.0-beta05 and the results were very interesting 🤔
5
35
203
@chrisbanes
Chris Banes
6 years
I'm just about to give my "Android Suspenders" talk at #kotlinconf18 🕺 🖼:
Tweet media one
8
55
200
@chrisbanes
Chris Banes
5 years
Dark Theme in Android Q! 🌑🌕 #finally #darkthemebeforeitwascool
2
18
201
@chrisbanes
Chris Banes
2 years
An exploration of the new #JetpackCompose Compiler metrics ⏳
5
54
203
@chrisbanes
Chris Banes
4 years
🚀 We've just updated the WindowInsetsAnimation sample for #Android11 DP3 The sample now contains a new deferring inset behavior, which means no more view clipping as you scroll 🙌 PR:
4
35
201
@chrisbanes
Chris Banes
30 days
Me: why is the refresh spinner showing all of the time? Also me: Spends 30 mins tracing all of the network requests and tracking logic. The fix (to my bug)🤦‍♂️:
Tweet media one
13
2
200
@chrisbanes
Chris Banes
6 years
It's that time of year where I have @romannurik 's excellent code highlighter for slides opened in a permanent tab 🌈. If you haven't used it before, make sure you try it out.
6
24
196
@chrisbanes
Chris Banes
3 years
Had to reach deep into my memory to create this workaround for nested scrolling view interop in #JetpackCompose This allows you to use nested scrolling layouts in a ComposeView, so that they dispatch the correct calls to view parents (AppBarLayout, etc).
6
25
196
@chrisbanes
Chris Banes
7 years
I jumped on the RxJava train today.
5
15
193
@chrisbanes
Chris Banes
3 years
This week I bought a MacBook Air M1, and by sheer coincidence @androidstudio launched ARM64 support in Arctic Fox C15 too! Obviously the 1st thing I did was to see how fast it can build ... This is Apple's £1000 laptop, beating it's £3500 laptop:
Tweet media one
23
24
192
@chrisbanes
Chris Banes
4 years
🎄 Today is my last day in the 'office', so I decided to work on something fun. 🕺 With the new nested scrolling support in #JetpackCompose 1.0.0-alpha09, we can now nicely control the on-screen keyboard from scrolls... PR:
4
11
192
@chrisbanes
Chris Banes
3 years
Here's a little something which I've been working on for a while now: SnappingFlingBehavior for #JetpackCompose It's still WIP, but think of it as RecyclerView's SnapHelper for LazyColumn/Row.
5
16
192
@chrisbanes
Chris Banes
4 years
You've probably seen "Demo Mode" in your #AndroidDev device's developer options, but did you know that you can completely customize what is displayed? All of the options are listed here:
Tweet media one
1
51
189
@chrisbanes
Chris Banes
6 years
Spent a few hours today updating to MotionLayout 2.0.0-alpha3. The new Constraint format makes it much easier to use. You no longer have to re-set all attributes when you're only changing a single property! 🗜️
Tweet media one
Tweet media two
4
28
190
@chrisbanes
Chris Banes
3 years
Slotting in with Compose UI 🧱 A post which explores the benefits of the Slot API pattern in #JetpackCompose
1
39
185
@chrisbanes
Chris Banes
7 years
Just got bit by a Kotlin gotcha: using `by lazy` for view vals. It will still point to the old view instance after fragment view recreation.
Tweet media one
13
58
188
@chrisbanes
Chris Banes
8 months
Haze 💠 0.5.0 has just been released! 🌫️ New Materials library 🆕 Tidied up styling API ✨ Updated to Compose Multiplatform 1.6.0-beta01 🔁 Merged haze and haze-jetpack-compose 🏃 Performance optimizations (more below) 🔗:
Tweet media one
7
15
187
@chrisbanes
Chris Banes
1 year
🆕 post: Parallax Effect in Jetpack Compose 🪄 When implementing a parallax effect in #JetpackCompose there are well known ways to achieve it. In this blog post I explore a different way, which I think is much better. Learn more below 👇
4
32
184
@chrisbanes
Chris Banes
8 months
Hellloooo @kotlinconf 2024!
Tweet media one
4
3
184
@chrisbanes
Chris Banes
5 years
🤯
@nisrulz
NishFish
5 years
💡Android Tip : You can get rid of a lot of noise in the Logcat, by Right Clicking a selected text > "Fold lines like this" option! Happy De🐛ing! #AndroidDev #android #tip
13
175
544
2
31
182
@chrisbanes
Chris Banes
5 years
Mostly there with my migration to using Store 4 📦 PR: It's greatly simplifies the common task of: 📥 Fetch from network 📦 Save to database 🔍 Get/observe data ...to this:
Tweet media one
9
26
182
@chrisbanes
Chris Banes
7 years
Published some tips for handling date + time in Room ⏰ #AndroidDev
4
55
176
@chrisbanes
Chris Banes
4 years
📐 Insetter v0.3.0 was released earlier today! Lots of improvements in this release, including a brand new API, to make handling WindowInsets even easier. 😅 Thanks to all of the contributors 🙌 🔍 →
Tweet media one
4
28
175
@chrisbanes
Chris Banes
5 years
💯%. I always try to self-review my PRs on GitHub, and CLs on Gerrit, *before* adding reviewers. Seeing your code changes outside of the IDE makes it much easier to be self-critical.
@addyosmani
Addy Osmani
5 years
Code-review tip: self-review. Look at your changes as critically as you can from the position of someone who didn't write them. This can help you step back and make further improvements.
32
219
1K
3
20
174
@chrisbanes
Chris Banes
7 years
After experiencing mobile networks in the Philippines, I have a new appreciation for offline apps. I really encourage app devs to get outside your reliable LTE bubble, and experience slow + patchy connectivity for an extended time.
7
32
170
@chrisbanes
Chris Banes
4 years
🎹 Accompanist for #JetpackCompose is out! It's a set of utilities which I've found myself needing whilst migrating to Compose. Currently has: 🎨 Material Design Components theme integration 🖼️ Coil image loading composables 🔍
Tweet media one
5
33
172
@chrisbanes
Chris Banes
6 years
📣 AppCompat v1.1.0-alpha03 is out This is a big release, especially for DayNight: 🖼️ Resource loading has been split out 🛑 Deprecated MODE_NIGHT_AUTO 🔋Added MODE_NIGHT_AUTO_BATTERY 🐛 Many bugfixes, including the infamous WebView incompatibility
4
39
168
@chrisbanes
Chris Banes
1 year
After roughly a month of trying to get it to work, Tivi's migration from Room ➡️ SQLDelight has landed! Blog post incoming containing small tips/gotchas I found along the way.
9
12
170
@chrisbanes
Chris Banes
5 years
Spent an hour trying out Flow today. Super impressed that the @kotlin team have added ` @Deprecated ` stub extension funs for Flow, to allow easy migration from RxJava operators to Flow equivalents 🤯 Source: 👇
Tweet media one
4
21
169