Jetpack Compose Custom Toolbar
12:04
You Should Use Sequence Diagrams
9:02
Sticky headers in Jetpack Compose!
15:21
Setup Ktor for your Android app!
15:22
Multi-module Android App Tutorial
17:04
Пікірлер
@user-Farooqzx
@user-Farooqzx 3 күн бұрын
I opened your video hoping I could find a solution to my problem but it seems you have the same problem which is when I use .animatedItem() with LazyColumn it shows a weird animation when flipping quickly and sometimes when changing the sorting type(look at the last item in the list here 18:22)
@brigadut
@brigadut 11 күн бұрын
How to customize the navigation style to be horizontal like ios ?
@TheAndroidFactory
@TheAndroidFactory 11 күн бұрын
What do you mean horizontal?
@brigadut
@brigadut 11 күн бұрын
@@TheAndroidFactory I mean when you navigate to a screen or activity it will slide horizontally not just fade-in
@TheAndroidFactory
@TheAndroidFactory 11 күн бұрын
Oh, I see. That is just a Fragment or Composable transition. The default nowadays I think is the fade, but you can update that pretty easily. This article seems like a good resource tomas-repcik.medium.com/jetpack-compose-and-screen-transition-animations-b361fc8164cc
@brigadut
@brigadut 11 күн бұрын
@@TheAndroidFactory thank you so much.
@TheAndroidFactory
@TheAndroidFactory 11 күн бұрын
@brigadut no problem. Good luck!
@ifedayoadekoya6694
@ifedayoadekoya6694 11 күн бұрын
What happens if you want to return your own object for failures? Say the back sends a 400, and you want to print backendResponse.message (from the returned response object) to the UI? How will you do that with this approach?
@TheAndroidFactory
@TheAndroidFactory 11 күн бұрын
Quite simply! Best way to do it is have your network layer return a Status object. You can use the one built in to Kotlin, or create your own. If the network call succeeds, you return Status.Success(data_goes_here), otherwise you return Status.Failure(error_goes_here) and at the UI layer you can "unwrap" the status to know what type it is (success or failure) and do what you need to from there!
@lpfboyka561
@lpfboyka561 12 күн бұрын
what if i got the Failed to authenticate, have you run firebase login?
@TheAndroidFactory
@TheAndroidFactory 12 күн бұрын
Is your service account setup properly?
@rezasafdari-n3m
@rezasafdari-n3m 12 күн бұрын
Very cool tutorial bro, three questions 1.Repository should be in network? But you put it in app module. 2.network module is same Data module in google docs? 3.where we should put domain layer if we use clean architecture in multi module project? 🙏🙏
@TheAndroidFactory
@TheAndroidFactory 12 күн бұрын
1. I left repository in the app module because that was specific to the implementation of using the network package. I want to turn that package into a full open source library, so having the repository in there feels too "heavy handed". 2. I don't think so, but I don't know what docs you are referring to. Again, I want to turn that package into a library, so I want to keep it as lightweight as possible. 3. I would probably keep this layer in the app module for simplicity and ease. Making its own module for it would probably be overkill imo, so just try to keep a clean package structure in your app module
@rezasafdari-n3m
@rezasafdari-n3m 12 күн бұрын
The first and third questions I understood, but for the second question, I meant the Android Developer website, and whether multi-module programming in Android has a special packaging like the Clean architecture, or if it's just the parts that the developer themselves decides to transfer to their desired module with a custom name?
@TheAndroidFactory
@TheAndroidFactory 12 күн бұрын
I see. I am personally a little unfamiliar with the docs you're referring to, but at the end of the day (in practice, at real companies) we often stray away from specific patterns at times because as your team and project grows, it gets harder to keep everything in alignment. As long as you have a clear enough structure, I wouldn't worry too much about it. Remember: at the end of the day, the users have no idea how your code is structured 😆 One thing I would say from experience though is "package by feature" if you are going to break out different modules. So, you wouldn't want one feature to be touching many different modules, like if you had your network models in on module, domain modules in another, and presentation (Composables) in another module. Instead, I would try to keep all of the code that your feature needs to run in the same module. Otherwise, it becomes a real big pain to try and move it if you need to.
@rezasafdari-n3m
@rezasafdari-n3m 12 күн бұрын
If we consider app like instagram We have search feature, profile feature and home feature so : -Search Module .data layer .domain layer .presentation layer -profile Module data layer .domain layer .presentation layer -home Module .data layer .domain layer .presentation layer Like this? And tank you very much for your response.
@TheAndroidFactory
@TheAndroidFactory 12 күн бұрын
Yes that is typically pretty helpful for larger teams because if you just needed to work on a feature, enhancement, or bug fix in one of those areas, you would only need to make changes in a single module. This would reduce your potential for introducing bugs in the other modules, speed up compile time, and this structure allows for good "ownership" amongst the developers i.e. the "search team" vs. "home team", etc. Additionally, there will be some things that overlap between modules, such as specific models, networking and analytics helpers, date formatters, etc. and all of the individual modules can import this "shared" module so each feature area has access to these standard helper classes/functionality. Does that make sense?
@metacode4696
@metacode4696 14 күн бұрын
Sir, please continue the tutorial, add favorite features stored in the room database🙏🙏🙏🙏🙏🙏❤❤
@TheAndroidFactory
@TheAndroidFactory 14 күн бұрын
I know I'm slacking. I have a wedding coming up in less than a month. I want to get back to making content!
@metacode4696
@metacode4696 13 күн бұрын
@@TheAndroidFactory i see, happy wedding sir.😉
@TheAndroidFactory
@TheAndroidFactory 12 күн бұрын
@metacode4696 thank you!
@user-pz6tc5mo5l
@user-pz6tc5mo5l 27 күн бұрын
Great!
@TheAndroidFactory
@TheAndroidFactory 27 күн бұрын
Appreciate your support!
@ShortBits786
@ShortBits786 28 күн бұрын
Please upload next video fast
@wokhardy1018
@wokhardy1018 29 күн бұрын
Great video as always Dom! Paging3 is really much easier than paging2, definitely gonna be using this going forward. I did have a question, as someone who has probably worked on several projects with paging. Is paging only used for infinite scroll apps? Say we have an app which has pages of it's own, would you use the paging library for that or just make an api call directly each time we change the page?
@TheAndroidFactory
@TheAndroidFactory 28 күн бұрын
Appreciate the support. Can you explain the question a little more? What do you mean when you say the app already has pages of its own?
@wokhardy1018
@wokhardy1018 28 күн бұрын
@@TheAndroidFactory suppose you had 20 characters per page, and you had to press a button to go the next page and see the next 20 characters, much like you would do on a webpage. Or, if you have a news api which returns a bunch of articles at once, and you want to display one article at a time in the app, then the user would have to click a button to go to the next page to see the next article. I wonder if that makes sense. Would you use the paging library for that, or just make a second api call when the user clicks the button to go to the next page
@TheAndroidFactory
@TheAndroidFactory 28 күн бұрын
I totally understand what you're saying. Truthfully, I probably wouldn't use the paging library for that. You can just fetch the page from the API based on what page the user is on. So as they navigate deeper into pages, you make the API call with the param page=N and can cache the result. So each page could be the same fragment/composable, but configured with a different pageNumber (or whatever you want to call it). This should simplify your implementation to do the same thing for each page: fetch data from API, and display it. As the user navigates backwards in pages, if you have the results cached, you can quickly look that up instead of making a new API call for the data. You'll just need to save the data at a "higher level" than the fragment/composable, so the activity is a good place for this information to be stored. Hope this helps 👍
@wokhardy1018
@wokhardy1018 27 күн бұрын
@@TheAndroidFactory it does! I'm learning so much about app architecture, and clever solutions to common problems as I'm going through your series. And your detailed answers to every question on your videos, even years later, is very admirable. Hats off, sir!
@TheAndroidFactory
@TheAndroidFactory 27 күн бұрын
Amazing to hear this! I'm so glad it is making sense to you 😀
@thenojus5773
@thenojus5773 29 күн бұрын
Awesome tutorials, thanks!
@TheAndroidFactory
@TheAndroidFactory 29 күн бұрын
Glad it helps 😃
@SunMoonBrothers
@SunMoonBrothers Ай бұрын
drop your spotify playlist dude
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Appreciate you haha 😆
@brandoncantu5403
@brandoncantu5403 Ай бұрын
Why doesn't it work anymore? At least for me
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
What doesn't work for you?
@brandoncantu5403
@brandoncantu5403 Ай бұрын
Well I'm using Jetpack Navigator and I'm trying to use animations with actions inside fragments but it's not working, the animation is a fade by default and I try to change it but nothing happens, I've been like this for almost 2 days.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
How are you setting the transition? In XML? Are your XML animation files properly error free?
@brandoncantu5403
@brandoncantu5403 Ай бұрын
@@TheAndroidFactory Yes bro, I use xml for the animations, I have defined an animation in an anim folder and the nav in a navigation folder and there are the fragments and the actions specifying the animation for each fragment but it doesn't work, nor do I get any error, how could I solve it? 🥹
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
That is crazy odd to be honest. It doesn't sound like you should have to do anything else 🤔 feel free to email me code snippets at [email protected] (although I am away from my computer for a little bit but I can check on mobile)
@pawandeepsingh6365
@pawandeepsingh6365 Ай бұрын
hey, when u open .onSuccess{}, it shows in light color (it:Character), in my android studio it does not. How can I get that?
@pawandeepsingh6365
@pawandeepsingh6365 Ай бұрын
Kudos to you! I am new to Android and didn't know anything about DI and, your playlist is amazing. I learned a lot.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Well, welcome to the channel :) Dependency injection is super powerful! It can be intimidating at first, but you can get the hang of it quite easily
@pawandeepsingh6365
@pawandeepsingh6365 Ай бұрын
Hey, Is ktor client slow than retrofit? I am using retrofit it takes 400-500 ms to get data but ktor takes 800-900 ms for same data. What u did in your code same I have done.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
That's interesting 🤔 I haven't tested them much to be honest. You're making the same API calls side by side? Are they happening in parallel?
@pawandeepsingh6365
@pawandeepsingh6365 Ай бұрын
@@TheAndroidFactory Side by side
@pawandeepsingh6365
@pawandeepsingh6365 Ай бұрын
@@TheAndroidFactory Your videos are really helpful, could please make videos on how to use google maps in android with compose, specially how to make custom markers? If possible please do it. Thank you
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
@pawandeepsingh6365 interesting.... I'm not sure at all. If you Google this concept does anything come up? This is quite interesting
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
@pawandeepsingh6365 I appreciate your support!! Google maps is a little tricky because of the API key stuff, but I could look into it
@sw_a_ppy
@sw_a_ppy Ай бұрын
Why not scaffold
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Totally could. This is just a simplified version and I probably should update it
@MrVipulLal
@MrVipulLal Ай бұрын
Useful series. Thanks
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Woo! Appreciate the support :)
@supuerawesome707
@supuerawesome707 Ай бұрын
Really loved this series!
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
I never really finished this so I'm sorry for that 😔 but the code is available on GitHub if you want to play with it yourself!
@supuerawesome707
@supuerawesome707 Ай бұрын
@@TheAndroidFactory No need to be sorry, this has been a great series regardless! I may have a stab at implementing the favourite-ing logic myself with Room or DataStore. I'll definitely be checking out some of the other series you've got on the channel!
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
@supuerawesome707 love to hear it! Thank you for the support :)
@neyasbit
@neyasbit Ай бұрын
What about error handling. For example, when in the middle of the list, that is, for an unsuccessful loading of one item. Also, what happens if the list ends? You can also find various subtleties that are not being talked about.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
When the list ends, there is nothing more to page so the job is "done" so to speak. This can also be detected when the meta.next value is equal to null. Regarding error handling, you can implement a auto-retry feature to attempt the call that failed 1-3 times (or however many times you want) or you can add something to the UI that mentions a failure in loading and the user can click a button or something to trigger the request. The tutorial was meant to be a simpler and mostly working approach as opposed to a fully bulletproof mechanic. The content is more consumable that way, but some bits of what you mentioned are correct. If you'd like to open a pull request enhancing the functionality, I would review it and make content about me reviewing it!
@neyasbit
@neyasbit Ай бұрын
Perhaps you're right, I just want to see the subtleties of use
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
@neyasbit I could enhance this over time
@supuerawesome707
@supuerawesome707 Ай бұрын
Love the realism of all the errors. It makes newer programmers like myself feel reassured that even the pros are human and write bugs!
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Humbled you think I'm a pro 😅 if people cut out the errors and specifically resolving them, it's not a real tutorial 👍 appreciate your support!
@h-ym2ul
@h-ym2ul Ай бұрын
hey i found this video very informative and knowledgeable
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Glad it helped :)
@dharambudh2646
@dharambudh2646 Ай бұрын
Hi, thanks for sharing. I am getting an error saying: Failed to authenticate, have you run firebase login?
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
Did you setup the service account properly? I imagine that's your issue
@dharambudh2646
@dharambudh2646 Ай бұрын
Yes, I did. Additionally I verified steps from 1. From your video, 2. From official documentation & 3. From one Medium article.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
I remember seeing these errors in the past but I can't remember how I solved them. It's definitely related to some permissions issue
@supuerawesome707
@supuerawesome707 Ай бұрын
Really enjoyed your explanations! Glad I discovered your channel.
@TheAndroidFactory
@TheAndroidFactory 10 күн бұрын
Hey, sorry it took so long to reply! I am a bit busy right now between work and planning a wedding, but I plan to return to making content more regularly when things slow down. Thank you for the support!
@Joeybear88
@Joeybear88 Ай бұрын
Great video, quick question how did you solve the tearing issue? I have the same problem, I'm using Android Studio to emulate.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
I think this is one of those things that just kinda resolves itself on its own. Maybe try killing the emulator and cold booting it - that should be an option in the Device Manager side panel. I don't think there was anything in particular I did to fix it. Keeping up to date with Android Studio might help too. Thanks for the support and comment :)
@LucasAlfare
@LucasAlfare Ай бұрын
Unfortunately designed to client side. Do you have some design content for ktor Server? It should be very useful too.
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
I do not at the moment but was looking into it a while back. Maybe another season later down the line!
@isaacnguyen0809
@isaacnguyen0809 Ай бұрын
If i would like to see log from ktor client with the beauty format (like Json format) for body response in logcat , how can i do that ?
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
I think there is a log plugin that you can attach to the Ktor instance and set it to prettyPrint=true somewhere. Take a look at their docs and it should be pretty straightforward hopefully!
@riezkymaisyar4038
@riezkymaisyar4038 Ай бұрын
i love it, this code really pretty clean, thankyou so muchh!
@TheAndroidFactory
@TheAndroidFactory Ай бұрын
It's available on GitHub!
@ahmedHmila-h9f
@ahmedHmila-h9f 2 ай бұрын
Hello I am getting error :Error: failed to determine AAB info. HTTP Error: 400, Request contains an invalid argument. i'm using this action - name: Déployer sur Firebase App Distribution uses: wzieba/Firebase-Distribution-Github-Action@v1 with: appId: ${{ secrets.FIREBASE_APP_ID }} serviceCredentialsFileContent: ${{ secrets.CREDENTIAL_FILE_CONTENT }} groups: testers file: android/app/build/outputs/bundle/release/app-release.aab
@AdanSendo
@AdanSendo 2 ай бұрын
I been searching for months for a good channel that explain in great detail the topics for make me get started and learn android development and I found you!! I'll stick with your channel, thanks for sharing your knowledge.
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Amazing!! I'm glad you found me :) the channel has plenty of content on it that evolves linearly in complexity, so feel free to checkout the playlists and watch them in order if you want to :) sharing the channel with anyone else that may find it helpful is always appreciated 🙌
@nicoqueijo
@nicoqueijo 2 ай бұрын
I think you may be able to use the native HorizontalDivider() instead of the custom Box there for the separation between toolbar and screen content.
@sammorales5940
@sammorales5940 2 ай бұрын
Will be great if you can add a search bar, thanks for the videos bay the way, really awesome content!!!
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Can definitely add search! Search and filter logic would be fun to build out
@GCkk
@GCkk 2 ай бұрын
Hi, Is their a way to inject the applicationContext into multi-module lib?
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
For sure! Checkout this StackOverflow post: stackoverflow.com/questions/63072927/how-to-inject-application-context-in-a-repository-with-hilt
@GCkk
@GCkk 2 ай бұрын
@@TheAndroidFactory Sorry I think Question was not clear. I wish inject the applicationContext of the app to a library module.
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
@GCkk yeah it could be done by defining an interface in the library module that needs application context, and is implemented in the app module. I'd consider alternate ways of doing this as well though as a thought exercise, for instance: do you actually need the application context as opposed to another context? Is there a way you can restructure things so whatever needs the application context can be injected into the library as opposed to the library requiring the context itself? It may not be wrong what you're doing, but it may be easier if you try to solve the problem a different way. Just something to think about! Hope this helps
@DaikonDee
@DaikonDee 2 ай бұрын
Should have watch the video until the end, i stop at 7:35 and wondering for hours why it pass 0 integer. Thank you for the tutorial
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Ha. Thanks for watching :)
@AliZz0A
@AliZz0A 2 ай бұрын
Hi I just started this season I am beginner. First episodes of this series is easy for me. But when you start MVVM and this video I got confused. It looks a little hard and I don't understand full of code. What should I do. I actually hate learning something new without practice. Everyday I want to do something myself then I think I should continue this series and I get stuck again
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Understandable -- there's another series on the channel where I build a "digital clock" using LiveData and I think that might go you understand the concepts better. It is a shorter series and specific to how the architecture + tooling works, so maybe try some videos there
@AliZz0A
@AliZz0A 2 ай бұрын
@@TheAndroidFactory so after watching "digital clock" series should I continue this series or do something else?
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
I'd say this series is a good thing to come back to when you learn new things so you can "put it all together" into an app. The digital clock series should help you understand how LiveData works in general and then this series is a more practical example of how to use the tool inside the MVVM architecture pattern
@AliZz0A
@AliZz0A 2 ай бұрын
@@TheAndroidFactory Thanks a lot
@nicosummer9020
@nicosummer9020 2 ай бұрын
Truly solid content. 10/10 ! You have saved my mobile dev module this semester ✨
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Woo! Glad it helped :)
@Dibyendu.M
@Dibyendu.M 2 ай бұрын
I have completed the playlist today. I must say you have covered most of the important aspects of a basic to intermediate-level project. Thanks a ton, mate. I look forward to more insightful videos in this playlist. One suggestion: please implement pagination in this project. ✨🙏
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
I appreciate your support and will make some more content to complete this app. Although, I already did make a video in this series about pagination - just our own custom implementation as opposed to using a library for it
@zeusalmighty6740
@zeusalmighty6740 2 ай бұрын
Should we be moving minSdk version to toml? It is not a dependency, better to have a convention plugin?
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Possibly. Mainly just showing off something you can do. To me it is a "version" so it does have a place in the file, but there could be an argument either way I suppose
@jam4l
@jam4l 2 ай бұрын
Nice, thanks Domenic 👏
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Hope it helps :)
@stevensilitonga
@stevensilitonga 2 ай бұрын
Use shared elements for those characters! ❤
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Ohhh I like it. I'll look into it!
@MrRahulmalik
@MrRahulmalik 2 ай бұрын
how about implementing shared element transition for character image from list to detail screen using the new API??
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Love the idea. There is more than one comment about this so I'll look into it!
@AliZz0A
@AliZz0A 2 ай бұрын
I am beginner with android programming. First I learn basic and watch Season 1 from your channel. What do you prefer next I can watch season 3 or should I continue with this season
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Well first off, welcome! Thanks for stopping by the channel :) I would recommend the older Rick and Morty season since that is a full app in XML and this is a full app in Jetpack Compose. All the code is available on GitHub for both seasons, but that other project may help explain some other concepts and is a little simpler than this one. We use dependency injection, a new networking library, and this project is multi-module which is a little advanced in my opinion for a beginner. Once you complete that season though, this one will be fun to watch as well since you'll be familiar with the data and other core concepts of Android development. I'd also recommend the "digital clock" season since that shows some good separation of concerns and LiveData concepts to send data around!
@AliZz0A
@AliZz0A 2 ай бұрын
@@TheAndroidFactory Thank you for reply. This channel is really very good for beginners. You are hero. I have 1 more question. When I should stop watching tutorials and try to create simple projects by myself
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
I always try to reply! I'd say pulling the code down from GitHub might be a good start because you have something to learn from/reference and you can build off of it to make tweaks to something you want to try. You'll also have "plumbing" in the project already for making an API call or building a certain UI. But you'll learn really quickly what you know and don't know when you try something yourself! I wouldn't wait too long, but I would keep the projects simple to start so you can build momentum building something!
@Dibyendu.M
@Dibyendu.M 2 ай бұрын
Happy married life, mate!
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Haha thank you ❤️
@joseluismamanicallizaya5352
@joseluismamanicallizaya5352 2 ай бұрын
Starting the course !
@TheAndroidFactory
@TheAndroidFactory 2 ай бұрын
Should be fun :)
@Dibyendu.M
@Dibyendu.M 2 ай бұрын
4:06 When PaddingValues is used in the LazyColumn, the padding works horizontally and at the start and end of the composable. This is why we are not able to see the padding while scrolling. However, when you reach the start or end of the list, you will be able to see the padding.