Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
7252d1b
chore(deps): bump com.google.devtools.ksp from 2.3.3 to 2.3.4
dependabot[bot] Dec 21, 2025
00be56c
chore(deps): bump androidx.compose:compose-bom
dependabot[bot] Dec 21, 2025
0e8aa95
chore(deps): bump org.json:json from 20250517 to 20251224
dependabot[bot] Dec 28, 2025
ad75c27
chore(deps): bump org.json:json from 20250517 to 20251224 (#75)
JeelDobariya38 Dec 29, 2025
67259f6
chore(deps): bump androidx.compose:compose-bom from 2025.12.00 to 202…
JeelDobariya38 Dec 29, 2025
b05a48d
chore(deps): bump com.google.devtools.ksp from 2.3.3 to 2.3.4 (#73)
JeelDobariya38 Dec 29, 2025
6d5f606
chore(deps): bump androidx.activity:activity-compose
dependabot[bot] Dec 29, 2025
51b392f
chore(deps): bump kotlin from 2.2.21 to 2.3.0
dependabot[bot] Dec 29, 2025
bf7d4dc
chore(deps): bump kotlin from 2.2.21 to 2.3.0 (#71)
JeelDobariya38 Dec 29, 2025
16f4bab
chore(deps): bump androidx.activity:activity-compose from 1.12.1 to 1…
JeelDobariya38 Dec 29, 2025
37972e4
chore(deps): add navigation 3 dependency
JeelDobariya38 Jan 6, 2026
36e17d4
refactor: the new jetpack compose main activity.
JeelDobariya38 Jan 8, 2026
b841a21
refactor: rename MainActivity -> JetpackPreviewLayoutActivity
JeelDobariya38 Jan 8, 2026
9258b45
feat: almost there to jetpack compose, super excited!!
JeelDobariya38 Jan 8, 2026
4671b62
feat: finally made the first screen in jetpack compose
JeelDobariya38 Jan 8, 2026
07374cf
chore: add dependabot categories in release.yml
JeelDobariya38 Jan 8, 2026
681833e
feat: improve design of new main screen
JeelDobariya38 Jan 9, 2026
fc91f03
feat: add app icon on new main screen
JeelDobariya38 Jan 10, 2026
fd1d8ba
refactor: move the mainscreen composeable to a new file
JeelDobariya38 Jan 10, 2026
e29b8e0
feat: add navigation 3 in the project
JeelDobariya38 Jan 10, 2026
9e06a97
feat: initial routes setup
JeelDobariya38 Jan 10, 2026
807fcc2
fix: oh, i forget to define the routes in nav display
JeelDobariya38 Jan 10, 2026
3c9ae82
fix: api level compatiablity problem
JeelDobariya38 Jan 11, 2026
868f39b
chore: edit the app label
JeelDobariya38 Jan 11, 2026
88aace9
feat: improve about, main and setting screen ui
JeelDobariya38 Jan 11, 2026
3475f09
chore(deps): setup compose in password manager module
JeelDobariya38 Jan 11, 2026
e66a881
feat: made a new ui for password manager screen
JeelDobariya38 Jan 11, 2026
075a29d
feat: made password manager new ui functional
JeelDobariya38 Jan 11, 2026
9500d02
feat: fix the colors
JeelDobariya38 Jan 11, 2026
10980cb
feat: made the save password screen
JeelDobariya38 Jan 14, 2026
9116ec4
feat: remove clutter from about us screen
JeelDobariya38 Jan 14, 2026
914d463
refactor: move routes definition to core module so it can be shared
JeelDobariya38 Jan 14, 2026
b8d7897
chore(feat): add a gemini nano banana generated passcodes banner
JeelDobariya38 Jan 14, 2026
4604ac5
refactor: improve the code by getting value
JeelDobariya38 Jan 14, 2026
d8763ce
feat: made floating password button work
JeelDobariya38 Jan 14, 2026
b0fdcc6
feat: improve deign of the save password screen
JeelDobariya38 Jan 14, 2026
b55a8b5
feat: try to connect datastore state to settings
JeelDobariya38 Jan 14, 2026
e16bedf
feat: made toggle working
JeelDobariya38 Jan 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions .github/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,28 @@

changelog:
categories:
- title: Highlights 🌟
- title: 🌟 Highlights
labels:
- highlights

- title: New Features 🚀
- title: 🚀 New Features
labels:
- feature
- enhancement

- title: Bug Fixes 🐛
- title: 🐛 Bug Fixes
labels:
- bug

- title: Documentation 📚
- title: 📚 Documentation
labels:
- documentation

- title: 📦 Dependency Updates
labels:
- dependencies
- dependabot

- title: Other Changes
labels:
- "*"
7 changes: 6 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import java.util.Properties
* Gets the current system time formatted as 'yy-mm-dd : hh-mm-ss'.
*/
fun getCurrentTimeLabel(): String {
val formatter = SimpleDateFormat("yy-MM-dd : HH-mm-ss", Locale.getDefault())
val formatter = SimpleDateFormat("yy-MM-dd - HH:mm:ss", Locale.getDefault())
return formatter.format(Date())
}

Expand Down Expand Up @@ -52,6 +52,7 @@ plugins {
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.ksp)
alias(libs.plugins.jetbrains.kotlin.serialization)
alias(libs.plugins.oss.licenses)
}

Expand Down Expand Up @@ -222,6 +223,10 @@ dependencies {
implementation(libs.bundles.compose)
debugImplementation(libs.bundles.compose.debug)

// Navigation 3
implementation(libs.bundles.navigation3)
implementation(libs.kotlinx.serialization.json)

// Google Play License Services
implementation(libs.oss.license)

Expand Down
11 changes: 7 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools" >

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

Expand All @@ -14,11 +14,14 @@
android:roundIcon="${appRoundIcon}"
android:supportsRtl="true"
android:theme="@style/PasscodesTheme.Default"
tools:targetApi="33">
tools:targetApi="33" >

<activity android:name=".ui.MainActivity" />
<activity android:name=".JetpackPreviewLayoutActivity" />

<activity
android:name=".oldui.MainActivity"
android:exported="true">
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand All @@ -32,7 +35,7 @@
<service
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
android:enabled="false"
android:exported="false">
android:exported="false" >
<meta-data
android:name="autoStoreLocales"
android:value="true" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.jeeldobariya.passcodes

import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore
import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme
import kotlinx.coroutines.launch
import kotlin.system.exitProcess

class JetpackPreviewLayoutActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
PasscodesTheme {
val composableScope = rememberCoroutineScope()

JetpackComposeNewUIRoot(
navigateToNewUi = ::navigateToJetpackComposeNavigation,
navigateToOldUi = {
composableScope.launch {
featureFlagsDatastore.updateData {
it.copy(isPreviewLayoutEnabled = false)
}

finishAndRemoveTask()
exitProcess(0)
}
}
)
}
}
}

fun navigateToJetpackComposeNavigation() {
Intent(this@JetpackPreviewLayoutActivity, com.jeeldobariya.passcodes.ui.MainActivity::class.java).also {
startActivity(it)
}
}
}

@Composable
fun JetpackComposeNewUIRoot(navigateToNewUi: () -> Unit, navigateToOldUi: () -> Unit) {
Surface(
color = MaterialTheme.colorScheme.surface,
modifier = Modifier.fillMaxSize(),
tonalElevation = 5.dp
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Text("Passcodes", fontSize = 40.sp)
Text("You are on New Jetpack UI")

Spacer(Modifier.padding(32.dp))

Button(onClick = navigateToOldUi) {
Text("Back To Old UI", fontSize = 20.sp)
}

OutlinedButton(onClick = navigateToNewUi) {
Text("Continue To New UI", fontSize = 20.sp)
}

Spacer(Modifier.padding(12.dp))

Text("This UI is Under Active Development", fontSize = 12.sp)
Text("So, There might be small issues!!", fontSize = 12.sp)
}
}
}

@Preview(showBackground = true)
@Composable
fun BasePreview() {
PasscodesTheme {
JetpackComposeNewUIRoot(navigateToOldUi = { }, navigateToNewUi = { })
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.jeeldobariya.passcodes.navigation

import androidx.compose.runtime.Composable
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import com.jeeldobariya.passcodes.core.navigation.Route
import com.jeeldobariya.passcodes.password_manager.ui.PasswordManagerScreen
import com.jeeldobariya.passcodes.password_manager.ui.SavePasswordScreen
import com.jeeldobariya.passcodes.ui.AboutScreen
import com.jeeldobariya.passcodes.ui.MainScreen
import com.jeeldobariya.passcodes.ui.SettingsScreen

@Composable
fun NavigationRoot() {
val backStack = rememberNavBackStack(Route.Home)

fun navigateTo(route: Route): Unit {
backStack.add(route)
}

NavDisplay(
backStack = backStack,
onBack = {
backStack.removeLastOrNull()
},
entryDecorators = mutableListOf(
rememberSaveableStateHolderNavEntryDecorator(),
rememberViewModelStoreNavEntryDecorator()
),
entryProvider = entryProvider {
entry<Route.Home> {
MainScreen(::navigateTo)
}

entry<Route.Settings> {
SettingsScreen()
}

entry<Route.AboutUs> {
AboutScreen()
}

entry<Route.PasswordManager> {
PasswordManagerScreen(::navigateTo)
}

entry<Route.SavePassword> {
SavePasswordScreen()
}
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.jeeldobariya.passcodes.core.domain.usecases.CheckForUpdateUseCase
import com.jeeldobariya.passcodes.core.feature_flags.featureFlagsDatastore
import com.jeeldobariya.passcodes.databinding.ActivityMainBinding
import com.jeeldobariya.passcodes.password_manager.oldui.PasswordManagerActivity
import com.jeeldobariya.passcodes.JetpackPreviewLayoutActivity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -58,11 +59,9 @@ class MainActivity : AppCompatActivity() {

runBlocking {
if (featureFlagsDatastore.data.first().isPreviewLayoutEnabled) {
val jetpackComposeActivity = Intent(
this@MainActivity,
com.jeeldobariya.passcodes.ui.MainActivity::class.java
)
startActivity(jetpackComposeActivity)
Intent(this@MainActivity, JetpackPreviewLayoutActivity::class.java).also {
startActivity(it)
}
}
}
}
Expand Down
82 changes: 82 additions & 0 deletions app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutScreen.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.jeeldobariya.passcodes.ui

import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Button
import androidx.compose.material3.Card
import androidx.compose.material3.FilledTonalButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewLightDark
import androidx.compose.ui.unit.dp
import com.jeeldobariya.passcodes.R
import com.jeeldobariya.passcodes.ui.ui.theme.PasscodesTheme

@Composable
fun AboutScreen() {
Scaffold { padding ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(padding)
.padding(horizontal = 24.dp, vertical = 64.dp),
verticalArrangement = Arrangement.Top,
horizontalAlignment = Alignment.CenterHorizontally
) {
Image(
painter = painterResource(R.drawable.ic_passcodes),
contentDescription = "Passcodes Icon",
modifier = Modifier
.size(100.dp)
.padding(10.dp)
)

Text(
text = stringResource(R.string.textview_aboutus_headline),
style = MaterialTheme.typography.titleLarge
)

Spacer(modifier = Modifier.padding(vertical = 12.dp))

Text(
text = stringResource(R.string.textview_app_description),
style = MaterialTheme.typography.bodyLarge
)

Spacer(modifier = Modifier.padding(vertical = 16.dp))

Text(
text = stringResource(R.string.textview_app_warning),
style = MaterialTheme.typography.labelSmall,
color = Color.Red
)

Spacer(modifier = Modifier.padding(16.dp))
}
}
}


@Preview(showBackground = true)
@PreviewLightDark
@Composable
fun AboutScreenPreview() {
PasscodesTheme {
AboutScreen()
}
}
Loading
Loading