Sunday, November 3, 2019

How to Learn Android Programming Effectively as a Beginner

No comments email this post Edit Post

Many beginners struggle when starting Android development because they are unsure where to begin.

Common questions include:

  • Should I read books?
  • Should I watch YouTube tutorials?
  • Should I buy paid courses?
  • How do I actually start building apps?

The truth is that there is no single perfect learning method for everyone. However, there are practical approaches that consistently help beginners become better Android developers faster.

In this guide, we will discuss a realistic roadmap to learning Android programming effectively.


1. Start With a Beginner-Friendly Book or Course

When you know absolutely nothing about programming, structured learning is important.

A good beginner book or video course helps you:

  • Understand programming basics
  • Learn Android terminology
  • Avoid confusion
  • Follow a proper learning order

Trying to learn everything randomly from the internet can overwhelm beginners because:

  • Information may be outdated
  • Tutorial quality varies
  • There is too much content available

Recommended Beginner Resources

  • Head First Java
  • Android Developer Documentation
  • Kotlin Official Documentation
  • Android Basics by Google

Important Tip

Do not spend months only reading theory.

Your goal should be:

  • Understand basics quickly
  • Start building projects early
  • Learn by solving real problems

2. Start Building Real Android Projects

The fastest way to learn Android development is by building applications.

Theory alone will not make concepts stick permanently. Practical implementation is what builds real development skills.


Best Beginner Android Project Ideas

  • To-do list app
  • Notes app
  • Expense tracker
  • Calculator app
  • Habit tracker
  • Weather app
  • Quiz app

Why Building Projects Is Important

While building projects, you naturally learn:

  • UI design
  • Navigation
  • RecyclerView
  • SQLite or Room database
  • API integration
  • Architecture patterns
  • Debugging

Every project introduces new real-world challenges that improve your problem-solving ability.


3. Use Google and Stack Overflow Extensively

Professional developers constantly search for solutions online.

Even experienced Android developers use:

  • Google
  • Stack Overflow
  • GitHub
  • Official Android documentation
  • Reddit communities

How to Search Properly

Instead of searching:


How to build Instagram app?

Search specific problems like:


How to implement RecyclerView pagination in Android

How to save Room database data in Android

Always Check Content Freshness

Android development changes rapidly.

Always check:

  • Publication date
  • Android API version
  • Library version
  • Official recommendations

4. Watch YouTube Tutorials Strategically

YouTube is excellent for:

  • Visual learning
  • UI implementation
  • Project walkthroughs
  • Architecture explanations

However, YouTube tutorials should supplement learning — not completely replace documentation and practical coding.


Common Problems With YouTube Tutorials

  • Outdated code
  • Copy-paste learning
  • Incomplete explanations
  • Bad architecture practices

Best Way to Use Tutorials

  1. Watch tutorial for overview
  2. Understand the concept
  3. Build project yourself
  4. Modify features independently
  5. Experiment with improvements

5. Learn Kotlin Instead of Only Java

Modern Android development primarily uses Kotlin.

Google officially recommends Kotlin for Android applications.


Why Kotlin Is Better for Modern Android

Java Kotlin
More boilerplate code Cleaner syntax
Older Android language Official modern language
Verbose Concise and safer

6. Learn Modern Android Development

Modern Android interviews and companies expect developers to know:

  • Kotlin
  • Jetpack Compose
  • MVVM Architecture
  • Coroutines
  • Room Database
  • Retrofit
  • Flow & StateFlow
  • Hilt Dependency Injection
  • Navigation Component

7. Understand That Learning Takes Time

Programming can feel frustrating in the beginning.

You will frequently encounter:

  • Errors
  • Crashes
  • Confusing concepts
  • Debugging problems

This is completely normal.

Every experienced developer learned through:

  • Practice
  • Mistakes
  • Debugging
  • Experimentation

Recommended Beginner Android Learning Roadmap

Phase 1 — Programming Basics

  • Variables
  • Functions
  • Loops
  • Conditions
  • OOP concepts

Phase 2 — Android Basics

  • Activities
  • Fragments
  • Layouts
  • RecyclerView
  • Intents

Phase 3 — Intermediate Android

  • API integration
  • Room database
  • Firebase
  • Authentication
  • Architecture patterns

Phase 4 — Advanced Android

  • Jetpack Compose
  • Clean Architecture
  • Dependency Injection
  • Performance optimization
  • Scalable app architecture

Important Advice for Beginners

  • Do not compare yourself with others
  • Focus on consistency
  • Build projects continuously
  • Learn debugging properly
  • Read official documentation
  • Practice daily

Conclusion

Learning Android programming becomes easier when you combine:

  • Structured learning
  • Practical projects
  • Google searches
  • Documentation reading
  • Continuous experimentation

The most important step is starting real projects as early as possible. That is where actual learning happens.

Modern Android development offers powerful tools and opportunities for developers willing to learn consistently.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Saturday, November 2, 2019

How to Integrate Razorpay Payment Gateway in Android

No comments email this post Edit Post

Razorpay is one of the most widely used payment gateways in India for Android applications.

It supports:

  • UPI payments
  • Credit cards
  • Debit cards
  • Net banking
  • Wallet payments

Razorpay integration is fast, developer-friendly, and requires minimal code for basic payment implementation.

In this tutorial, we will learn how to integrate Razorpay Payment Gateway in Android using the official Razorpay Android SDK.


Features of Razorpay Android SDK

  • Fast payment integration
  • Multiple payment methods
  • UPI support
  • Secure payment processing
  • Custom branding support
  • Production-ready checkout UI

Requirements

  • Minimum SDK 19 or higher
  • Android Studio
  • Internet connection
  • Razorpay account

Step 1 — Create New Android Project

Open Android Studio and create a new Android project.

  1. Click File → New Project
  2. Select Empty Activity
  3. Choose Java or Kotlin
  4. Finish project setup

Step 2 — Add Razorpay Dependency

Open build.gradle and add:


dependencies {

    implementation 'com.razorpay:checkout:1.6.33'
}

Then sync the Gradle project.


Step 3 — Add Permissions and API Key

Open AndroidManifest.xml.

Add Internet permission:


<uses-permission
    android:name="android.permission.INTERNET"/>

Add Razorpay API Key

Inside the <application> tag:


<meta-data
    android:name="com.razorpay.ApiKey"
    android:value="YOUR_RAZORPAY_KEY"/>

Replace:


YOUR_RAZORPAY_KEY

with your actual Razorpay API key.


Step 4 — Create activity_checkout.xml

Create layout file inside:


res/layout/activity_checkout.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <EditText
        android:id="@+id/editTextAmount"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Enter Amount"
        android:inputType="numberDecimal"/>

    <Button
        android:id="@+id/buttonPay"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Pay Now"
        android:layout_marginTop="16dp"/>

</LinearLayout>

Step 5 — Create CheckoutActivity.java

Create:


CheckoutActivity.java

package com.example.razorpayexample;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.razorpay.Checkout;
import com.razorpay.PaymentResultListener;

import org.json.JSONObject;

public class CheckoutActivity
        extends AppCompatActivity
        implements PaymentResultListener {

    private EditText editTextAmount;

    private Button buttonPay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_checkout);

        editTextAmount =
                findViewById(R.id.editTextAmount);

        buttonPay =
                findViewById(R.id.buttonPay);

        buttonPay.setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View view) {

                        if (editTextAmount.getText()
                                .toString()
                                .trim()
                                .isEmpty()) {

                            Toast.makeText(
                                    CheckoutActivity.this,
                                    "Enter payment amount",
                                    Toast.LENGTH_SHORT
                            ).show();

                            return;
                        }

                        startPayment();
                    }
                });
    }

    private void startPayment() {

        final Activity activity = this;

        final Checkout checkout =
                new Checkout();

        try {

            JSONObject options =
                    new JSONObject();

            options.put(
                    "name",
                    "CodeChain Dev"
            );

            options.put(
                    "description",
                    "Demo Payment"
            );

            options.put(
                    "currency",
                    "INR"
            );

            String payment =
                    editTextAmount
                            .getText()
                            .toString();

            double total =
                    Double.parseDouble(payment);

            total = total * 100;

            options.put("amount", total);

            JSONObject prefill =
                    new JSONObject();

            prefill.put(
                    "email",
                    "example@gmail.com"
            );

            prefill.put(
                    "contact",
                    "9999999999"
            );

            options.put(
                    "prefill",
                    prefill
            );

            checkout.open(activity, options);

        } catch (Exception e) {

            Toast.makeText(
                    activity,
                    "Payment Error: "
                            + e.getMessage(),
                    Toast.LENGTH_SHORT
            ).show();

            e.printStackTrace();
        }
    }

    @Override
    public void onPaymentSuccess(
            String razorpayPaymentId
    ) {

        Toast.makeText(
                this,
                "Payment Successful",
                Toast.LENGTH_SHORT
        ).show();
    }

    @Override
    public void onPaymentError(
            int code,
            String response
    ) {

        Toast.makeText(
                this,
                "Payment Failed",
                Toast.LENGTH_SHORT
        ).show();
    }
}

How Razorpay Payment Flow Works

The workflow is:

  1. User enters amount
  2. User clicks Pay button
  3. Razorpay Checkout opens
  4. User completes payment
  5. Payment callback returns success or failure

Understanding Razorpay Amount System

Razorpay expects payment amount in:


Paise

Example:

INR Paise
1 INR 100
500 INR 50000

That is why:


total = total * 100;

Common Mistakes Developers Make

1. Using Wrong API Key

Always use:

  • Test key for development
  • Live key for production

2. Forgetting Internet Permission

Without Internet permission, Razorpay Checkout cannot connect to servers.


3. Trusting Frontend Success Only

Frontend payment success is NOT enough for production applications.


Important Production Security Recommendations

Production applications should ALWAYS:

  • Verify payments on backend
  • Validate Razorpay signature
  • Store transaction logs securely
  • Prevent duplicate transactions
  • Use HTTPS APIs

Modern Android Improvements

Modern Android applications can improve this integration using:

  • Kotlin
  • MVVM Architecture
  • Jetpack Compose
  • Coroutines
  • Retrofit API integration
  • Secure backend validation

Razorpay vs UPI Intent Integration

Razorpay UPI Intent
Supports multiple payment methods Mainly UPI only
Professional checkout UI Basic app switching
Backend payment ecosystem Lightweight integration

FAQ

Does Razorpay support UPI?

Yes. Razorpay supports UPI payments along with cards, wallets, and net banking.

Can I test payments without real money?

Yes. Razorpay provides test mode with test credentials.

Is backend verification necessary?

Yes. Production systems must verify payment signatures securely on backend.


Conclusion

Razorpay provides one of the simplest ways to integrate secure payment functionality into Android applications.

Its SDK reduces development complexity while supporting multiple payment methods through a professional checkout experience.

For production applications, developers should combine frontend payment flow with secure backend verification systems.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and payment integrations.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Monday, October 28, 2019

Android Floating Context Menu Tutorial — Long Press Menu in Android

No comments email this post Edit Post

Floating Context Menu in Android is a contextual popup menu that appears when the user performs a long press on a view.

It is commonly used for:

  • Edit options
  • Delete actions
  • Copy/Paste menus
  • Item-specific actions
  • Contextual interactions

In this tutorial, we will learn:

  • How Floating Context Menu works
  • How to register views for context menu
  • How to inflate menu XML
  • How to handle menu item clicks
  • How to add header titles
  • Modern AndroidX implementation

What Is a Floating Context Menu?

A Floating Context Menu is a popup menu displayed when a user:

  • Long presses a view
  • Long presses a list item
  • Performs contextual interaction

It provides actions related to the selected view.


Common Use Cases

  • Text editing
  • Chat message options
  • Delete/Share actions
  • File management
  • RecyclerView item actions

Important Modern Android Note

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

What We Will Build

In this example:

  • Long press a TextView
  • Show floating context menu
  • Handle menu selections
  • Display Toast messages

Step 1 — Create activity_main.xml

Create:


res/layout/activity_main.xml

Modern ConstraintLayout Example


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:id="@+id/text_view"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Long Press Me"

        android:textSize="30sp"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Why Use ConstraintLayout?

ConstraintLayout provides:

  • Flat view hierarchy
  • Better performance
  • Responsive layouts
  • Flexible positioning

Step 2 — Create Menu XML

Create:


res/menu/example_menu.xml

example_menu.xml


<?xml version="1.0" encoding="utf-8"?>

<menu
    xmlns:android=
    "http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/option_1"

        android:title="Option 1"/>

    <item
        android:id="@+id/option_2"

        android:title="Option 2"/>

</menu>

What Is Menu XML?

Android menu XML files define:

  • Menu items
  • Icons
  • Titles
  • Actions
  • Submenus

Step 3 — Create MainActivity.java


package com.example.contextmenu;

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );

        TextView textView =
                findViewById(
                        R.id.text_view
                );

        registerForContextMenu(
                textView
        );
    }

    @Override
    public void onCreateContextMenu(
            ContextMenu menu,
            View v,
            ContextMenu.ContextMenuInfo menuInfo
    ) {

        super.onCreateContextMenu(
                menu,
                v,
                menuInfo
        );

        menu.setHeaderTitle(
                "Choose your option"
        );

        getMenuInflater().inflate(
                R.menu.example_menu,
                menu
        );
    }

    @Override
    public boolean onContextItemSelected(
            @NonNull MenuItem item
    ) {

        if (
            item.getItemId()
            == R.id.option_1
        ) {

            Toast.makeText(
                    this,
                    "Option 1 Selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.option_2
        ) {

            Toast.makeText(
                    this,
                    "Option 2 Selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;
        }

        return super
                .onContextItemSelected(
                        item
                );
    }
}

How Floating Context Menu Works

  1. User long presses TextView
  2. Android calls onCreateContextMenu()
  3. Menu XML gets inflated
  4. Menu appears as popup
  5. User selects menu item
  6. onContextItemSelected() executes

Understanding registerForContextMenu()

This method registers a View for contextual menu interaction.

Example:


registerForContextMenu(textView);

What Is onCreateContextMenu()?

This callback creates the context menu dynamically.

Inside this method:

  • Set menu title
  • Inflate menu XML
  • Customize menu items

What Is onContextItemSelected()?

This method handles menu item clicks.

Used for:

  • Edit actions
  • Delete actions
  • Copy actions
  • Custom operations

Adding Header Title

Context menus support custom titles using:


menu.setHeaderTitle()

Example


menu.setHeaderTitle(
        "Choose your option"
);

Context Menu vs Popup Menu

Context Menu Popup Menu
Appears on long press Appears on click
Contextual actions Overflow actions
Attached to view/item Attached to anchor view

Modern Android Recommendations

Modern Android applications commonly use:

  • RecyclerView contextual menus
  • PopupMenu
  • Bottom Sheets
  • Material Design menus
  • Jetpack Compose DropdownMenu

RecyclerView Context Menu

Floating Context Menus are commonly used with:

  • RecyclerView items
  • Chat messages
  • File explorers
  • Social media posts

Jetpack Compose Alternative

Jetpack Compose now uses:


DropdownMenu

instead of XML-based context menus.


Compose Example


DropdownMenu(
    expanded = expanded,
    onDismissRequest = {}
)

Common Beginner Mistakes

1. Forgetting registerForContextMenu()

Views must be registered for context menus.


2. Using Deprecated Android Support Libraries

Always use AndroidX libraries.


3. Missing Menu XML

Context menu requires proper menu resource file.


Best Practices

  • Keep menu options minimal
  • Use meaningful contextual actions
  • Prefer Material Design menus
  • Use icons when necessary
  • Handle item clicks cleanly

FAQ

What is Floating Context Menu in Android?

A contextual popup menu shown when user long presses a view.


How do I show Context Menu?

Use:


registerForContextMenu(view)

What is the modern alternative?

PopupMenu, Bottom Sheets, and Jetpack Compose DropdownMenu are modern alternatives.


Conclusion

Floating Context Menu is a useful Android UI component for contextual interactions and quick actions.

It provides an elegant way to show item-specific actions using long press gestures.

Modern Android applications should combine AndroidX, Material Design components, RecyclerView integration, and scalable UI architecture for production-grade user experiences.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Android PopupMenu Tutorial — Create Modern Popup Menus in Android

No comments email this post Edit Post

PopupMenu in Android is a lightweight floating menu anchored to a specific view.

It is commonly used for:

  • Overflow menus
  • Quick actions
  • Item operations
  • Contextual options
  • Action buttons

In this tutorial, we will learn:

  • What PopupMenu is
  • How to create PopupMenu
  • How to inflate menu XML
  • How to handle item clicks
  • Modern AndroidX implementation
  • Material Design recommendations

What Is PopupMenu?

PopupMenu is a floating menu that appears anchored to a View.

Unlike ContextMenu:

  • PopupMenu appears on click
  • ContextMenu appears on long press

Common PopupMenu Use Cases

  • Toolbar overflow menus
  • RecyclerView item actions
  • Chat message options
  • More options buttons
  • File operations

PopupMenu vs ContextMenu

PopupMenu ContextMenu
Appears on click Appears on long press
Anchored to view Contextual interaction
Quick actions Item-specific operations

Important Modern Android Note

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

What We Will Build

In this example:

  • User clicks button
  • PopupMenu appears
  • User selects menu item
  • Toast message displays

Step 1 — Create activity_main.xml

Create:


res/layout/activity_main.xml

Modern ConstraintLayout Example


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <Button

        android:id="@+id/button_popup"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Show Popup"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Why Use ConstraintLayout?

ConstraintLayout provides:

  • Better performance
  • Responsive layouts
  • Flat hierarchy
  • Flexible positioning

Step 2 — Create Menu XML

Create:


res/menu/popup_menu.xml

popup_menu.xml


<?xml version="1.0" encoding="utf-8"?>

<menu
    xmlns:android=
    "http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/item1"

        android:title="Item 1"/>

    <item
        android:id="@+id/item2"

        android:title="Item 2"/>

    <item
        android:id="@+id/item3"

        android:title="Item 3"/>

    <item
        android:id="@+id/item4"

        android:title="Item 4"/>

</menu>

Understanding Menu XML

Menu XML files define:

  • Menu items
  • Icons
  • Titles
  • Actions
  • Submenus

Step 3 — Create MainActivity.java


package com.example.popupmenu;

import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;

public class MainActivity
        extends AppCompatActivity
        implements PopupMenu
        .OnMenuItemClickListener {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );

        Button button =
                findViewById(
                        R.id.button_popup
                );

        button.setOnClickListener(
                this::showPopup
        );
    }

    public void showPopup(
            View view
    ) {

        PopupMenu popupMenu =
                new PopupMenu(
                        this,
                        view
                );

        popupMenu.setOnMenuItemClickListener(
                this
        );

        popupMenu.inflate(
                R.menu.popup_menu
        );

        popupMenu.show();
    }

    @Override
    public boolean onMenuItemClick(
            @NonNull MenuItem item
    ) {

        if (
            item.getItemId()
            == R.id.item1
        ) {

            Toast.makeText(
                    this,
                    "Item 1 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.item2
        ) {

            Toast.makeText(
                    this,
                    "Item 2 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.item3
        ) {

            Toast.makeText(
                    this,
                    "Item 3 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            item.getItemId()
            == R.id.item4
        ) {

            Toast.makeText(
                    this,
                    "Item 4 clicked",
                    Toast.LENGTH_SHORT
            ).show();

            return true;
        }

        return false;
    }
}

How PopupMenu Works

  1. User clicks button
  2. PopupMenu object created
  3. Menu XML inflated
  4. Popup menu displayed
  5. User selects item
  6. onMenuItemClick() executes

Understanding PopupMenu Constructor


PopupMenu(
    context,
    anchorView
)

PopupMenu requires:

  • Context
  • Anchor View

What Is inflate()?

The:


inflate()

method loads menu XML into PopupMenu.


Example


popupMenu.inflate(
        R.menu.popup_menu
);

What Is setOnMenuItemClickListener()?

This listener handles menu item click events.


Example


popupMenu
.setOnMenuItemClickListener(
        this
);

Modern Android Recommendations

Modern Android applications commonly use:

  • PopupMenu
  • Material Toolbar menus
  • Bottom Sheets
  • RecyclerView item menus
  • Jetpack Compose DropdownMenu

PopupMenu in RecyclerView

PopupMenus are heavily used inside:

  • Chat applications
  • Social media apps
  • File managers
  • E-commerce product lists

Modern Material Design Menus

Material Design now recommends:

  • Minimal actions
  • Clear icons
  • Bottom sheets for complex actions
  • Responsive menu behavior

Jetpack Compose Alternative

Jetpack Compose now uses:


DropdownMenu

instead of XML PopupMenus.


Compose Example


DropdownMenu(
    expanded = expanded,
    onDismissRequest = {}
)

PopupMenu vs BottomSheet

PopupMenu BottomSheet
Small quick actions Complex actions
Lightweight Large interaction UI
Anchored to view Slides from bottom

Common Beginner Mistakes

1. Using Deprecated Support Libraries

Always use AndroidX libraries.


2. Forgetting Menu XML

PopupMenu requires valid menu resource file.


3. Using Too Many Menu Items

Keep PopupMenu simple and minimal.


Best Practices

  • Use concise menu options
  • Use icons carefully
  • Prefer Material Design styling
  • Keep actions contextual
  • Use BottomSheets for complex flows

FAQ

What is PopupMenu in Android?

PopupMenu is a floating contextual menu anchored to a View.


How do I show PopupMenu?

Create PopupMenu object and call:


popupMenu.show()

What is the modern alternative?

Jetpack Compose DropdownMenu and Material BottomSheets are modern alternatives.


Conclusion

PopupMenu is a simple and efficient Android UI component for displaying quick contextual actions.

It improves user interaction while keeping the UI clean and lightweight.

Modern Android applications should combine AndroidX, Material Design, responsive layouts, and scalable architecture for production-grade user experiences.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Saturday, October 26, 2019

Firebase Firestore Android Tutorial — Store & Retrieve Data in Realtime

No comments email this post Edit Post

Cloud Firestore is one of the most powerful cloud-hosted NoSQL databases provided by Firebase.

It allows Android applications to:

  • Store realtime data
  • Sync across devices
  • Work offline
  • Scale automatically
  • Store structured documents

In this tutorial series, we will learn:

  • Firestore setup
  • Save documents
  • Retrieve documents
  • Realtime listeners
  • Queries
  • Pagination
  • Transactions
  • Subcollections

Firestore Tutorial Series

  • Part 1 – Introduction
  • Part 2 – Preparations & Set Document
  • Part 3 – Get Document
  • Part 4 – SnapshotListener
  • Part 5 – Merge & Update
  • Part 6 – Delete Field & Document
  • Part 7 – Custom Objects
  • Part 8 – Add & Retrieve Multiple Documents
  • Part 9 – Simple Queries
  • Part 10 – Compound Queries
  • Part 11 – OR Queries
  • Part 12 – Pagination
  • Part 13 – DocumentChanges
  • Part 14 – Batched Writes
  • Part 15 – Transactions
  • Part 16 – Arrays
  • Part 17 – Nested Objects
  • Part 18 – Subcollections

What Is Firebase Firestore?

Cloud Firestore is a cloud-hosted realtime NoSQL database provided by Firebase.

Firestore allows developers to:

  • Store structured data
  • Sync data in realtime
  • Build scalable apps
  • Support offline mode
  • Work across multiple platforms

Firestore Data Structure

Firestore stores data using:

  • Collections
  • Documents
  • Fields
  • Subcollections

Firestore Hierarchy


Collection
    └── Document
            └── Fields
                    └── Subcollection

Supported Firestore Data Types

  • String
  • Integer
  • Boolean
  • Timestamp
  • GeoPoint
  • Array
  • Map / Nested Object
  • Binary Data

Why Use Firestore?

  • Realtime synchronization
  • Offline support
  • Automatic scaling
  • Serverless backend
  • Secure Firebase integration
  • Android, iOS, Web support

Firestore vs Realtime Database

Realtime Database Firestore
JSON tree structure Document-based structure
Less scalable queries Advanced querying
Limited indexing Automatic indexing
Older Firebase database Modern Firebase database

Official Firebase Links

Firestore Data Model:

https://firebase.google.com/docs/firestore/data-model

Firestore vs Realtime Database:

https://firebase.google.com/docs/firestore/rtdb-vs-firestore


Part 2 — Setup Firebase Firestore

To use Firestore in Android:

  • Create Firebase project
  • Connect app to Firebase
  • Add Firebase dependencies
  • Initialize Firestore

Modern Firebase Dependency Setup

Inside:


build.gradle

Add:


implementation platform(
'com.google.firebase:firebase-bom:33.1.0'
)

implementation
'com.google.firebase:firebase-firestore'

Important Modernization

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

Modern activity_main.xml


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:padding="16dp">

    <EditText
        android:id="@+id/edit_text_title"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="Title"/>

    <EditText
        android:id="@+id/edit_text_description"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:hint="Description"/>

    <Button
        android:id="@+id/button_save"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Save"/>

    <Button
        android:id="@+id/button_load"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="Load"/>

    <TextView
        android:id="@+id/text_view_data"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:textSize="18sp"/>

</LinearLayout>

Initialize Firestore


FirebaseFirestore db =
        FirebaseFirestore
        .getInstance();

Save Data to Firestore

Firestore stores data inside:

  • Collections
  • Documents

Firestore Save Example


Map<String, Object> note =
        new HashMap<>();

note.put("title", title);

note.put("description", description);

db.collection("Notebook")
        .document("My First Note")
        .set(note);

Understanding Firestore Save Flow

  1. Create collection
  2. Create document
  3. Create fields
  4. Upload document to cloud

Using Success Listener


.addOnSuccessListener(
        unused -> {

        }
)

Triggered when upload succeeds.


Using Failure Listener


.addOnFailureListener(
        e -> {

        }
)

Triggered when upload fails.


Modern Save Example


db.collection("Notebook")
        .document("My First Note")
        .set(note)

        .addOnSuccessListener(
                unused -> {

                    Toast.makeText(
                            this,
                            "Saved",
                            Toast.LENGTH_SHORT
                    ).show();
                }
        )

        .addOnFailureListener(
                e -> {

                    Log.d(
                            "Firestore",
                            e.toString()
                    );
                }
        );

Part 3 — Retrieve Firestore Document

Firestore documents can be retrieved using:


get()

Firestore Document Reference


DocumentReference noteRef =
        db.document(
                "Notebook/My First Note"
        );

Retrieve Document Example


noteRef.get()

.addOnSuccessListener(
        documentSnapshot -> {

            if (
                documentSnapshot.exists()
            ) {

                String title =
                        documentSnapshot
                        .getString("title");

                String description =
                        documentSnapshot
                        .getString(
                                "description"
                        );
            }
        }
);

What Is DocumentSnapshot?

DocumentSnapshot contains:

  • Document data
  • Field values
  • Metadata
  • Existence status

Check If Document Exists


if(documentSnapshot.exists())

Always check document existence before accessing data.


Realtime Firestore Features

Firestore supports:

  • Realtime updates
  • Automatic synchronization
  • Offline caching
  • Live listeners

What Is SnapshotListener?

SnapshotListener listens for realtime document updates.


SnapshotListener Example


noteRef.addSnapshotListener(
        (snapshot, error) -> {

        }
);

Firestore Query Features

Firestore supports:

  • whereEqualTo()
  • whereGreaterThan()
  • orderBy()
  • limit()
  • Pagination

Firestore Security Rules

Firestore security rules protect database access.

Example:


rules_version = '2';

service cloud.firestore {

  match /databases/{database}/documents {

    match /{document=**} {

      allow read, write:
          if request.auth != null;
    }
  }
}

Modern Android Recommendations

Modern Android applications commonly use:

  • MVVM Architecture
  • Repository Pattern
  • Coroutines
  • Flow / LiveData
  • ViewModel
  • Jetpack Compose

Firestore + MVVM Architecture

Recommended structure:


UI
    ↓
ViewModel
    ↓
Repository
    ↓
Firestore

Using Kotlin Coroutines

Modern Firestore apps commonly use:


suspend functions

instead of callbacks.


Common Beginner Mistakes

1. Not Setting Security Rules

Never leave Firestore fully public in production.


2. Storing Large Nested Data

Use subcollections for scalable structures.


3. Ignoring Offline Support

Firestore automatically supports offline persistence.


Best Practices

  • Use collections properly
  • Use document IDs wisely
  • Keep documents small
  • Use indexes for queries
  • Apply secure Firestore rules

FAQ

What is Firestore?

Firestore is Firebase’s modern realtime NoSQL cloud database.


Does Firestore support realtime updates?

Yes. Firestore supports realtime synchronization across devices.


Can Firestore work offline?

Yes. Firestore includes offline caching support.


Conclusion

Firebase Firestore is one of the best cloud databases for modern Android applications.

It provides realtime synchronization, offline support, scalable architecture, and seamless Firebase integration.

Modern Android applications should combine Firestore, MVVM architecture, AndroidX, secure Firestore rules, and scalable backend architecture for production-grade applications.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Android Options Menu Tutorial — Toolbar Menu & Overflow Menu in Android

No comments email this post Edit Post

Options Menu in Android is one of the most commonly used UI components for displaying actions inside the app bar or toolbar.

It is commonly used for:

  • Settings
  • Search
  • Share
  • Profile actions
  • Overflow menus
  • Toolbar actions

In this tutorial, we will learn:

  • How Options Menu works
  • How to create menu XML
  • How to show menu items in Toolbar
  • How to create submenus
  • How to handle menu item clicks
  • Modern AndroidX implementation

What Is Options Menu?

Options Menu is the primary collection of menu items for an Android Activity.

It usually appears:

  • Inside Toolbar
  • Inside AppBar
  • Inside Overflow Menu

Common Use Cases

  • Search actions
  • Settings screens
  • Logout button
  • Toolbar actions
  • Navigation shortcuts

Important Modern Android Note

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

What We Will Build

In this example:

  • Create Toolbar menu
  • Add icons
  • Create dropdown menu
  • Create submenu
  • Handle click events
  • Show Toast messages

Step 1 — Create activity_main.xml

Create:


res/layout/activity_main.xml

Modern ConstraintLayout Example


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Android Options Menu"

        android:textSize="24sp"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Why Use ConstraintLayout?

ConstraintLayout provides:

  • Better rendering performance
  • Responsive layouts
  • Flat hierarchy
  • Flexible positioning

Step 2 — Create Menu Resource Directory

Inside:


res

Create:


menu

directory.


Step 3 — Create example_menu.xml

Create:


res/menu/example_menu.xml

Modern Menu XML Example


<?xml version="1.0" encoding="utf-8"?>

<menu
    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto">

    <item

        android:id="@+id/item1"

        android:icon="@drawable/ic_home"

        android:title="Home"

        app:showAsAction="ifRoom"/>

    <item

        android:id="@+id/item2"

        android:title="Settings"

        app:showAsAction="never"/>

    <item

        android:id="@+id/item3"

        android:title="More"

        app:showAsAction="never">

        <menu>

            <item

                android:id="@+id/subitem1"

                android:title="Profile"/>

            <item

                android:id="@+id/subitem2"

                android:title="Logout"/>

        </menu>

    </item>

</menu>

Understanding Menu XML

Menu XML defines:

  • Menu items
  • Icons
  • Submenus
  • Toolbar actions
  • Overflow menu behavior

Understanding showAsAction

Value Description
ifRoom Show in Toolbar if space available
always Always show in Toolbar
never Show inside overflow menu

Step 4 — Create MainActivity.java


package com.example.optionsmenu;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );
    }

    @Override
    public boolean onCreateOptionsMenu(
            Menu menu
    ) {

        MenuInflater inflater =
                getMenuInflater();

        inflater.inflate(
                R.menu.example_menu,
                menu
        );

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(
            @NonNull MenuItem item
    ) {

        int id = item.getItemId();

        if (id == R.id.item1) {

            Toast.makeText(
                    this,
                    "Home selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.item2
        ) {

            Toast.makeText(
                    this,
                    "Settings selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.subitem1
        ) {

            Toast.makeText(
                    this,
                    "Profile selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;

        } else if (
            id == R.id.subitem2
        ) {

            Toast.makeText(
                    this,
                    "Logout selected",
                    Toast.LENGTH_SHORT
            ).show();

            return true;
        }

        return super
                .onOptionsItemSelected(
                        item
                );
    }
}

How Options Menu Works

  1. Activity starts
  2. Android calls onCreateOptionsMenu()
  3. Menu XML inflated
  4. Toolbar menu displayed
  5. User clicks item
  6. onOptionsItemSelected() executes

What Is onCreateOptionsMenu()?

This method creates Toolbar menu items dynamically.


Example


inflater.inflate(
        R.menu.example_menu,
        menu
);

What Is onOptionsItemSelected()?

This method handles Toolbar item click events.


Toolbar vs ActionBar

ActionBar Toolbar
Older implementation Modern customizable component
Less flexible Highly customizable

Modern Android Recommendation

Modern Android apps should use:

  • Material Toolbar
  • AndroidX AppCompat
  • Navigation Component
  • Material Design 3
  • Jetpack Compose TopAppBar

Modern Material Toolbar Example


<com.google.android.material.appbar.MaterialToolbar

    android:id="@+id/toolbar"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"/>

Jetpack Compose Alternative

Jetpack Compose now uses:


TopAppBar

instead of XML Toolbar menus.


Compose Example


TopAppBar(
    title = {
        Text("Toolbar")
    }
)

Options Menu vs PopupMenu

Options Menu PopupMenu
Toolbar/AppBar menu Anchored floating menu
Global actions Contextual actions

Common Beginner Mistakes

1. Using Deprecated Support Libraries

Always migrate to AndroidX.


2. Forgetting Menu Directory

Menu XML files must be inside:


res/menu

3. Using Too Many Toolbar Icons

Keep Toolbar actions minimal and meaningful.


Best Practices

  • Use MaterialToolbar
  • Use meaningful icons
  • Keep Toolbar uncluttered
  • Use overflow menus wisely
  • Use Navigation Component

FAQ

What is Options Menu in Android?

Options Menu is the primary Toolbar/AppBar menu used for global actions.


Where is Options Menu displayed?

Inside Toolbar or AppBar.


What is the modern alternative?

Jetpack Compose TopAppBar and MaterialToolbar are modern implementations.


Conclusion

Options Menu is an essential Android UI component for displaying application-wide actions and Toolbar interactions.

It improves navigation, accessibility, and overall user experience.

Modern Android applications should combine AndroidX, Material Design 3, responsive layouts, Navigation Component, and scalable architecture for production-grade applications.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.

Android Up Button Tutorial — Back Navigation in Android Toolbar

No comments email this post Edit Post

Navigation is one of the most important parts of Android application development.

Android provides:

  • Back button navigation
  • Up button navigation
  • Navigation Component
  • Toolbar navigation

In this tutorial, we will learn how to implement:

  • Toolbar Up Button
  • Parent Activity navigation
  • AndroidManifest parent activities
  • Modern AndroidX navigation
  • Multi-activity back navigation

What Is Up Button in Android?

The Up Button is the back arrow shown inside the Toolbar or ActionBar.

It allows users to navigate:

  • Back to parent Activity
  • Up in application hierarchy
  • Between related screens

Difference Between Back Button and Up Button

Back Button Up Button
System navigation App hierarchy navigation
Returns previous screen Returns parent screen
Managed by Android system Managed by app developer

What We Will Build

In this example:

  • MainActivity opens Activity2
  • Activity2 opens Activity3
  • Toolbar Up Button navigates backward
  • Parent hierarchy handled automatically

Important Modern Android Note

Older tutorials use:


android.support.*

which is deprecated.

Modern Android applications should use:


androidx.*

Step 1 — Configure Parent Activities in AndroidManifest.xml

Every child activity should define:


android:parentActivityName

Modern Manifest Example


<application>

    <activity
        android:name=".Activity2"
        android:parentActivityName=
            ".MainActivity"/>

    <activity
        android:name=".Activity3"
        android:parentActivityName=
            ".Activity2"/>

    <activity
        android:name=".MainActivity">

        <intent-filter>

            <action
                android:name=
                "android.intent.action.MAIN"/>

            <category
                android:name=
                "android.intent.category.LAUNCHER"/>

        </intent-filter>

    </activity>

</application>

What Is parentActivityName?

This attribute defines the parent screen hierarchy.

Android uses it for:

  • Toolbar Up navigation
  • Task stack generation
  • Navigation consistency

Step 2 — Create MainActivity Layout

Create:


res/layout/activity_main.xml

Modern ConstraintLayout Version


<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.ConstraintLayout

    xmlns:android=
    "http://schemas.android.com/apk/res/android"

    xmlns:app=
    "http://schemas.android.com/apk/res-auto"

    android:layout_width="match_parent"

    android:layout_height="match_parent">

    <Button

        android:id="@+id/button"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="Open Activity 2"

        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintBottom_toBottomOf="parent"

        app:layout_constraintStart_toStartOf="parent"

        app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Why Use ConstraintLayout?

ConstraintLayout provides:

  • Better rendering performance
  • Responsive layouts
  • Flat hierarchy
  • Flexible positioning

Step 3 — Create MainActivity.java


package com.example.upbutton;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_main
        );

        Button button =
                findViewById(
                        R.id.button
                );

        button.setOnClickListener(
                view -> {

                    Intent intent =
                            new Intent(
                                    this,
                                    Activity2.class
                            );

                    startActivity(intent);
                }
        );
    }
}

Step 4 — Create Activity2.java


package com.example.upbutton;

import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class Activity2
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_2
        );

        if (
            getSupportActionBar()
            != null
        ) {

            getSupportActionBar()
                    .setTitle(
                            "Activity 2"
                    );

            getSupportActionBar()
                    .setDisplayHomeAsUpEnabled(
                            true
                    );
        }

        Button button2 =
                findViewById(
                        R.id.button2
                );

        button2.setOnClickListener(
                view -> {

                    Intent intent =
                            new Intent(
                                    this,
                                    Activity3.class
                            );

                    startActivity(intent);
                }
        );
    }
}

Understanding setDisplayHomeAsUpEnabled()

This method enables Toolbar Up Button.


Example


getSupportActionBar()
        .setDisplayHomeAsUpEnabled(
                true
        );

Step 5 — Create Activity3.java


package com.example.upbutton;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

public class Activity3
        extends AppCompatActivity {

    @Override
    protected void onCreate(
            Bundle savedInstanceState
    ) {

        super.onCreate(
                savedInstanceState
        );

        setContentView(
                R.layout.activity_3
        );

        if (
            getSupportActionBar()
            != null
        ) {

            getSupportActionBar()
                    .setTitle(
                            "Activity 3"
                    );

            getSupportActionBar()
                    .setDisplayHomeAsUpEnabled(
                            true
                    );
        }
    }
}

How Up Navigation Works

  1. User opens Activity2
  2. Toolbar arrow appears
  3. User taps Up Button
  4. Android checks parentActivityName
  5. Parent Activity opens

Activity Navigation Hierarchy


MainActivity
    ↓
Activity2
    ↓
Activity3

Modern Toolbar Recommendation

Modern Android apps should use:

  • MaterialToolbar
  • Navigation Component
  • Single Activity Architecture
  • Jetpack Compose Navigation

Modern Material Toolbar Example


<com.google.android.material.appbar.MaterialToolbar

    android:id="@+id/toolbar"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"/>

Navigation Component Alternative

Modern Android applications now commonly use:


Navigation Component

instead of multiple activities.


Benefits of Navigation Component

  • Automatic back stack handling
  • Safe navigation
  • Fragment navigation
  • Deep links
  • Animated transitions

Jetpack Compose Alternative

Jetpack Compose uses:


NavHost

and:


TopAppBar

for modern navigation systems.


Compose Navigation Example


NavHost(
    navController = navController,
    startDestination = "home"
)

Common Beginner Mistakes

1. Forgetting parentActivityName

Up navigation requires Manifest hierarchy configuration.


2. NullPointerException on ActionBar

Always check:


getSupportActionBar() != null

3. Using Deprecated Support Libraries

Always migrate to AndroidX.


Best Practices

  • Use MaterialToolbar
  • Use Navigation Component
  • Keep navigation hierarchy clean
  • Use AndroidX libraries
  • Prefer single activity architecture

FAQ

What is Up Button in Android?

Up Button is Toolbar back navigation for parent Activity hierarchy.


How do I enable Up Button?

Use:


setDisplayHomeAsUpEnabled(true)

What is the modern navigation solution?

Navigation Component and Jetpack Compose Navigation are modern solutions.


Conclusion

The Android Up Button provides clean hierarchical navigation between screens and improves application usability.

It is an essential part of Android navigation architecture and Toolbar design.

Modern Android applications should combine AndroidX, Material Design, Navigation Component, and scalable architecture for production-grade navigation systems.


About the Author

Salil Jha is a Full Stack and Mobile Developer specializing in Android, React Native, fintech systems, scalable SaaS platforms, and developer tooling products.

CodeChain Dev — Build Modern Products. Solve Real Problems.