profile-pic

Pranjul Dhiman

I am a skilled Android/Flutter Developer with over 5 years of experience in developing mobile applications for multiple platforms. My passion for creating high-quality mobile apps has helped me excel in my field, and I am always motivated to learn and grow as a developer.

In my career as a Mobile app developer, I have gained proficiency in a range of programming languages, including Kotlin, Java, Flutter, and Dart. I also have experience with Jetpack Compose, adaptive layouts with constraints, image assets, and Flutter Animations, making me well-equipped to handle UI/UX tasks.

I have worked with several frameworks and libraries such as JSONModel, Crashlytics, Kotlin Coroutines, Kotlin Flows, Android SDK, Google Maps, ADT, Eclipse, Android Studio, Gradle, Maven, MQTT Protocol, Hilt, Realm, SQLite, Retrofit, Volley, Okhttp, MVC, MVVM, MVI, Glide, Picasso, ButterKnife, RxAndroid, EventBus, Getx (State management), Bloc Statemanagement, Dagger, Hilt, Espresso, and Crashlytics. I have also worked with Analytics tools like Firebase and Google Admob.

In terms of repository management, I am well-versed in Git, Bit bucket, and Azure Devops. Additionally, I have experience with Health kit and BT connectivity, WebRtc for Real-time Communication, and Sockets.

  • Role

    Software Engineer

  • Years of Experience

    7.3 years

Skillsets

  • iOS
  • Apple health
  • Auth
  • BLoC
  • ChatGPT
  • Claude
  • Clean Architecture
  • Firestore
  • Geolocation apis
  • GitHub Copilot
  • Google Maps
  • In-app purchases
  • Admob
  • MCP
  • Mongodb realm
  • Pedometer
  • Prompt Engineering
  • Provider
  • Push notifications
  • Realtime db
  • Repository Pattern
  • Rest APIs
  • SQLite
  • Windsurf
  • Razorpay
  • Dart - 4 Years
  • Flutter - 5 Years
  • Java - 4 Years
  • Firebase
  • Websockets
  • Kotlin - 5 Years
  • stripe
  • Supabase
  • Twilio
  • Socket.IO
  • PayPal
  • Android - 5 Years
  • Analytics
  • Crashlytics
  • MVVM
  • Google APIs
  • Dio
  • HTTP
  • Heremap
  • Mapbox
  • Map clustering
  • Room Database
  • GetX

Professional Summary

7.3Years
  • Sep, 2023 - Present3 yr

    Software Engineer

    Enfec Solutions
  • May, 2021 - Aug, 20232 yr 3 months

    Senior Flutter Developer

    Softradix Technologies
  • Feb, 2019 - Apr, 20212 yr 2 months

    Flutter Developer

    Doozycod Systems

Applications & Tools Known

  • icon-tool

    Android Studio

  • icon-tool

    Android SDK

  • icon-tool

    Flutter

  • icon-tool

    Dart

  • icon-tool

    Kotlin

  • icon-tool

    RxJava

  • icon-tool

    Java 11

  • icon-tool

    Java 8

  • icon-tool

    Android

  • icon-tool

    Java

  • icon-tool

    Provider

  • icon-tool

    GetX

  • icon-tool

    Dio

  • icon-tool

    http

  • icon-tool

    Google Maps

  • icon-tool

    Firebase

  • icon-tool

    Firestore

  • icon-tool

    Crashlytics

  • icon-tool

    Analytics

  • icon-tool

    In App Purchase

  • icon-tool

    Stripe

  • icon-tool

    Paypal

  • icon-tool

    SQLite

  • icon-tool

    Room Database

  • icon-tool

    MongoDB

  • icon-tool

    Supabase

  • icon-tool

    Twilio

  • icon-tool

    Websockets

  • icon-tool

    Jetpack Compose

  • icon-tool

    Kotlin Coroutines

  • icon-tool

    Retrofit

  • icon-tool

    Stripe

Work History

7.3Years

Software Engineer

Enfec Solutions
Sep, 2023 - Present3 yr
    Set up and integrated MCP (Model Context Protocol) servers to connect Flutter applications with AI backends, enabling real-time LLM-powered features in production mobile apps. Designed and implemented MCP workflows that automate development tasks such as code generation, API scaffolding, and unit test writing cutting repetitive effort significantly. Developed a strong working knowledge of leading AI models including Claude (Anthropic) and ChatGPT (OpenAI) and applied them for requirement analysis, feature prototyping, and documentation. Adopted Windsurf IDE for AI-native development, enabling context-aware code completion and intelligent refactoring across Flutter projects. Used GitHub Copilot to accelerate boilerplate generation, state management refactoring, and test coverage improvement. Led end-to-end Flutter feature development applying MVVM, Clean Architecture, BLoC, and GetX patterns. Maintained direct client communication, translated business requirements into technical tasks, and managed delivery timelines.

Senior Flutter Developer

Softradix Technologies
May, 2021 - Aug, 20232 yr 3 months
    Led a team of 2 developers conducting code reviews, sprint planning, and direct client communication. Architected and delivered end-to-end Flutter applications using MVVM, Clean Architecture, BLoC, Provider, and GetX. Integrated Stripe, Razorpay & PayPal payment gateways; implemented In-App Purchases for iOS & Android. Set up Firebase Crashlytics, Analytics, Firestore, Realtime DB, and Firebase Authentication across multiple apps. Delivered complex integrations: Google Maps, HereMap, Mapbox with clustering; Socket.io websockets; Pedometer & Apple Health APIs. Managed app releases on Google Play Store and Apple App Store, handling CI/CD and version management. Mentored junior developers and ensured consistent code quality across the team.

Flutter Developer

Doozycod Systems
Feb, 2019 - Apr, 20212 yr 2 months
    Developed and maintained multiple Flutter applications from scratch to production deployment. Worked with REST APIs (Dio & http), SQLite/Room, MongoDB Realm, and Supabase for data persistence. Implemented AdMob integration, Twilio communication services, and third-party SDKs. Collaborated closely with UI/UX designers to deliver pixel-perfect, responsive interfaces. Applied Repository Pattern and state management best practices to ensure maintainable codebases.

Major Projects

9Projects

hiBooks Online Accounting System

    A comprehensive accounting platform for SMBs to manage expenses and profits. Built with Flutter, Firebase, and complex financial reporting dashboards.

Amino Move Fitness Reward App

    Earn AMO crypto tokens by walking. Integrated Pedometer APIs, Apple Health, real-time reward calculation, and crypto wallet features.

Uppo Flex Digital Money Card

    A digital pre-paid card solution for corporate employees for shopping and food purchases. Integrated Stripe and custom card management.

Systemize Habit Tracker

    A habit-building app using a systems-based approach. Implemented local notifications, streak tracking, and data visualization.

Chiksha Emoji Keyboard

EstateMate

    Real Estate Community Management app.

MegaMind Abacus for Kids

Wise Online Teaching App

Roadside Genius

Education

  • Bachelor of Computer Applications (BCA)

    The Glocal University (2018)
  • 12th

    UP Board (2015)
  • 10th

    UP Board (2013)

Interests

  • Gyming
  • Games
  • Exercise
  • A Few Screening Questions Before You Begin

    Okay, so my name is Ranjan, and I have more than 5 years of experience with Android and mobile development as well. And if I can say, what kind of projects I have worked on, so basically, I have worked on multiple domains. That includes high-tech, fintech apps, and real estate apps as well. And if I want to add more to it, my current project, which I'm working on right now, is a fitness tracker app, and it has 800 thousand users. And if I talk about daily active users, it can have 50 thousand daily active users as well. So, basically, it's an app where you can track your daily steps and then be rewarded in cryptocurrencies. It has multiple features, including a dashboard where you can manage your standing across other users. And you can withdraw your cryptocurrencies to your wallet or utilize them to purchase items on the catalog side. So yeah. And if I talk about the architectural thing I use, I basically prefer NVB and NV main code to consume those things into the app itself. I think that's pretty much about me.

    To implementing you can see a customer panel for retrofit APIs. So we can do that with the app of retrofit itself. Sorry, the room DB itself. So you know it's kind of a database which will be providing us a kind of a structural way to secure data. We can say store data and be local to a user ID. And it helps us to maintain the proper kind of caching mechanism into the app itself. So that's one way to handle those things in the app. If we are having some kind of image caching or something, in that case, with the help of live dependency, we can cache those images as well. So if we have the proper image available we don't need to retrieve it again. So for managing we need to also manage some kind of insane status for the local stuff as well. So we can create a status which is stored into the database that we have stored. You can save the data from the retrofit. We are getting that into the app itself. Right? So that we can create a kind of status for it. Is it partially available for us? Or we can say status is sending. According to that we don't need to call the PLL manager. So that's what we can do to create some kind of cache and alternative. It's similar to if I give you an example, we can have similar to in Instagram itself. So they are managing the status of the data. They have that already. They load it there. So that's how they are managing with the help of pagination as well because we require some kind of pagination if we have multiple lists of data going on there. So according to that we can manage those things as well. So we will not repeat the same replay calls. So yeah.

    So I think basically you can see as you know we require threads to work some stuff, or you can see the data flow into each piece itself. So in that case, we have multiple soft things. Our HR is one of the things that we have. So which will be having us to handle some long running tasks where you can see some network calls or IO calls as well into the app itself on the background that you can see. It's kind of a create to create that into the worker, you can see that as well. So in our next job, basically, we create a subscription for that. So with the help of that, we can create a streamer data. So we can directly listen to that, you can say the appropriate call or you can say you recall as well. To listen to data, you can say continuously in our app. So that's the thing we can do with the other server. We need to create a subscription and for the API calls. Or we are using the app sockets.

    Dynamic feature module, with the help of Firebase remote configuration, we can create a module that delivers directly into the app. We've written a function to handle those things, allowing delivery without uploading to the Google Play Store itself. That's one way to do it. And for fallbacks on devices and Google Play Store issues, we can rectify those problems or note them. Additionally, if there's an issue in the grid itself, we can revert back to the older versions we have. We have the option to migrate to the older one in that case.

    So, as you all know, if we select following these older principles into the Android itself. So in that case, we know we have three layers into the Nvidia and the data domain and the user itself. So, with the help of use cases, what we can define is to decouple the things as well. And other than that, we can also implement the D-I in the app. So it will also allow us to decouple things as well because we are not using the instances again and again. So that one thing we can do. And for the repository and the live data, what we can do is define the repository pattern. But we define the data, knowing where it will be coming from. It can be coming from local sources as well. It can be coming from the remote server itself. So we can drive the logic through it into the repository itself to let if the connection is available, so the data will be coming from the local. As it will be returned from the remote itself. So that's what we can do with the help of it to make things more easier and more abstract today. So what we can do is create some kind of services or we can send services for that. So it can help us to add some extra code to the model itself. So you can say into the view or into the repository itself. So we do directly accessing those things into the line, you can say, into the model itself. So that's what we can do to handle those things. So yeah. So the basic points are the implementation. So to help us create instances for the required things like the repository or the model or anything which will be required into the new model itself or into the domain name itself. Second thing is, also, we need to create the custom kind of mappers for it. So it will help us to maintain a flow where the data will be flowing. Like, where the data will be coming from. Is it from local or from the remote itself. So yeah.

    Okay. So for the best example, I can see, with the help of you, if there is no third-party documentation available. So it's making it more difficult for us to implement those things because we need some kind of proper documentation or some kind of understanding of that code, how it's working, or into the SDK itself. Right? So we need to go through the SDK as well, like what method is used for what purpose in the app. And so after going through the SDK itself, we can implement those things according to our app as well. But, yeah, if there is some kind of documentation available, then it will be more easy for us to download the things. And yeah. So this will be my approach, and I will also try to find some examples if available on the internet. You can see it to see if there are any examples available. If that is not the case, like we haven't found anything on the internet, then the only thing is to go through the SDK itself, and we use those methods we have in the SDK to do that because I'm assuming there are some comments as well in the SDK itself. So, that's what I'm assuming to add the LTV implementation. Some kind of comments, including related to that method itself, can be saved. That'd be another thing we can do.

    I think it should be more like not the context itself. I think it should be like activity there because context can be like having you can say we are using some kind of fragment. So in that case, this code may create some issues. So yeah. And other than that, if we want to like pass some internal data, but then do it so we can't do that in as well. And so just wanted to make it safe within different parts of the application. It is more accessible if you like to read some activity level or you can see application level to start the activity. So that will be a great approach for me. So yeah. I would suggest to like add activity or fragment itself to access the start activity tool. So, yeah, if there is an activity so that contact should be activity and there is a fragment. So then it should be related to the fragment itself. So that will be a data point for me.

    The user data is not initialized. So first of all, it's not going to call that database dot save dot hit options. You can say the data we have in it. And so other than that, it will be creating it will be calling the notes and the data we have. Right? And another issue I'm seeing is there's a backslash into the user data itself, which will be not to make us create or you can say call that log file itself. So if it's possible to add the backslash into the double quotes itself, or we can just directly remove those things because we don't require the backslashes there. So yeah. That will be the output of that same function.

    So, first of all, I would suggest you use some kind of filtering that don't use cluster images into the meeting. So, you should be using the web or I would suggest you do the SMG. Right? So you can convert the last size into a number itself and don't use the unused. You can save third-party live versions in the APT and try to find some smaller options to it. So it can make our app access, you can say, create some less in this size as well as well. Other than that, we should be using the unified enable to, like, enable it to the URL itself so it can remove unnecessary initialization, the ones which will be like, you know, to use anywhere and the unmute method as well. So all unknown resources can be, like, that is, you can say, removed from the APK bundle itself. Other than that, we can use shrink resources as well if we want to. But, it's like, not mandatory because it can create resources into low quality as well. So, yeah, that's the other thing we can do. Other than that, I would suggest using the code certification and the nullified enable from the add-on itself. And, yeah, if we use APK, then it will have more size than the AR bundle if we are uploading that to the Play Store. And it is, you know, it will be also a requirement. We can't say it's required. It can be, say, like, a preferred way to upload some app bundle to the Play Store on that particular app itself. So it makes us distribute distribution available for the larger available with the and put the last phone, you can say, less sizing to the event field itself. So we can do.

    So, ProGuard, as you know, if we have properties, we are referring to where settings are stored, specifically the vehicle ID settings. You can have the integrated MD settings and the ProGuard card and the property wrapper. There is also the side, the ProGuard card and the configuration will be there. And those should also return into the several billing itself to allow our app to be more secure over reverse engineering, having our code equal to other things as well. So, that's the other thing we can do to make our code more difficult to recompile and access our APD code. So that's the other thing we can do.

    Okay, as you know, Dagger is a way to implement dependency injection into the app itself. So basically, if we want to implement that, I prefer to use the link itself into the Android app. So we require a hybrid build app. The annotations we have are useful. There are other things we can do. We need to create an object if we are using Kotlin to create the app module and the Retrofit on the settings at home module. We can provide it according to what's left. If I'm requiring those things, I can provide them once with the current kind of context using the annotation of single time. I need to create a provider and the modules where we want to provide any kind of instance when we access those things. I am accessing the repository in a new model. We can create them injectable into that new model itself, or in the new model if we are using Jetpack Compose in that case. This also helps us to decouple things and follow the solid principles deal. Lower mobile, for instance, cannot be dependent on lower mobile systems. That's why dependency injection is a necessary thing to have in the Android app.