From 47af2d0992d2f7652ed0f54a588ed4993cd62eb1 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 9 Aug 2024 19:22:10 +0530 Subject: [PATCH 01/27] refactor: add support for build with sign key --- app/build.gradle | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index e10de03a..5bb0ee64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,16 +16,33 @@ android { signingConfigs { release { - storeFile file("passwordmanager.jks") - storePassword 'beMbDcv94lv3' - keyAlias 'passwordmanager' - keyPassword 'beMbDcv94lv3' + def keystorePropertiesFile = rootProject.file("keystore.properties") + if (keystorePropertiesFile.exists()) { + def keystoreProperties = new Properties() + keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) + + keyAlias keystoreProperties['keyAlias'] + keyPassword keystoreProperties['keyPassword'] + storeFile file(keystoreProperties['storeFile']) + storePassword keystoreProperties['storePassword'] + } + } + } + + splits { + abi { + enable true + reset() + include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' + universalApk true } } buildTypes { release { - signingConfig signingConfigs.release + if (rootProject.file("keystore.properties").exists()) { + signingConfig signingConfigs.release + } minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } From c7fa27706242d20c2555ab076a8c203cca7c05d6 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 9 Aug 2024 19:23:03 +0530 Subject: [PATCH 02/27] feature: add a script that build and install the apk --- .gitignore | 2 ++ installondevice.bat | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 installondevice.bat diff --git a/.gitignore b/.gitignore index 8ccc4f86..d95437f9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ .externalNativeBuild .cxx local.properties +keystore.properties +*.jks diff --git a/installondevice.bat b/installondevice.bat new file mode 100644 index 00000000..a9f54d97 --- /dev/null +++ b/installondevice.bat @@ -0,0 +1,41 @@ +@rem Build & install on Android phone + +REM Force continuation after Gradle command by capturing the output +call gradle build +if ERRORLEVEL 1 ( + echo Gradle build failed! Check build_output.txt for details. + exit /b 1 +) + +REM Start ADB server +adb start-server +if ERRORLEVEL 1 ( + echo Failed to start ADB server! Exiting... + exit /b 1 +) + +REM Check if a device is connected +adb devices +if ERRORLEVEL 1 ( + echo No device found! Make sure your device is connected and USB debugging is enabled. + adb kill-server + exit /b 1 +) + +REM Install the APK on the connected device +adb install ./app/build/outputs/apk/release/app-universal-release.apk +if ERRORLEVEL 1 ( + echo APK installation failed! Exiting... + adb kill-server + exit /b 1 +) + +REM Kill ADB server after installation +adb kill-server +if ERRORLEVEL 1 ( + echo Failed to stop ADB server! Exiting... + exit /b 1 +) + +echo Build and installation completed successfully! +exit /b 0 From c085c4e109eb29f1fed1075db9a90e90e74f84fc Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Fri, 9 Aug 2024 20:10:38 +0530 Subject: [PATCH 03/27] feat: make a basic layout for saving passwords --- app/src/main/res/layout/activity_main.xml | 79 +++++++++++++++++++++-- app/src/main/res/values/strings.xml | 11 +++- 2 files changed, 83 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d87b18de..41bd9fb8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,11 +4,80 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - tools:context=".MainActivity"> + android:orientation="vertical" + tools:context=".MainActivity" + android:padding="4sp" > + + + + + + - - + android:layout_margin="4dp" + android:hint="@string/hint_username"> + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5d258bd9..b46315d7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,14 @@ Password Manager - - + + + domain + username + password + notes + save + + Permission Granted Permission Denied \ No newline at end of file From 6a40d97eb742db7ef07a9911d0bb1ab5430a0134 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 10 Aug 2024 21:32:32 +0530 Subject: [PATCH 04/27] feat: enhance layout --- app/src/main/AndroidManifest.xml | 1 + .../com/passwordmanager/MainActivity.java | 7 ++ .../passwordmanager/SavePasswordActivity.java | 18 +++ app/src/main/res/layout/activity_main.xml | 78 ++----------- .../main/res/layout/activity_savepassword.xml | 109 ++++++++++++++++++ app/src/main/res/values/strings.xml | 12 +- 6 files changed, 149 insertions(+), 76 deletions(-) create mode 100644 app/src/main/java/com/passwordmanager/SavePasswordActivity.java create mode 100644 app/src/main/res/layout/activity_savepassword.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 11d3ca40..7171714b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,6 +33,7 @@ + diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index a7b46bfb..bb3cab53 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -1,6 +1,8 @@ package com.passwordmanager; import android.os.Bundle; +import android.content.Intent; +import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; @@ -38,4 +40,9 @@ public void onRequestPermissionsResult( } } } + + public void onClickSavePasswordBtn(View view) { + Intent savepasswordintent = new Intent(this, SavePasswordActivity.class); + startActivity(savepasswordintent); + } } diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java new file mode 100644 index 00000000..d12bafe5 --- /dev/null +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -0,0 +1,18 @@ +package com.passwordmanager; + +import android.os.Bundle; +import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; + +public class SavePasswordActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_savepassword); + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + } +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 41bd9fb8..fc10810a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,79 +5,15 @@ android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" - tools:context=".MainActivity" + tools:context=".SavePasswordActivity" android:padding="4sp" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:text="@string/button_save" + android:textSize="14dp" + android:onClick="onClickSavePasswordBtn" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_savepassword.xml b/app/src/main/res/layout/activity_savepassword.xml new file mode 100644 index 00000000..2b70ed61 --- /dev/null +++ b/app/src/main/res/layout/activity_savepassword.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b46315d7..815cc803 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,12 +1,14 @@ Password Manager + v0.1.0-Alpha - domain - username - password - notes - save + Save Password + Domain + Username + Password + Notes + Save Password Permission Granted From da8b060dd2a196b2c7e690bd838efd86ed65c392 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 10 Aug 2024 22:18:52 +0530 Subject: [PATCH 05/27] feat: Made a Home Activity --- .../com/passwordmanager/MainActivity.java | 41 ++++++++++++-- app/src/main/res/layout/activity_main.xml | 56 +++++++++++++++++-- .../main/res/layout/activity_savepassword.xml | 8 +-- app/src/main/res/values/strings.xml | 5 ++ 4 files changed, 95 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index bb3cab53..7463346e 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -3,6 +3,7 @@ import android.os.Bundle; import android.content.Intent; import android.view.View; +import android.widget.Button; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; @@ -10,7 +11,11 @@ import com.passwordmanager.utils.Permissions; public class MainActivity extends AppCompatActivity { - + + private Button savepasswordbtn; + private Button loadpasswordbtn; + private Button quitbtn; + private Permissions permissionsHandle; @Override @@ -18,6 +23,35 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + // Initalizing the view elememts + savepasswordbtn = (Button)findViewById(R.id.save_password_activity_button); + loadpasswordbtn = (Button)findViewById(R.id.load_password_activity_button); + quitbtn = (Button)findViewById(R.id.quit_button); + + // Add event onclick listener + savepasswordbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); + startActivity(savepasswordintent); + } + }); + + loadpasswordbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // not implemented yet + return; + } + }); + + quitbtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finishAndRemoveTask(); + } + }); + // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); @@ -40,9 +74,4 @@ public void onRequestPermissionsResult( } } } - - public void onClickSavePasswordBtn(View view) { - Intent savepasswordintent = new Intent(this, SavePasswordActivity.class); - startActivity(savepasswordintent); - } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fc10810a..553023e3 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,12 +8,58 @@ tools:context=".SavePasswordActivity" android:padding="4sp" > - + android:gravity="center" + android:orientation="vertical" + android:layout_margin="16sp"> + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_savepassword.xml b/app/src/main/res/layout/activity_savepassword.xml index 2b70ed61..cc576eeb 100644 --- a/app/src/main/res/layout/activity_savepassword.xml +++ b/app/src/main/res/layout/activity_savepassword.xml @@ -91,19 +91,19 @@ - - + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 815cc803..a998b194 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,11 @@ v0.1.0-Alpha + Save Password + Load Password + Quit + + Save Password Domain Username From b2180369fd871f32942f851adab13440e78c32ce Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sat, 10 Aug 2024 22:25:54 +0530 Subject: [PATCH 06/27] refactor: change onClickListener to use lambda function --- .../com/passwordmanager/MainActivity.java | 24 ++++++------------- 1 file changed, 7 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index 7463346e..2d572d96 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -29,27 +29,17 @@ protected void onCreate(Bundle savedInstanceState) { quitbtn = (Button)findViewById(R.id.quit_button); // Add event onclick listener - savepasswordbtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); - startActivity(savepasswordintent); - } + savepasswordbtn.setOnClickListener(v -> { + Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); + startActivity(savepasswordintent); }); - loadpasswordbtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - // not implemented yet - return; - } + loadpasswordbtn.setOnClickListener(v -> { + Toast.makeText(this, "Yet left to make the feature!!", Toast.LENGTH_LONG).show(); }); - quitbtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finishAndRemoveTask(); - } + quitbtn.setOnClickListener(v -> { + finishAndRemoveTask(); }); // Make window fullscreen From 1418eae7b33a0be2203ec47bae47a9be04535774 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 12:16:04 +0530 Subject: [PATCH 07/27] feat: Made a load password activity --- .../passwordmanager/LoadPasswordActivity.java | 17 +++ .../com/passwordmanager/MainActivity.java | 3 +- .../passwordmanager/SavePasswordActivity.java | 1 - .../main/res/layout/activity_loadpassword.xml | 109 ++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/passwordmanager/LoadPasswordActivity.java create mode 100644 app/src/main/res/layout/activity_loadpassword.xml diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java new file mode 100644 index 00000000..b029aeef --- /dev/null +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -0,0 +1,17 @@ +package com.passwordmanager; + +import android.os.Bundle; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; + +public class LoadPasswordActivity extends AppCompatActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_loadpassword); + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + } +} diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index 2d572d96..1d4a9f66 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -35,7 +35,8 @@ protected void onCreate(Bundle savedInstanceState) { }); loadpasswordbtn.setOnClickListener(v -> { - Toast.makeText(this, "Yet left to make the feature!!", Toast.LENGTH_LONG).show(); + Intent loadpasswordintent = new Intent(MainActivity.this, LoadPasswordActivity.class); + startActivity(loadpasswordintent); }); quitbtn.setOnClickListener(v -> { diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java index d12bafe5..3d9101e1 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -2,7 +2,6 @@ import android.os.Bundle; import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; diff --git a/app/src/main/res/layout/activity_loadpassword.xml b/app/src/main/res/layout/activity_loadpassword.xml new file mode 100644 index 00000000..10711610 --- /dev/null +++ b/app/src/main/res/layout/activity_loadpassword.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a998b194..e988696e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ Save Password + Load Password Domain Username Password From 47c0fa824f3f912083f861bf639e7ca2e03c25f9 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 18:14:15 +0530 Subject: [PATCH 08/27] feat: make a load password layout --- app/src/main/AndroidManifest.xml | 1 + .../passwordmanager/LoadPasswordActivity.java | 1 - .../com/passwordmanager/MainActivity.java | 69 +++++++++++-------- .../main/res/layout/activity_loadpassword.xml | 35 +--------- app/src/main/res/values/strings.xml | 1 + 5 files changed, 44 insertions(+), 63 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7171714b..b87edb3a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -34,6 +34,7 @@ + diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java index b029aeef..0ca1d1f8 100644 --- a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -1,7 +1,6 @@ package com.passwordmanager; import android.os.Bundle; -import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index 1d4a9f66..25e1d52e 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -2,13 +2,10 @@ import android.os.Bundle; import android.content.Intent; -import android.view.View; import android.widget.Button; -import android.widget.Toast; -import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; -import com.passwordmanager.utils.Permissions; +// import com.passwordmanager.utils.Permissions; public class MainActivity extends AppCompatActivity { @@ -16,7 +13,7 @@ public class MainActivity extends AppCompatActivity { private Button loadpasswordbtn; private Button quitbtn; - private Permissions permissionsHandle; + // private Permissions permissionsHandle; @Override protected void onCreate(Bundle savedInstanceState) { @@ -24,11 +21,47 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); // Initalizing the view elememts + initalizeViewVariables(); + + // Add event onclick listener + addOnClickListenerOnButton(); + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + + /* Comment the code as permission is not need to write into app data dir. + // Check and request permission when the app is first opened + permissionsHandle = new Permissions(this); + if (!permissionsHandle.checkPermission()) permissionsHandle.requestPermission(); + */ + } + + /* Comment the code as permission is not need to write into app data dir. + @Override + public void onRequestPermissionsResult( + int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + if (requestCode == Permissions.PERMISSION_REQUEST_CODE) { + if (permissionsHandle.isPermissionGranted(grantResults)) { + // Permission has been granted + Toast.makeText(this, getString(R.string.permission_granted), Toast.LENGTH_LONG).show(); + } else { + // Permission not granted + Toast.makeText(this, getString(R.string.permission_denied), Toast.LENGTH_LONG).show(); + } + } + } + */ + + // Inizalize all the local view based variables + private void initalizeViewVariables() { savepasswordbtn = (Button)findViewById(R.id.save_password_activity_button); loadpasswordbtn = (Button)findViewById(R.id.load_password_activity_button); quitbtn = (Button)findViewById(R.id.quit_button); - - // Add event onclick listener + } + + // Added all the onclick event listiners + private void addOnClickListenerOnButton() { savepasswordbtn.setOnClickListener(v -> { Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); startActivity(savepasswordintent); @@ -42,27 +75,5 @@ protected void onCreate(Bundle savedInstanceState) { quitbtn.setOnClickListener(v -> { finishAndRemoveTask(); }); - - // Make window fullscreen - WindowCompat.setDecorFitsSystemWindows(getWindow(), false); - - // Check and request permission when the app is first opened - permissionsHandle = new Permissions(this); - if (!permissionsHandle.checkPermission()) permissionsHandle.requestPermission(); - } - - @Override - public void onRequestPermissionsResult( - int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults); - if (requestCode == Permissions.PERMISSION_REQUEST_CODE) { - if (permissionsHandle.isPermissionGranted(grantResults)) { - // Permission has been granted - Toast.makeText(this, getString(R.string.permission_granted), Toast.LENGTH_LONG).show(); - } else { - // Permission not granted - Toast.makeText(this, getString(R.string.permission_denied), Toast.LENGTH_LONG).show(); - } - } } } diff --git a/app/src/main/res/layout/activity_loadpassword.xml b/app/src/main/res/layout/activity_loadpassword.xml index 10711610..2f480b2d 100644 --- a/app/src/main/res/layout/activity_loadpassword.xml +++ b/app/src/main/res/layout/activity_loadpassword.xml @@ -57,37 +57,6 @@ android:maxLines="1" /> - - - - - - - - - - - - @@ -98,10 +67,10 @@ android:orientation="vertical"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e988696e..b1548612 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ Password Notes Save Password + Load Password Permission Granted From 1108a235ec57ae1b21e24aaa60e0a12a54888134 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 18:43:52 +0530 Subject: [PATCH 09/27] refactor: break the onCreate into multiple parts --- .../passwordmanager/LoadPasswordActivity.java | 27 +++++++++++++++++ .../com/passwordmanager/MainActivity.java | 6 ++-- .../passwordmanager/SavePasswordActivity.java | 30 +++++++++++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java index 0ca1d1f8..7c6ba3f6 100644 --- a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -1,16 +1,43 @@ package com.passwordmanager; import android.os.Bundle; +import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; +import android.widget.Button; +import android.widget.TextView; public class LoadPasswordActivity extends AppCompatActivity { + private TextView domainTextInput; + private TextView usernameTextInput; + private Button loadpasswordbtn; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_loadpassword); + // Initalizing the view elememts + initalizeViewVariables(); + + // Add event onclick listener + addOnClickListenerOnButton(); + // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } + + // Inizalize all the local view based variables + private void initalizeViewVariables() { + domainTextInput = findViewById(R.id.domain_text_input); + usernameTextInput = findViewById(R.id.username_text_input); + loadpasswordbtn = findViewById(R.id.load_button); + } + + // Added all the onclick event listiners + private void addOnClickListenerOnButton() { + loadpasswordbtn.setOnClickListener(v -> { + Toast.makeText(LoadPasswordActivity.this, "Hello Load Passwords", Toast.LENGTH_LONG).show(); + }); + } } diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index 25e1d52e..78ff3a36 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -55,9 +55,9 @@ public void onRequestPermissionsResult( // Inizalize all the local view based variables private void initalizeViewVariables() { - savepasswordbtn = (Button)findViewById(R.id.save_password_activity_button); - loadpasswordbtn = (Button)findViewById(R.id.load_password_activity_button); - quitbtn = (Button)findViewById(R.id.quit_button); + savepasswordbtn = findViewById(R.id.save_password_activity_button); + loadpasswordbtn = findViewById(R.id.load_password_activity_button); + quitbtn = findViewById(R.id.quit_button); } // Added all the onclick event listiners diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java index 3d9101e1..8326c48c 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -4,14 +4,44 @@ import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; +import android.widget.Button; +import android.widget.TextView; public class SavePasswordActivity extends AppCompatActivity { + private TextView domainTextInput; + private TextView usernameTextInput; + private TextView passwordTextInput; + private TextView notesTextInput; + private Button savepasswordbtn; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_savepassword); + // Initalizing the view elememts + initalizeViewVariables(); + + // Add event onclick listener + addOnClickListenerOnButton(); + // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } + + // Inizalize all the local view based variables + private void initalizeViewVariables() { + domainTextInput = findViewById(R.id.domain_text_input); + usernameTextInput = findViewById(R.id.username_text_input); + passwordTextInput = findViewById(R.id.password_text_input); + notesTextInput = findViewById(R.id.notes_text_input); + savepasswordbtn = findViewById(R.id.save_button); + } + + // Added all the onclick event listiners + private void addOnClickListenerOnButton() { + savepasswordbtn.setOnClickListener(v -> { + Toast.makeText(SavePasswordActivity.this, "Hello Save Passwords", Toast.LENGTH_LONG).show(); + }); + } } From b8ec9afb9c7f49862a696834bd4d2663be5e214f Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 19:51:20 +0530 Subject: [PATCH 10/27] feat: create a database --- .../database/MyDatabaseHelper.java | 40 +++++ .../passwordmanager/models/PasswordModel.java | 112 +++++++++++++ .../com/passwordmanager/utils/Controller.java | 147 ++++++++++++++++++ 3 files changed, 299 insertions(+) create mode 100644 app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java create mode 100644 app/src/main/java/com/passwordmanager/models/PasswordModel.java create mode 100644 app/src/main/java/com/passwordmanager/utils/Controller.java diff --git a/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java b/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java new file mode 100644 index 00000000..21a846a4 --- /dev/null +++ b/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java @@ -0,0 +1,40 @@ +package com.passwordmanager.database; + +import android.content.Context; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; + +public class MyDatabaseHelper extends SQLiteOpenHelper { + + private static final String DATABASE_NAME = "master.db"; + private static final int DATABASE_VERSION = 1; + + public static final String PASSWORDS_TABLE = "passwords"; + + // SQL statement to create a passwords table. + private static final String CREATE_PASSWORDS_TABLE = "CREATE TABLE IF NOT EXISTS " + PASSWORDS_TABLE + " (" + + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "domain VARCHAR(40) NOT NULL, " + + "username VARCHAR(60) NOT NULL, " + + "password VARCHAR(60) NOT NULL, " + + "notes VARCHAR(100), " + + "createdat DATE DEFAULT CURRENT_TIMESTAMP, " + + "updatedat DATE DEFAULT CURRENT_TIMESTAMP);"; + + + public MyDatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // Create passwords table. + db.execSQL(CREATE_PASSWORDS_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // not Implemented a not needed. + return; + } +} diff --git a/app/src/main/java/com/passwordmanager/models/PasswordModel.java b/app/src/main/java/com/passwordmanager/models/PasswordModel.java new file mode 100644 index 00000000..8db64237 --- /dev/null +++ b/app/src/main/java/com/passwordmanager/models/PasswordModel.java @@ -0,0 +1,112 @@ +package com.passwordmanager.model; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class PasswordModel { + + private int id; // Primary key of passwords table. + private String domain; // Domain associated with password entity. + private String username; // Username associated with password entity. + private String password; // Password of password entity. + private String notes; // Notes associated with the password entity. + private String createdAt; // Date of password entity when the entity was first saved. + private String updatedAt; // Date of password entity when the entity was last updated. + + // Constructor to initialize a new password model without an ID (e.g., when creating a new entry) + public PasswordModel(String domain, String username, String password, String notes) { + this.domain = domain; + this.username = username; + this.password = password; + this.notes = notes; + + // Retrieve the current date and time + LocalDateTime currentDate = LocalDateTime.now(); + + // Formatting the time so that it is better seen by users + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + this.createdAt = currentDate.format(formatter); + this.updatedAt = currentDate.format(formatter); + } + + // Constructor with ID (e.g., when fetching from the database) + public PasswordModel(int id, String domain, String username, String password, String notes, String createdAt, String updatedAt) { + this.id = id; + this.domain = domain; + this.username = username; + this.password = password; + this.notes = notes; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + // Getters and Setters + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "PasswordModel{" + + "id=" + id + + ", domain='" + domain + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", notes='" + notes + '\'' + + ", createdAt='" + createdAt + '\'' + + ", updatedAt='" + updatedAt + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java new file mode 100644 index 00000000..22beb248 --- /dev/null +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -0,0 +1,147 @@ +package com.passwordmanager.utils; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; + +import com.passwordmanager.database.MyDatabaseHelper; +import com.passwordmanager.models.PasswordModel; + +public class Controller { + private MyDatabaseHelper dbHelper; + + public Controller(Context context) { + dbHelper = new MyDatabaseHelper(context); + } + + public int savePasswordEntity(String domain, String username, String password, String notes) { + // Return -2 on empty parameter. + // Return -1 on error in SQL. + // Return +ve on success. + + if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { + return -2; + } + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put("domain", domain); + values.put("username", username); + values.put("password", password); + if (!notes.isEmpty()) values.put("notes", notes); + + long newRowId = db.insert(MyDatabaseHelper.PASSWORDS_TABLE, null, values); + db.close(); + + return newRowId == -1 ? -1 : (int) newRowId; + } + + public PasswordModel getPasswordById(int id) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Define the selection criteria + String selection = "id = ?"; + String[] selectionArgs = new String[]{String.valueOf(id)}; + + Cursor cursor = db.query( + MyDatabaseHelper.PASSWORDS_TABLE, + null, + selection + selectionArgs, + null, null, null); + + PasswordModel passwordModel = null; + + if (cursor != null) { + if (cursor.moveToFirst()) { + String domain = cursor.getString(cursor.getColumnIndex("domain")); + String username = cursor.getString(cursor.getColumnIndex("username")); + String password = cursor.getString(cursor.getColumnIndex("password")); + String notes = cursor.getString(cursor.getColumnIndex("notes")); + String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); + String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); + + passwordModel = new PasswordModel(id, domain, username, password, notes, createdAt, updatedAt); + } + cursor.close(); + } + + db.close(); + return passwordModel; + } + + public PasswordModel getPasswordByUsernameAndDomain(String username, String domain) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Define the selection criteria + String selection = "username = ? AND domain = ?"; + String[] selectionArgs = new String[]{username, domain}; + + Cursor cursor = db.query( + MyDatabaseHelper.PASSWORDS_TABLE, + null, + selection, + selectionArgs, + null, + null, + null + ); + + PasswordModel passwordModel = null; + + if (cursor != null) { + if (cursor.moveToFirst()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + String retrievedUsername = cursor.getString(cursor.getColumnIndex("username")); + String retrievedDomain = cursor.getString(cursor.getColumnIndex("domain")); + String password = cursor.getString(cursor.getColumnIndex("password")); + String notes = cursor.getString(cursor.getColumnIndex("notes")); + String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); + String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); + + passwordModel = new PasswordModel(id, retrievedDomain, retrievedUsername, password, notes, createdAt, updatedAt); + } + cursor.close(); + } + + db.close(); + return passwordModel; + } + + + public int updatePassword(int id, String domain, String username, String password, String notes) { + // Return -2 on empty parameter. + // Return -1 on error in SQL. + // Return number of rows affected on success. + + if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { + return -2; + } + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues values = new ContentValues(); + values.put("domain", domain); + values.put("username", username); + values.put("password", password); + values.put("notes", notes); + values.put("updatedat", "datetime('now')"); // Update the updatedAt column + + int rowsAffected = db.update(MyDatabaseHelper.PASSWORDS_TABLE, values, "id = ?", new String[]{String.valueOf(id)}); + db.close(); + + return rowsAffected == 0 ? -1 : rowsAffected; + } + + public int deletePassword(int id) { + // Return number of rows affected (should be 1 if the deletion is successful). + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + int rowsDeleted = db.delete(MyDatabaseHelper.PASSWORDS_TABLE, "id = ?", new String[]{String.valueOf(id)}); + db.close(); + + return rowsDeleted; + } +} From 6cc4f420bc021f10d093c140ab53454bf22b7659 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 20:27:07 +0530 Subject: [PATCH 11/27] feat: made load password and save password functional --- app/build.gradle | 8 ++++++++ .../passwordmanager/LoadPasswordActivity.java | 16 ++++++++++++++- .../passwordmanager/SavePasswordActivity.java | 20 ++++++++++++++++++- .../passwordmanager/models/PasswordModel.java | 2 +- .../com/passwordmanager/utils/Controller.java | 2 +- lint.xml | 6 ++++++ 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 lint.xml diff --git a/app/build.gradle b/app/build.gradle index 5bb0ee64..2417df54 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,6 +37,14 @@ android { universalApk true } } + + lintOptions { + // You can enable lint checking and provide a baseline file if needed: + // baseline file("lint-baseline.xml") + + // To ensure that lint uses the lint.xml configuration + lintConfig rootProject.file("lint.xml") + } buildTypes { release { diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java index 7c6ba3f6..a489774f 100644 --- a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -7,6 +7,9 @@ import android.widget.Button; import android.widget.TextView; +import com.passwordmanager.utils.Controller; +import com.passwordmanager.models.PasswordModel; + public class LoadPasswordActivity extends AppCompatActivity { private TextView domainTextInput; private TextView usernameTextInput; @@ -37,7 +40,18 @@ private void initalizeViewVariables() { // Added all the onclick event listiners private void addOnClickListenerOnButton() { loadpasswordbtn.setOnClickListener(v -> { - Toast.makeText(LoadPasswordActivity.this, "Hello Load Passwords", Toast.LENGTH_LONG).show(); + String domain = domainTextInput.getText().toString(); + String username = usernameTextInput.getText().toString(); + + Controller controller = new Controller(LoadPasswordActivity.this); + + PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); + + if (passwordmodel == null) { + Toast.makeText(LoadPasswordActivity.this, "404: Not Found!!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + } }); } } diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java index 8326c48c..e8613304 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -7,6 +7,8 @@ import android.widget.Button; import android.widget.TextView; +import com.passwordmanager.utils.Controller; + public class SavePasswordActivity extends AppCompatActivity { private TextView domainTextInput; private TextView usernameTextInput; @@ -41,7 +43,23 @@ private void initalizeViewVariables() { // Added all the onclick event listiners private void addOnClickListenerOnButton() { savepasswordbtn.setOnClickListener(v -> { - Toast.makeText(SavePasswordActivity.this, "Hello Save Passwords", Toast.LENGTH_LONG).show(); + String domain = domainTextInput.getText().toString(); + String username = usernameTextInput.getText().toString(); + String password = passwordTextInput.getText().toString(); + String notes = notesTextInput.getText().toString(); + + Controller controller = new Controller(SavePasswordActivity.this); + + int res = controller.savePasswordEntity(domain, username, password, notes); + + if (res == -2) { + Toast.makeText(SavePasswordActivity.this, "please fill the form first!!", Toast.LENGTH_SHORT).show(); + } + else if (res == -1) { + Toast.makeText(SavePasswordActivity.this, "Failed: please try again!!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(SavePasswordActivity.this, "Success: " + res, Toast.LENGTH_SHORT).show(); + } }); } } diff --git a/app/src/main/java/com/passwordmanager/models/PasswordModel.java b/app/src/main/java/com/passwordmanager/models/PasswordModel.java index 8db64237..16641f8a 100644 --- a/app/src/main/java/com/passwordmanager/models/PasswordModel.java +++ b/app/src/main/java/com/passwordmanager/models/PasswordModel.java @@ -1,4 +1,4 @@ -package com.passwordmanager.model; +package com.passwordmanager.models; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java index 22beb248..8fe2117f 100644 --- a/app/src/main/java/com/passwordmanager/utils/Controller.java +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -48,7 +48,7 @@ public PasswordModel getPasswordById(int id) { Cursor cursor = db.query( MyDatabaseHelper.PASSWORDS_TABLE, null, - selection + selection, selectionArgs, null, null, null); diff --git a/lint.xml b/lint.xml new file mode 100644 index 00000000..e1452c37 --- /dev/null +++ b/lint.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 370b0fbf81e309ace9fbb9e4ceea84515f0c1cc0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 20:36:41 +0530 Subject: [PATCH 12/27] refactor: reindented the files --- .../passwordmanager/LoadPasswordActivity.java | 24 +- .../com/passwordmanager/MainActivity.java | 10 +- .../passwordmanager/SavePasswordActivity.java | 34 +-- .../database/MyDatabaseHelper.java | 63 +++-- .../passwordmanager/models/PasswordModel.java | 209 ++++++++-------- .../com/passwordmanager/utils/Controller.java | 228 +++++++++--------- 6 files changed, 283 insertions(+), 285 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java index a489774f..b717bc41 100644 --- a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -40,18 +40,18 @@ private void initalizeViewVariables() { // Added all the onclick event listiners private void addOnClickListenerOnButton() { loadpasswordbtn.setOnClickListener(v -> { - String domain = domainTextInput.getText().toString(); - String username = usernameTextInput.getText().toString(); - - Controller controller = new Controller(LoadPasswordActivity.this); - - PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); - - if (passwordmodel == null) { - Toast.makeText(LoadPasswordActivity.this, "404: Not Found!!", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); - } + String domain = domainTextInput.getText().toString(); + String username = usernameTextInput.getText().toString(); + + Controller controller = new Controller(LoadPasswordActivity.this); + + PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); + + if (passwordmodel == null) { + Toast.makeText(LoadPasswordActivity.this, "404: Not Found!!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + } }); } } diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index 78ff3a36..a6236bec 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -63,17 +63,17 @@ private void initalizeViewVariables() { // Added all the onclick event listiners private void addOnClickListenerOnButton() { savepasswordbtn.setOnClickListener(v -> { - Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); - startActivity(savepasswordintent); + Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); + startActivity(savepasswordintent); }); loadpasswordbtn.setOnClickListener(v -> { - Intent loadpasswordintent = new Intent(MainActivity.this, LoadPasswordActivity.class); - startActivity(loadpasswordintent); + Intent loadpasswordintent = new Intent(MainActivity.this, LoadPasswordActivity.class); + startActivity(loadpasswordintent); }); quitbtn.setOnClickListener(v -> { - finishAndRemoveTask(); + finishAndRemoveTask(); }); } } diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java index e8613304..584ead9c 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -43,23 +43,23 @@ private void initalizeViewVariables() { // Added all the onclick event listiners private void addOnClickListenerOnButton() { savepasswordbtn.setOnClickListener(v -> { - String domain = domainTextInput.getText().toString(); - String username = usernameTextInput.getText().toString(); - String password = passwordTextInput.getText().toString(); - String notes = notesTextInput.getText().toString(); - - Controller controller = new Controller(SavePasswordActivity.this); - - int res = controller.savePasswordEntity(domain, username, password, notes); - - if (res == -2) { - Toast.makeText(SavePasswordActivity.this, "please fill the form first!!", Toast.LENGTH_SHORT).show(); - } - else if (res == -1) { - Toast.makeText(SavePasswordActivity.this, "Failed: please try again!!", Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(SavePasswordActivity.this, "Success: " + res, Toast.LENGTH_SHORT).show(); - } + String domain = domainTextInput.getText().toString(); + String username = usernameTextInput.getText().toString(); + String password = passwordTextInput.getText().toString(); + String notes = notesTextInput.getText().toString(); + + Controller controller = new Controller(SavePasswordActivity.this); + + int res = controller.savePasswordEntity(domain, username, password, notes); + + if (res == -2) { + Toast.makeText(SavePasswordActivity.this, "please fill the form first!!", Toast.LENGTH_SHORT).show(); + } + else if (res == -1) { + Toast.makeText(SavePasswordActivity.this, "Failed: please try again!!", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(SavePasswordActivity.this, "Success: " + res, Toast.LENGTH_SHORT).show(); + } }); } } diff --git a/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java b/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java index 21a846a4..8d2f8022 100644 --- a/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java +++ b/app/src/main/java/com/passwordmanager/database/MyDatabaseHelper.java @@ -5,36 +5,35 @@ import android.database.sqlite.SQLiteOpenHelper; public class MyDatabaseHelper extends SQLiteOpenHelper { - - private static final String DATABASE_NAME = "master.db"; - private static final int DATABASE_VERSION = 1; - - public static final String PASSWORDS_TABLE = "passwords"; - - // SQL statement to create a passwords table. - private static final String CREATE_PASSWORDS_TABLE = "CREATE TABLE IF NOT EXISTS " + PASSWORDS_TABLE + " (" + - "id INTEGER PRIMARY KEY AUTOINCREMENT, " + - "domain VARCHAR(40) NOT NULL, " + - "username VARCHAR(60) NOT NULL, " + - "password VARCHAR(60) NOT NULL, " + - "notes VARCHAR(100), " + - "createdat DATE DEFAULT CURRENT_TIMESTAMP, " + - "updatedat DATE DEFAULT CURRENT_TIMESTAMP);"; - - - public MyDatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - @Override - public void onCreate(SQLiteDatabase db) { - // Create passwords table. - db.execSQL(CREATE_PASSWORDS_TABLE); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - // not Implemented a not needed. - return; - } + private static final String DATABASE_NAME = "master.db"; + private static final int DATABASE_VERSION = 1; + + public static final String PASSWORDS_TABLE = "passwords"; + + // SQL statement to create a passwords table. + private static final String CREATE_PASSWORDS_TABLE = "CREATE TABLE IF NOT EXISTS " + PASSWORDS_TABLE + " (" + + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + + "domain VARCHAR(40) NOT NULL, " + + "username VARCHAR(60) NOT NULL, " + + "password VARCHAR(60) NOT NULL, " + + "notes VARCHAR(100), " + + "createdat DATE DEFAULT CURRENT_TIMESTAMP, " + + "updatedat DATE DEFAULT CURRENT_TIMESTAMP);"; + + + public MyDatabaseHelper(Context context) { + super(context, DATABASE_NAME, null, DATABASE_VERSION); + } + + @Override + public void onCreate(SQLiteDatabase db) { + // Create passwords table. + db.execSQL(CREATE_PASSWORDS_TABLE); + } + + @Override + public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { + // not Implemented a not needed. + return; + } } diff --git a/app/src/main/java/com/passwordmanager/models/PasswordModel.java b/app/src/main/java/com/passwordmanager/models/PasswordModel.java index 16641f8a..e063c329 100644 --- a/app/src/main/java/com/passwordmanager/models/PasswordModel.java +++ b/app/src/main/java/com/passwordmanager/models/PasswordModel.java @@ -4,109 +4,108 @@ import java.time.format.DateTimeFormatter; public class PasswordModel { - - private int id; // Primary key of passwords table. - private String domain; // Domain associated with password entity. - private String username; // Username associated with password entity. - private String password; // Password of password entity. - private String notes; // Notes associated with the password entity. - private String createdAt; // Date of password entity when the entity was first saved. - private String updatedAt; // Date of password entity when the entity was last updated. - - // Constructor to initialize a new password model without an ID (e.g., when creating a new entry) - public PasswordModel(String domain, String username, String password, String notes) { - this.domain = domain; - this.username = username; - this.password = password; - this.notes = notes; - - // Retrieve the current date and time - LocalDateTime currentDate = LocalDateTime.now(); - - // Formatting the time so that it is better seen by users - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - this.createdAt = currentDate.format(formatter); - this.updatedAt = currentDate.format(formatter); - } - - // Constructor with ID (e.g., when fetching from the database) - public PasswordModel(int id, String domain, String username, String password, String notes, String createdAt, String updatedAt) { - this.id = id; - this.domain = domain; - this.username = username; - this.password = password; - this.notes = notes; - this.createdAt = createdAt; - this.updatedAt = updatedAt; - } - - // Getters and Setters - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getNotes() { - return notes; - } - - public void setNotes(String notes) { - this.notes = notes; - } - - public String getCreatedAt() { - return createdAt; - } - - public void setCreatedAt(String createdAt) { - this.createdAt = createdAt; - } - - public String getUpdatedAt() { - return updatedAt; - } - - public void setUpdatedAt(String updatedAt) { - this.updatedAt = updatedAt; - } - - @Override - public String toString() { - return "PasswordModel{" + - "id=" + id + - ", domain='" + domain + '\'' + - ", username='" + username + '\'' + - ", password='" + password + '\'' + - ", notes='" + notes + '\'' + - ", createdAt='" + createdAt + '\'' + - ", updatedAt='" + updatedAt + '\'' + - '}'; - } + private int id; // Primary key of passwords table. + private String domain; // Domain associated with password entity. + private String username; // Username associated with password entity. + private String password; // Password of password entity. + private String notes; // Notes associated with the password entity. + private String createdAt; // Date of password entity when the entity was first saved. + private String updatedAt; // Date of password entity when the entity was last updated. + + // Constructor to initialize a new password model without an ID. + public PasswordModel(String domain, String username, String password, String notes) { + this.domain = domain; + this.username = username; + this.password = password; + this.notes = notes; + + // Retrieve the current date and time + LocalDateTime currentDate = LocalDateTime.now(); + + // Formatting the time so that it is better seen by users + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + this.createdAt = currentDate.format(formatter); + this.updatedAt = currentDate.format(formatter); + } + + // Constructor with ID (e.g., when fetching from the database) + public PasswordModel(int id, String domain, String username, String password, String notes, String createdAt, String updatedAt) { + this.id = id; + this.domain = domain; + this.username = username; + this.password = password; + this.notes = notes; + this.createdAt = createdAt; + this.updatedAt = updatedAt; + } + + // Getters and Setters + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNotes() { + return notes; + } + + public void setNotes(String notes) { + this.notes = notes; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return "PasswordModel{" + + "id=" + id + + ", domain='" + domain + '\'' + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", notes='" + notes + '\'' + + ", createdAt='" + createdAt + '\'' + + ", updatedAt='" + updatedAt + '\'' + + '}'; + } } diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java index 8fe2117f..6d1ee757 100644 --- a/app/src/main/java/com/passwordmanager/utils/Controller.java +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -9,139 +9,139 @@ import com.passwordmanager.models.PasswordModel; public class Controller { - private MyDatabaseHelper dbHelper; + private MyDatabaseHelper dbHelper; - public Controller(Context context) { - dbHelper = new MyDatabaseHelper(context); + public Controller(Context context) { + dbHelper = new MyDatabaseHelper(context); + } + + public int savePasswordEntity(String domain, String username, String password, String notes) { + // Return -2 on empty parameter. + // Return -1 on error in SQL. + // Return +ve on success. + + if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { + return -2; } - public int savePasswordEntity(String domain, String username, String password, String notes) { - // Return -2 on empty parameter. - // Return -1 on error in SQL. - // Return +ve on success. + SQLiteDatabase db = dbHelper.getWritableDatabase(); - if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { - return -2; - } + ContentValues values = new ContentValues(); + values.put("domain", domain); + values.put("username", username); + values.put("password", password); + if (!notes.isEmpty()) values.put("notes", notes); - SQLiteDatabase db = dbHelper.getWritableDatabase(); + long newRowId = db.insert(MyDatabaseHelper.PASSWORDS_TABLE, null, values); + db.close(); - ContentValues values = new ContentValues(); - values.put("domain", domain); - values.put("username", username); - values.put("password", password); - if (!notes.isEmpty()) values.put("notes", notes); + return newRowId == -1 ? -1 : (int) newRowId; + } - long newRowId = db.insert(MyDatabaseHelper.PASSWORDS_TABLE, null, values); - db.close(); + public PasswordModel getPasswordById(int id) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); - return newRowId == -1 ? -1 : (int) newRowId; - } + // Define the selection criteria + String selection = "id = ?"; + String[] selectionArgs = new String[]{String.valueOf(id)}; + + Cursor cursor = db.query( + MyDatabaseHelper.PASSWORDS_TABLE, + null, + selection, + selectionArgs, + null, null, null); + + PasswordModel passwordModel = null; + + if (cursor != null) { + if (cursor.moveToFirst()) { + String domain = cursor.getString(cursor.getColumnIndex("domain")); + String username = cursor.getString(cursor.getColumnIndex("username")); + String password = cursor.getString(cursor.getColumnIndex("password")); + String notes = cursor.getString(cursor.getColumnIndex("notes")); + String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); + String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); - public PasswordModel getPasswordById(int id) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Define the selection criteria - String selection = "id = ?"; - String[] selectionArgs = new String[]{String.valueOf(id)}; - - Cursor cursor = db.query( - MyDatabaseHelper.PASSWORDS_TABLE, - null, - selection, - selectionArgs, - null, null, null); - - PasswordModel passwordModel = null; - - if (cursor != null) { - if (cursor.moveToFirst()) { - String domain = cursor.getString(cursor.getColumnIndex("domain")); - String username = cursor.getString(cursor.getColumnIndex("username")); - String password = cursor.getString(cursor.getColumnIndex("password")); - String notes = cursor.getString(cursor.getColumnIndex("notes")); - String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); - String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); - - passwordModel = new PasswordModel(id, domain, username, password, notes, createdAt, updatedAt); - } - cursor.close(); - } - - db.close(); - return passwordModel; + passwordModel = new PasswordModel(id, domain, username, password, notes, createdAt, updatedAt); + } + cursor.close(); } - - public PasswordModel getPasswordByUsernameAndDomain(String username, String domain) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Define the selection criteria - String selection = "username = ? AND domain = ?"; - String[] selectionArgs = new String[]{username, domain}; - - Cursor cursor = db.query( - MyDatabaseHelper.PASSWORDS_TABLE, - null, - selection, - selectionArgs, - null, - null, - null - ); - - PasswordModel passwordModel = null; - - if (cursor != null) { - if (cursor.moveToFirst()) { - int id = cursor.getInt(cursor.getColumnIndex("id")); - String retrievedUsername = cursor.getString(cursor.getColumnIndex("username")); - String retrievedDomain = cursor.getString(cursor.getColumnIndex("domain")); - String password = cursor.getString(cursor.getColumnIndex("password")); - String notes = cursor.getString(cursor.getColumnIndex("notes")); - String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); - String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); - - passwordModel = new PasswordModel(id, retrievedDomain, retrievedUsername, password, notes, createdAt, updatedAt); - } - cursor.close(); - } - - db.close(); - return passwordModel; + + db.close(); + return passwordModel; + } + + public PasswordModel getPasswordByUsernameAndDomain(String username, String domain) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Define the selection criteria + String selection = "username = ? AND domain = ?"; + String[] selectionArgs = new String[]{username, domain}; + + Cursor cursor = db.query( + MyDatabaseHelper.PASSWORDS_TABLE, + null, + selection, + selectionArgs, + null, + null, + null + ); + + PasswordModel passwordModel = null; + + if (cursor != null) { + if (cursor.moveToFirst()) { + int id = cursor.getInt(cursor.getColumnIndex("id")); + String retrievedUsername = cursor.getString(cursor.getColumnIndex("username")); + String retrievedDomain = cursor.getString(cursor.getColumnIndex("domain")); + String password = cursor.getString(cursor.getColumnIndex("password")); + String notes = cursor.getString(cursor.getColumnIndex("notes")); + String createdAt = cursor.getString(cursor.getColumnIndex("createdat")); + String updatedAt = cursor.getString(cursor.getColumnIndex("updatedat")); + + passwordModel = new PasswordModel(id, retrievedDomain, retrievedUsername, password, notes, createdAt, updatedAt); + } + cursor.close(); } + db.close(); + return passwordModel; + } - public int updatePassword(int id, String domain, String username, String password, String notes) { - // Return -2 on empty parameter. - // Return -1 on error in SQL. - // Return number of rows affected on success. - if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { - return -2; - } + public int updatePassword(int id, String domain, String username, String password, String notes) { + // Return -2 on empty parameter. + // Return -1 on error in SQL. + // Return number of rows affected on success. - SQLiteDatabase db = dbHelper.getWritableDatabase(); + if (domain.isEmpty() || username.isEmpty() || password.isEmpty()) { + return -2; + } - ContentValues values = new ContentValues(); - values.put("domain", domain); - values.put("username", username); - values.put("password", password); - values.put("notes", notes); - values.put("updatedat", "datetime('now')"); // Update the updatedAt column + SQLiteDatabase db = dbHelper.getWritableDatabase(); - int rowsAffected = db.update(MyDatabaseHelper.PASSWORDS_TABLE, values, "id = ?", new String[]{String.valueOf(id)}); - db.close(); + ContentValues values = new ContentValues(); + values.put("domain", domain); + values.put("username", username); + values.put("password", password); + values.put("notes", notes); + values.put("updatedat", "datetime('now')"); // Update the updatedAt column - return rowsAffected == 0 ? -1 : rowsAffected; - } + int rowsAffected = db.update(MyDatabaseHelper.PASSWORDS_TABLE, values, "id = ?", new String[]{String.valueOf(id)}); + db.close(); - public int deletePassword(int id) { - // Return number of rows affected (should be 1 if the deletion is successful). + return rowsAffected == 0 ? -1 : rowsAffected; + } - SQLiteDatabase db = dbHelper.getWritableDatabase(); - int rowsDeleted = db.delete(MyDatabaseHelper.PASSWORDS_TABLE, "id = ?", new String[]{String.valueOf(id)}); - db.close(); + public int deletePassword(int id) { + // Return number of rows affected (should be 1 if the deletion is successful). - return rowsDeleted; - } + SQLiteDatabase db = dbHelper.getWritableDatabase(); + int rowsDeleted = db.delete(MyDatabaseHelper.PASSWORDS_TABLE, "id = ?", new String[]{String.valueOf(id)}); + db.close(); + + return rowsDeleted; + } } From 1daaff497c8807bafd344f636dc33ce4c3c8dbd7 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 20:59:03 +0530 Subject: [PATCH 13/27] refactor: the id and strings --- .../passwordmanager/LoadPasswordActivity.java | 6 +- .../passwordmanager/SavePasswordActivity.java | 10 +- .../main/res/layout/activity_loadpassword.xml | 127 ++++++------ app/src/main/res/layout/activity_main.xml | 102 +++++----- .../main/res/layout/activity_savepassword.xml | 183 +++++++++--------- app/src/main/res/values/strings.xml | 38 ++-- 6 files changed, 231 insertions(+), 235 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java index b717bc41..d98d72b2 100644 --- a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java @@ -32,9 +32,9 @@ protected void onCreate(Bundle savedInstanceState) { // Inizalize all the local view based variables private void initalizeViewVariables() { - domainTextInput = findViewById(R.id.domain_text_input); - usernameTextInput = findViewById(R.id.username_text_input); - loadpasswordbtn = findViewById(R.id.load_button); + domainTextInput = findViewById(R.id.input_domain); + usernameTextInput = findViewById(R.id.input_username); + loadpasswordbtn = findViewById(R.id.load_password_btn); } // Added all the onclick event listiners diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java index 584ead9c..39ef65d1 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/SavePasswordActivity.java @@ -33,11 +33,11 @@ protected void onCreate(Bundle savedInstanceState) { // Inizalize all the local view based variables private void initalizeViewVariables() { - domainTextInput = findViewById(R.id.domain_text_input); - usernameTextInput = findViewById(R.id.username_text_input); - passwordTextInput = findViewById(R.id.password_text_input); - notesTextInput = findViewById(R.id.notes_text_input); - savepasswordbtn = findViewById(R.id.save_button); + domainTextInput = findViewById(R.id.input_domain); + usernameTextInput = findViewById(R.id.input_username); + passwordTextInput = findViewById(R.id.input_password); + notesTextInput = findViewById(R.id.input_notes); + savepasswordbtn = findViewById(R.id.save_password_btn); } // Added all the onclick event listiners diff --git a/app/src/main/res/layout/activity_loadpassword.xml b/app/src/main/res/layout/activity_loadpassword.xml index 2f480b2d..ba5e32ac 100644 --- a/app/src/main/res/layout/activity_loadpassword.xml +++ b/app/src/main/res/layout/activity_loadpassword.xml @@ -4,75 +4,72 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:orientation="vertical" + android:orientation="vertical" tools:context=".SavePasswordActivity" - android:padding="4sp" > - - - - - + android:padding="4sp" > - + + + + + + + + - - - - - + android:inputType="text" + android:maxLines="1" /> + + - - - - - - - - - + + + android:inputType="text" + android:maxLines="1" /> - - - - - \ No newline at end of file + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 553023e3..fbaa473a 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,62 +4,60 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:orientation="vertical" + android:orientation="vertical" tools:context=".SavePasswordActivity" - android:padding="4sp" > + android:padding="4sp" > - + - + - - + + - - - - - - - + + + - + - \ No newline at end of file + + + diff --git a/app/src/main/res/layout/activity_savepassword.xml b/app/src/main/res/layout/activity_savepassword.xml index cc576eeb..ddb4c442 100644 --- a/app/src/main/res/layout/activity_savepassword.xml +++ b/app/src/main/res/layout/activity_savepassword.xml @@ -4,106 +4,105 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" - android:orientation="vertical" + android:orientation="vertical" tools:context=".SavePasswordActivity" - android:padding="4sp" > + android:padding="4sp" > + + - + + + + + + + android:inputType="text" + android:maxLines="1" /> - - - - + + + + - - - - - - - - - - - + android:inputType="text" + android:maxLines="1" /> - - - - - - - - - - - + - + + + + + - + + + android:inputType="textMultiLine" + android:minLines="1" + android:maxLines="3" /> - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b1548612..35fb5c66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,23 +1,25 @@ Password Manager - v0.1.0-Alpha - - - Save Password - Load Password - Quit - - - Save Password - Load Password - Domain - Username - Password - Notes - Save Password - Load Password - - + v0.1.0-Alpha + + + Quit + + + Domain + Username + Password + Notes + Save Password + Load Password + + + Load Password + + + Save Password + + Permission Granted Permission Denied \ No newline at end of file From 8618742ba1fe4a0a2b319b498e8134fc141b3fc8 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 21:02:16 +0530 Subject: [PATCH 14/27] update the app version --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2417df54..6752fcb1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 26 targetSdk 33 versionCode 1 - versionName "1.0" + versionName "0.1.0-Alpha" } signingConfigs { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b87edb3a..1779e477 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,7 @@ android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" tools:ignore="ScopedStorage" /> + @@ -33,8 +34,8 @@ - - + + From e74921fc1d3e4d0c145e44864794047d33c5a2ec Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Sun, 11 Aug 2024 21:05:18 +0530 Subject: [PATCH 15/27] Update activity_main.xml --- app/src/main/java/com/passwordmanager/MainActivity.java | 4 ++-- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/activity_savepassword.xml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/MainActivity.java index a6236bec..ec7e1927 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/MainActivity.java @@ -55,8 +55,8 @@ public void onRequestPermissionsResult( // Inizalize all the local view based variables private void initalizeViewVariables() { - savepasswordbtn = findViewById(R.id.save_password_activity_button); - loadpasswordbtn = findViewById(R.id.load_password_activity_button); + savepasswordbtn = findViewById(R.id.save_password_btn); + loadpasswordbtn = findViewById(R.id.load_password_btn); quitbtn = findViewById(R.id.quit_button); } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fbaa473a..d69e62cd 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -57,7 +57,7 @@ android:id="@+id/quit_button" android:layout_width="match_parent" android:layout_height="wrap_content" - android:text="@string/load_password_btn" + android:text="@string/quit_button_text" android:textSize="14dp" /> diff --git a/app/src/main/res/layout/activity_savepassword.xml b/app/src/main/res/layout/activity_savepassword.xml index ddb4c442..b10538f1 100644 --- a/app/src/main/res/layout/activity_savepassword.xml +++ b/app/src/main/res/layout/activity_savepassword.xml @@ -65,7 +65,7 @@ android:hint="@string/hint_password"> Date: Sun, 11 Aug 2024 22:19:34 +0530 Subject: [PATCH 16/27] Rename app/src/main/java/com/passwordmanager/LoadPasswordActivity.java to app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java --- .../java/com/passwordmanager/{ => ui}/LoadPasswordActivity.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/java/com/passwordmanager/{ => ui}/LoadPasswordActivity.java (100%) diff --git a/app/src/main/java/com/passwordmanager/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java similarity index 100% rename from app/src/main/java/com/passwordmanager/LoadPasswordActivity.java rename to app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java From 30277c653254e2cd845bc823751270c0654403a0 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 10:46:50 +0530 Subject: [PATCH 17/27] refactor: organize activity files in ui folders --- app/src/main/AndroidManifest.xml | 6 +++--- .../java/com/passwordmanager/ui/LoadPasswordActivity.java | 3 ++- .../java/com/passwordmanager/{ => ui}/MainActivity.java | 4 +++- .../com/passwordmanager/{ => ui}/SavePasswordActivity.java | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) rename app/src/main/java/com/passwordmanager/{ => ui}/MainActivity.java (97%) rename app/src/main/java/com/passwordmanager/{ => ui}/SavePasswordActivity.java (97%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1779e477..a5c3dbdb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -26,7 +26,7 @@ android:supportsRtl="true" android:theme="@style/PasswordManagerTheme"> @@ -34,8 +34,8 @@ - - + + diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index d98d72b2..3f741730 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -1,4 +1,4 @@ -package com.passwordmanager; +package com.passwordmanager.ui; import android.os.Bundle; import android.widget.Toast; @@ -7,6 +7,7 @@ import android.widget.Button; import android.widget.TextView; +import com.passwordmanager.R; import com.passwordmanager.utils.Controller; import com.passwordmanager.models.PasswordModel; diff --git a/app/src/main/java/com/passwordmanager/MainActivity.java b/app/src/main/java/com/passwordmanager/ui/MainActivity.java similarity index 97% rename from app/src/main/java/com/passwordmanager/MainActivity.java rename to app/src/main/java/com/passwordmanager/ui/MainActivity.java index ec7e1927..5956629b 100644 --- a/app/src/main/java/com/passwordmanager/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/MainActivity.java @@ -1,10 +1,12 @@ -package com.passwordmanager; +package com.passwordmanager.ui; import android.os.Bundle; import android.content.Intent; import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; + +import com.passwordmanager.R; // import com.passwordmanager.utils.Permissions; public class MainActivity extends AppCompatActivity { diff --git a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java similarity index 97% rename from app/src/main/java/com/passwordmanager/SavePasswordActivity.java rename to app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java index 39ef65d1..5dbc7e8d 100644 --- a/app/src/main/java/com/passwordmanager/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java @@ -1,4 +1,4 @@ -package com.passwordmanager; +package com.passwordmanager.ui; import android.os.Bundle; import android.widget.Toast; @@ -7,6 +7,7 @@ import android.widget.Button; import android.widget.TextView; +import com.passwordmanager.R; import com.passwordmanager.utils.Controller; public class SavePasswordActivity extends AppCompatActivity { From 1b9e210775f41e078319147a9be84a2647fbaa22 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 10:57:02 +0530 Subject: [PATCH 18/27] refactor: move hard code string to res.strings --- .../java/com/passwordmanager/ui/LoadPasswordActivity.java | 2 +- .../java/com/passwordmanager/ui/SavePasswordActivity.java | 6 +++--- app/src/main/res/values/strings.xml | 6 ++++++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 3f741730..12328498 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -49,7 +49,7 @@ private void addOnClickListenerOnButton() { PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); if (passwordmodel == null) { - Toast.makeText(LoadPasswordActivity.this, "404: Not Found!!", Toast.LENGTH_SHORT).show(); + Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); } else { Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); } diff --git a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java index 5dbc7e8d..5ce354fd 100644 --- a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java @@ -54,12 +54,12 @@ private void addOnClickListenerOnButton() { int res = controller.savePasswordEntity(domain, username, password, notes); if (res == -2) { - Toast.makeText(SavePasswordActivity.this, "please fill the form first!!", Toast.LENGTH_SHORT).show(); + Toast.makeText(SavePasswordActivity.this, getString(R.string.warn_fill_form), Toast.LENGTH_SHORT).show(); } else if (res == -1) { - Toast.makeText(SavePasswordActivity.this, "Failed: please try again!!", Toast.LENGTH_SHORT).show(); + Toast.makeText(SavePasswordActivity.this, getString(R.string.fail_msg), Toast.LENGTH_SHORT).show(); } else { - Toast.makeText(SavePasswordActivity.this, "Success: " + res, Toast.LENGTH_SHORT).show(); + Toast.makeText(SavePasswordActivity.this, getString(R.string.sucess_clause) + res, Toast.LENGTH_SHORT).show(); } }); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35fb5c66..90a45572 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,4 +22,10 @@ Permission Granted Permission Denied + + + 404: Not Found!! + Warning: please fill the form first!! + Failed: please try again!! + Success: \ No newline at end of file From 59a6bd01279f6aad9edbf8d71c67c385a5236742 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 11:33:27 +0530 Subject: [PATCH 19/27] refactor: implemented viewbinding --- app/build.gradle | 4 ++ .../ui/LoadPasswordActivity.java | 29 +++++---------- .../com/passwordmanager/ui/MainActivity.java | 31 +++++----------- .../ui/SavePasswordActivity.java | 37 ++++++------------- ...assword.xml => activity_load_password.xml} | 0 app/src/main/res/layout/activity_main.xml | 2 +- ...assword.xml => activity_save_password.xml} | 0 7 files changed, 35 insertions(+), 68 deletions(-) rename app/src/main/res/layout/{activity_loadpassword.xml => activity_load_password.xml} (100%) rename app/src/main/res/layout/{activity_savepassword.xml => activity_save_password.xml} (100%) diff --git a/app/build.gradle b/app/build.gradle index 6752fcb1..62a6b94b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,6 +13,10 @@ android { versionCode 1 versionName "0.1.0-Alpha" } + + viewBinding { + enabled = true + } signingConfigs { release { diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 12328498..7a961102 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -10,39 +10,28 @@ import com.passwordmanager.R; import com.passwordmanager.utils.Controller; import com.passwordmanager.models.PasswordModel; +import com.passwordmanager.databinding.ActivityLoadPasswordBinding; public class LoadPasswordActivity extends AppCompatActivity { - private TextView domainTextInput; - private TextView usernameTextInput; - private Button loadpasswordbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_loadpassword); - - // Initalizing the view elememts - initalizeViewVariables(); - + ActivityLoadPasswordBinding binding = ActivityLoadPasswordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + // Add event onclick listener - addOnClickListenerOnButton(); + addOnClickListenerOnButton(binding); // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } - // Inizalize all the local view based variables - private void initalizeViewVariables() { - domainTextInput = findViewById(R.id.input_domain); - usernameTextInput = findViewById(R.id.input_username); - loadpasswordbtn = findViewById(R.id.load_password_btn); - } - // Added all the onclick event listiners - private void addOnClickListenerOnButton() { - loadpasswordbtn.setOnClickListener(v -> { - String domain = domainTextInput.getText().toString(); - String username = usernameTextInput.getText().toString(); + private void addOnClickListenerOnButton(ActivityLoadPasswordBinding binding) { + binding.loadPasswordBtn.setOnClickListener(v -> { + String domain = binding.inputDomain.getText().toString(); + String username = binding.inputUsername.getText().toString(); Controller controller = new Controller(LoadPasswordActivity.this); diff --git a/app/src/main/java/com/passwordmanager/ui/MainActivity.java b/app/src/main/java/com/passwordmanager/ui/MainActivity.java index 5956629b..841b1458 100644 --- a/app/src/main/java/com/passwordmanager/ui/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/MainActivity.java @@ -5,28 +5,24 @@ import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; +import android.view.LayoutInflater; import com.passwordmanager.R; +import com.passwordmanager.databinding.ActivityMainBinding; // import com.passwordmanager.utils.Permissions; public class MainActivity extends AppCompatActivity { - private Button savepasswordbtn; - private Button loadpasswordbtn; - private Button quitbtn; - // private Permissions permissionsHandle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - - // Initalizing the view elememts - initalizeViewVariables(); - + ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + // Add event onclick listener - addOnClickListenerOnButton(); + addOnClickListenerOnButton(binding); // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); @@ -55,26 +51,19 @@ public void onRequestPermissionsResult( } */ - // Inizalize all the local view based variables - private void initalizeViewVariables() { - savepasswordbtn = findViewById(R.id.save_password_btn); - loadpasswordbtn = findViewById(R.id.load_password_btn); - quitbtn = findViewById(R.id.quit_button); - } - // Added all the onclick event listiners - private void addOnClickListenerOnButton() { - savepasswordbtn.setOnClickListener(v -> { + private void addOnClickListenerOnButton(ActivityMainBinding binding) { + binding.savePasswordBtn.setOnClickListener(v -> { Intent savepasswordintent = new Intent(MainActivity.this, SavePasswordActivity.class); startActivity(savepasswordintent); }); - loadpasswordbtn.setOnClickListener(v -> { + binding.loadPasswordBtn.setOnClickListener(v -> { Intent loadpasswordintent = new Intent(MainActivity.this, LoadPasswordActivity.class); startActivity(loadpasswordintent); }); - quitbtn.setOnClickListener(v -> { + binding.quitBtn.setOnClickListener(v -> { finishAndRemoveTask(); }); } diff --git a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java index 5ce354fd..2c8f7537 100644 --- a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java @@ -9,45 +9,30 @@ import com.passwordmanager.R; import com.passwordmanager.utils.Controller; +import com.passwordmanager.databinding.ActivitySavePasswordBinding; public class SavePasswordActivity extends AppCompatActivity { - private TextView domainTextInput; - private TextView usernameTextInput; - private TextView passwordTextInput; - private TextView notesTextInput; - private Button savepasswordbtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_savepassword); - - // Initalizing the view elememts - initalizeViewVariables(); - + ActivitySavePasswordBinding binding = ActivitySavePasswordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + // Add event onclick listener - addOnClickListenerOnButton(); + addOnClickListenerOnButton(binding); // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } - // Inizalize all the local view based variables - private void initalizeViewVariables() { - domainTextInput = findViewById(R.id.input_domain); - usernameTextInput = findViewById(R.id.input_username); - passwordTextInput = findViewById(R.id.input_password); - notesTextInput = findViewById(R.id.input_notes); - savepasswordbtn = findViewById(R.id.save_password_btn); - } - // Added all the onclick event listiners - private void addOnClickListenerOnButton() { - savepasswordbtn.setOnClickListener(v -> { - String domain = domainTextInput.getText().toString(); - String username = usernameTextInput.getText().toString(); - String password = passwordTextInput.getText().toString(); - String notes = notesTextInput.getText().toString(); + private void addOnClickListenerOnButton(ActivitySavePasswordBinding binding) { + binding.savePasswordBtn.setOnClickListener(v -> { + String domain = binding.inputDomain.getText().toString(); + String username = binding.inputUsername.getText().toString(); + String password = binding.inputPassword.getText().toString(); + String notes = binding.inputNotes.getText().toString(); Controller controller = new Controller(SavePasswordActivity.this); diff --git a/app/src/main/res/layout/activity_loadpassword.xml b/app/src/main/res/layout/activity_load_password.xml similarity index 100% rename from app/src/main/res/layout/activity_loadpassword.xml rename to app/src/main/res/layout/activity_load_password.xml diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d69e62cd..d025f6a6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -54,7 +54,7 @@ android:textSize="14dp" /> Date: Mon, 12 Aug 2024 13:13:52 +0530 Subject: [PATCH 20/27] refactor: context in all layout files --- app/src/main/res/layout/activity_load_password.xml | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/activity_save_password.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/activity_load_password.xml b/app/src/main/res/layout/activity_load_password.xml index ba5e32ac..c5c55648 100644 --- a/app/src/main/res/layout/activity_load_password.xml +++ b/app/src/main/res/layout/activity_load_password.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:gravity="center" android:orientation="vertical" - tools:context=".SavePasswordActivity" + tools:context=".ui.LoadPasswordActivity" android:padding="4sp" > Date: Mon, 12 Aug 2024 14:24:15 +0530 Subject: [PATCH 21/27] feat: make a password view activity --- app/src/main/AndroidManifest.xml | 1 + .../ui/LoadPasswordActivity.java | 14 ++- .../com/passwordmanager/ui/MainActivity.java | 1 - .../ui/SavePasswordActivity.java | 2 - .../ui/ViewPasswordActivity.java | 59 ++++++++++++ .../res/layout/activity_view_password.xml | 94 +++++++++++++++++++ app/src/main/res/values/strings.xml | 16 +++- 7 files changed, 180 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java create mode 100644 app/src/main/res/layout/activity_view_password.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a5c3dbdb..9193cb55 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,7 @@ + diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 7a961102..1898f199 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -1,11 +1,10 @@ package com.passwordmanager.ui; import android.os.Bundle; +import android.content.Intent; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; -import android.widget.Button; -import android.widget.TextView; import com.passwordmanager.R; import com.passwordmanager.utils.Controller; @@ -40,7 +39,16 @@ private void addOnClickListenerOnButton(ActivityLoadPasswordBinding binding) { if (passwordmodel == null) { Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); } else { - Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + // Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + Intent viewpasswordintent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); + viewpasswordintent.putExtra("id", passwordmodel.getId()); + viewpasswordintent.putExtra("domain", passwordmodel.getDomain()); + viewpasswordintent.putExtra("username", passwordmodel.getUsername()); + viewpasswordintent.putExtra("password", passwordmodel.getPassword()); + viewpasswordintent.putExtra("notes", passwordmodel.getNotes()); + viewpasswordintent.putExtra("createdat", passwordmodel.getCreatedAt()); + viewpasswordintent.putExtra("updatedat", passwordmodel.getUpdatedAt()); + startActivity(viewpasswordintent); } }); } diff --git a/app/src/main/java/com/passwordmanager/ui/MainActivity.java b/app/src/main/java/com/passwordmanager/ui/MainActivity.java index 841b1458..a80dd48d 100644 --- a/app/src/main/java/com/passwordmanager/ui/MainActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/MainActivity.java @@ -2,7 +2,6 @@ import android.os.Bundle; import android.content.Intent; -import android.widget.Button; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; import android.view.LayoutInflater; diff --git a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java index 2c8f7537..39d40f47 100644 --- a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java @@ -4,8 +4,6 @@ import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; -import android.widget.Button; -import android.widget.TextView; import com.passwordmanager.R; import com.passwordmanager.utils.Controller; diff --git a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java new file mode 100644 index 00000000..53a54dec --- /dev/null +++ b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java @@ -0,0 +1,59 @@ +package com.passwordmanager.ui; + +import android.os.Bundle; +import android.content.Intent; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; +import android.view.LayoutInflater; + +import com.passwordmanager.R; +import com.passwordmanager.databinding.ActivityViewPasswordBinding; + +/* + Activity expects id, domain, username, password, notes, createdat, updatedat as intent parameters. +*/ + +public class ViewPasswordActivity extends AppCompatActivity { + private int passwordEnitityId = 0; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityViewPasswordBinding binding = ActivityViewPasswordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Intent intent = getIntent(); + passwordEnitityId = intent.getIntExtra("id", -1); // -1 is a invalid id. + + if (passwordEnitityId == -1) { //invalid enitity + finish(); + } + + // Put value in textviews + binding.tvDomain.setText(getString(R.string.domain_prefix) + " " + intent.getStringExtra("domain")); + binding.tvUsername.setText(getString(R.string.username_prefix) + " " + intent.getStringExtra("username")); + binding.tvPassword.setText(getString(R.string.password_prefix) + " " + intent.getStringExtra("password")); + binding.tvNotes.setText(getString(R.string.notes_prefix) + " " + intent.getStringExtra("notes")); + binding.tvCreatedAt.setText(getString(R.string.createdat_prefix) + " " + intent.getStringExtra("createdat")); + binding.tvUpdatedAt.setText(getString(R.string.updatedat_prefix) + " " + intent.getStringExtra("updatedat")); + + // Add event onclick listener + addOnClickListenerOnButton(binding); + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + } + + // Added all the onclick event listiners + private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { + binding.updatePasswordBtn.setOnClickListener(v -> { + // TODO: implement password update logic. + Toast.makeText(ActivityViewPasswordBinding.this, "update password feature under development", Toast.LENGTH_SHORT).show(); + }); + + binding.deletePasswordBtn.setOnClickListener(v -> { + // TODO: implement password delete logic. + Toast.makeText(ActivityViewPasswordBinding.this, "delete password feature under development", Toast.LENGTH_SHORT).show(); + }); + } +} diff --git a/app/src/main/res/layout/activity_view_password.xml b/app/src/main/res/layout/activity_view_password.xml new file mode 100644 index 00000000..99e7f3d7 --- /dev/null +++ b/app/src/main/res/layout/activity_view_password.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 90a45572..690ffe34 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,15 +10,29 @@ Username Password Notes + Save Password Load Password + Update Password + Delete Password Load Password Save Password - + + + View Password + + + Domain: + Username: + Password: + Notes: + CreatedAt: + UpdatedAt: + Permission Granted Permission Denied From 8b0a5db9288009b2290829e973b50aa1ebc039a1 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 14:34:10 +0530 Subject: [PATCH 22/27] feat: implement delete feature --- .../passwordmanager/ui/ViewPasswordActivity.java | 13 +++++++++++-- .../java/com/passwordmanager/utils/Controller.java | 2 +- app/src/main/res/values/strings.xml | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java index 53a54dec..ae54b936 100644 --- a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java @@ -7,6 +7,7 @@ import android.view.LayoutInflater; import com.passwordmanager.R; +import com.passwordmanager.utils.Controller; import com.passwordmanager.databinding.ActivityViewPasswordBinding; /* @@ -52,8 +53,16 @@ private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { }); binding.deletePasswordBtn.setOnClickListener(v -> { - // TODO: implement password delete logic. - Toast.makeText(ActivityViewPasswordBinding.this, "delete password feature under development", Toast.LENGTH_SHORT).show(); + Controller controller = new Controller(ViewPasswordActivity.this); + int res = controller.deletePassword(passwordEnitityId); + + if (res == 1) { + Toast.makeText(ActivityViewPasswordBinding.this, getString(R.string.delete_sucess_msg), Toast.LENGTH_SHORT).show(); + + finish(); + } else { + Toast.makeText(ActivityViewPasswordBinding.this, getString(R.string.something_went_wrong_msg), Toast.LENGTH_SHORT).show(); + } }); } } diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java index 6d1ee757..03bc983b 100644 --- a/app/src/main/java/com/passwordmanager/utils/Controller.java +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -136,7 +136,7 @@ public int updatePassword(int id, String domain, String username, String passwor } public int deletePassword(int id) { - // Return number of rows affected (should be 1 if the deletion is successful). + // Return number of rows affected (should be 1 if the deletion is successful). SQLiteDatabase db = dbHelper.getWritableDatabase(); int rowsDeleted = db.delete(MyDatabaseHelper.PASSWORDS_TABLE, "id = ?", new String[]{String.valueOf(id)}); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 690ffe34..8601855b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,4 +42,6 @@ Warning: please fill the form first!! Failed: please try again!! Success: + Deleted Successfully + Something Went Wrong!! \ No newline at end of file From b65961bcec871facd496f40581d77fa63532a3be Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 14:38:30 +0530 Subject: [PATCH 23/27] Update ViewPasswordActivity.java --- .../java/com/passwordmanager/ui/ViewPasswordActivity.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java index ae54b936..d5451e0e 100644 --- a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java @@ -2,6 +2,7 @@ import android.os.Bundle; import android.content.Intent; +import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; import android.view.LayoutInflater; @@ -49,7 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { binding.updatePasswordBtn.setOnClickListener(v -> { // TODO: implement password update logic. - Toast.makeText(ActivityViewPasswordBinding.this, "update password feature under development", Toast.LENGTH_SHORT).show(); + Toast.makeText(ViewPasswordActivity.this, "update password feature under development", Toast.LENGTH_SHORT).show(); }); binding.deletePasswordBtn.setOnClickListener(v -> { @@ -57,11 +58,11 @@ private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { int res = controller.deletePassword(passwordEnitityId); if (res == 1) { - Toast.makeText(ActivityViewPasswordBinding.this, getString(R.string.delete_sucess_msg), Toast.LENGTH_SHORT).show(); + Toast.makeText(ViewPasswordActivity.this, getString(R.string.delete_sucess_msg), Toast.LENGTH_SHORT).show(); finish(); } else { - Toast.makeText(ActivityViewPasswordBinding.this, getString(R.string.something_went_wrong_msg), Toast.LENGTH_SHORT).show(); + Toast.makeText(ViewPasswordActivity.this, getString(R.string.something_went_wrong_msg), Toast.LENGTH_SHORT).show(); } }); } From 48098de51716de07b0adb21a692d5a36cd03883e Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 18:40:02 +0530 Subject: [PATCH 24/27] feat: create a update activity --- app/src/main/AndroidManifest.xml | 1 + .../ui/LoadPasswordActivity.java | 10 +- .../ui/UpdatePasswordActivity.java | 75 +++++++++++ .../ui/ViewPasswordActivity.java | 46 ++++--- .../res/layout/activity_update_password.xml | 116 ++++++++++++++++++ app/src/main/res/values/strings.xml | 11 +- installondevice.bat | 12 +- settings.gradle | 2 +- 8 files changed, 238 insertions(+), 35 deletions(-) create mode 100644 app/src/main/java/com/passwordmanager/ui/UpdatePasswordActivity.java create mode 100644 app/src/main/res/layout/activity_update_password.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9193cb55..4d70ade2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ + diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 1898f199..6b1bb9dc 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -39,15 +39,9 @@ private void addOnClickListenerOnButton(ActivityLoadPasswordBinding binding) { if (passwordmodel == null) { Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); } else { - // Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); Intent viewpasswordintent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); - viewpasswordintent.putExtra("id", passwordmodel.getId()); - viewpasswordintent.putExtra("domain", passwordmodel.getDomain()); - viewpasswordintent.putExtra("username", passwordmodel.getUsername()); - viewpasswordintent.putExtra("password", passwordmodel.getPassword()); - viewpasswordintent.putExtra("notes", passwordmodel.getNotes()); - viewpasswordintent.putExtra("createdat", passwordmodel.getCreatedAt()); - viewpasswordintent.putExtra("updatedat", passwordmodel.getUpdatedAt()); + viewpasswordintent.putExtra("id", passwordmodel.getId()); startActivity(viewpasswordintent); } }); diff --git a/app/src/main/java/com/passwordmanager/ui/UpdatePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/UpdatePasswordActivity.java new file mode 100644 index 00000000..b078dc41 --- /dev/null +++ b/app/src/main/java/com/passwordmanager/ui/UpdatePasswordActivity.java @@ -0,0 +1,75 @@ +package com.passwordmanager.ui; + +import android.os.Bundle; +import android.content.Intent; +import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; +import android.view.LayoutInflater; + +import com.passwordmanager.R; +import com.passwordmanager.utils.Controller; +import com.passwordmanager.models.PasswordModel; +import com.passwordmanager.databinding.ActivityUpdatePasswordBinding; + +/* + Activity expects id as intent parameters. +*/ + +public class UpdatePasswordActivity extends AppCompatActivity { + private int passwordEnitityId = 0; + private Controller controller; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ActivityUpdatePasswordBinding binding = ActivityUpdatePasswordBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + Intent intent = getIntent(); + passwordEnitityId = intent.getIntExtra("id", -1); // -1 is a invalid id. + + if (passwordEnitityId == -1) { //invalid enitity + finish(); + } + + controller = new Controller(UpdatePasswordActivity.this); + PasswordModel passwordmodel = controller.getPasswordById(passwordEnitityId); + + // Put value in text view & edit texts + binding.tvId.setText(getString(R.string.id_prefix) + " " + passwordEnitityId); + binding.inputDomain.setText(passwordmodel.getDomain()); + binding.inputUsername.setText(passwordmodel.getUsername()); + binding.inputPassword.setText(passwordmodel.getPassword()); + binding.inputNotes.setText(passwordmodel.getNotes()); + + // Add event onclick listener + addOnClickListenerOnButton(binding); + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + } + + // Added all the onclick event listiners + private void addOnClickListenerOnButton(ActivityUpdatePasswordBinding binding) { + binding.updatePasswordBtn.setOnClickListener(v -> { + // TODO: implement password update logic. + String newDomain = binding.inputDomain.getText().toString(); + String newUsername = binding.inputUsername.getText().toString(); + String newPassword = binding.inputPassword.getText().toString(); + String newNotes = binding.inputNotes.getText().toString(); + + int res = controller.updatePassword(passwordEnitityId, newDomain, newUsername, newPassword, newNotes); + + if (res == 1) { + Toast.makeText(UpdatePasswordActivity.this, getString(R.string.update_sucess_msg), Toast.LENGTH_SHORT).show(); + + finish(); + } else { + Toast.makeText(UpdatePasswordActivity.this, getString(R.string.something_went_wrong_msg), Toast.LENGTH_SHORT).show(); + } + + finish(); + }); + } +} diff --git a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java index d5451e0e..c732c7b8 100644 --- a/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/ViewPasswordActivity.java @@ -9,6 +9,7 @@ import com.passwordmanager.R; import com.passwordmanager.utils.Controller; +import com.passwordmanager.models.PasswordModel; import com.passwordmanager.databinding.ActivityViewPasswordBinding; /* @@ -17,44 +18,55 @@ public class ViewPasswordActivity extends AppCompatActivity { private int passwordEnitityId = 0; + private ActivityViewPasswordBinding binding; + private Controller controller; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityViewPasswordBinding binding = ActivityViewPasswordBinding.inflate(getLayoutInflater()); + binding = ActivityViewPasswordBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); Intent intent = getIntent(); - passwordEnitityId = intent.getIntExtra("id", -1); // -1 is a invalid id. + passwordEnitityId = intent.getIntExtra("id", 1); // -1 is a invalid id. if (passwordEnitityId == -1) { //invalid enitity finish(); } - // Put value in textviews - binding.tvDomain.setText(getString(R.string.domain_prefix) + " " + intent.getStringExtra("domain")); - binding.tvUsername.setText(getString(R.string.username_prefix) + " " + intent.getStringExtra("username")); - binding.tvPassword.setText(getString(R.string.password_prefix) + " " + intent.getStringExtra("password")); - binding.tvNotes.setText(getString(R.string.notes_prefix) + " " + intent.getStringExtra("notes")); - binding.tvCreatedAt.setText(getString(R.string.createdat_prefix) + " " + intent.getStringExtra("createdat")); - binding.tvUpdatedAt.setText(getString(R.string.updatedat_prefix) + " " + intent.getStringExtra("updatedat")); + controller = new Controller(ViewPasswordActivity.this); + + // Filling the textviews with data + // fillDataInTextview(); // Add event onclick listener - addOnClickListenerOnButton(binding); + addOnClickListenerOnButton(); // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } + private void fillDataInTextview() { + PasswordModel passwordmodel = controller.getPasswordById(passwordEnitityId); + + binding.tvDomain.setText(getString(R.string.domain_prefix) + " " + passwordmodel.getDomain()); + binding.tvUsername.setText(getString(R.string.username_prefix) + " " + passwordmodel.getUsername()); + binding.tvPassword.setText(getString(R.string.password_prefix) + " " + passwordmodel.getPassword()); + binding.tvNotes.setText(getString(R.string.notes_prefix) + " " + passwordmodel.getNotes()); + binding.tvCreatedAt.setText(getString(R.string.createdat_prefix) + " " + passwordmodel.getCreatedAt()); + binding.tvUpdatedAt.setText(getString(R.string.updatedat_prefix) + " " + passwordmodel.getUpdatedAt()); + } + // Added all the onclick event listiners - private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { + private void addOnClickListenerOnButton() { binding.updatePasswordBtn.setOnClickListener(v -> { - // TODO: implement password update logic. - Toast.makeText(ViewPasswordActivity.this, "update password feature under development", Toast.LENGTH_SHORT).show(); + Intent viewpasswordintent = new Intent(ViewPasswordActivity.this, UpdatePasswordActivity.class); + viewpasswordintent.putExtra("id", passwordEnitityId); + startActivity(viewpasswordintent); }); binding.deletePasswordBtn.setOnClickListener(v -> { - Controller controller = new Controller(ViewPasswordActivity.this); + controller = new Controller(ViewPasswordActivity.this); int res = controller.deletePassword(passwordEnitityId); if (res == 1) { @@ -66,4 +78,10 @@ private void addOnClickListenerOnButton(ActivityViewPasswordBinding binding) { } }); } + + @Override + protected void onResume() { + super.onResume(); + fillDataInTextview(); + } } diff --git a/app/src/main/res/layout/activity_update_password.xml b/app/src/main/res/layout/activity_update_password.xml new file mode 100644 index 00000000..7bad6921 --- /dev/null +++ b/app/src/main/res/layout/activity_update_password.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8601855b..f4904f18 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -16,16 +16,14 @@ Update Password Delete Password - + Load Password - - Save Password - - View Password + View Password + Id: Domain: Username: Password: @@ -42,6 +40,7 @@ Warning: please fill the form first!! Failed: please try again!! Success: - Deleted Successfully + Updated Successfully!! + Deleted Successfully!! Something Went Wrong!! \ No newline at end of file diff --git a/installondevice.bat b/installondevice.bat index a9f54d97..418147d0 100644 --- a/installondevice.bat +++ b/installondevice.bat @@ -1,20 +1,20 @@ -@rem Build & install on Android phone +@REM Build & install on Android phone -REM Force continuation after Gradle command by capturing the output +@REM Force continuation after Gradle command by capturing the output call gradle build if ERRORLEVEL 1 ( echo Gradle build failed! Check build_output.txt for details. exit /b 1 ) -REM Start ADB server +@REM Start ADB server adb start-server if ERRORLEVEL 1 ( echo Failed to start ADB server! Exiting... exit /b 1 ) -REM Check if a device is connected +@REM Check if a device is connected adb devices if ERRORLEVEL 1 ( echo No device found! Make sure your device is connected and USB debugging is enabled. @@ -22,7 +22,7 @@ if ERRORLEVEL 1 ( exit /b 1 ) -REM Install the APK on the connected device +@REM Install the APK on the connected device adb install ./app/build/outputs/apk/release/app-universal-release.apk if ERRORLEVEL 1 ( echo APK installation failed! Exiting... @@ -30,7 +30,7 @@ if ERRORLEVEL 1 ( exit /b 1 ) -REM Kill ADB server after installation +@REM Kill ADB server after installation adb kill-server if ERRORLEVEL 1 ( echo Failed to stop ADB server! Exiting... diff --git a/settings.gradle b/settings.gradle index 8ce983c4..cfdf065f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,7 +3,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() - jcenter() // Warning: this repository is going to shut down soon + // jcenter() } } rootProject.name = "Password Manager" From 6a31a7d5e343b47bc1f298e5274582d85455d525 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 18:45:45 +0530 Subject: [PATCH 25/27] fix: the datetime('now') inserted as string --- .../com/passwordmanager/utils/Controller.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java index 03bc983b..a5245d0b 100644 --- a/app/src/main/java/com/passwordmanager/utils/Controller.java +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -127,9 +127,20 @@ public int updatePassword(int id, String domain, String username, String passwor values.put("username", username); values.put("password", password); values.put("notes", notes); - values.put("updatedat", "datetime('now')"); // Update the updatedAt column - int rowsAffected = db.update(MyDatabaseHelper.PASSWORDS_TABLE, values, "id = ?", new String[]{String.valueOf(id)}); + int rowsAffected; + + try { + rowsAffected = db.update(MyDatabaseHelper.PASSWORDS_TABLE, values, "id = ?", new String[]{String.valueOf(id)}); + + if (rowsAffected > 0) { + String updateQuery = "UPDATE " + MyDatabaseHelper.PASSWORDS_TABLE + " SET updatedat = datetime('now') WHERE id = ?"; + db.execSQL(updateQuery, new Object[]{id}); + } + } catch (Exception e) { + db.close(); + return -1; // Error in SQL + } db.close(); return rowsAffected == 0 ? -1 : rowsAffected; From c24dab6f7f5990bb5cf30b656fb73d03a5898299 Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 20:13:54 +0530 Subject: [PATCH 26/27] feat: create password list in load password activity --- .../ui/LoadPasswordActivity.java | 56 +++++++++----- .../ui/adapter/PasswordAdapter.java | 57 ++++++++++++++ .../com/passwordmanager/utils/Controller.java | 28 +++++++ .../res/layout/activity_load_password.xml | 75 ++++--------------- .../main/res/layout/password_list_item.xml | 20 +++++ 5 files changed, 156 insertions(+), 80 deletions(-) create mode 100644 app/src/main/java/com/passwordmanager/ui/adapter/PasswordAdapter.java create mode 100644 app/src/main/res/layout/password_list_item.xml diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 6b1bb9dc..26f9ab86 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -10,40 +10,60 @@ import com.passwordmanager.utils.Controller; import com.passwordmanager.models.PasswordModel; import com.passwordmanager.databinding.ActivityLoadPasswordBinding; +import com.passwordmanager.ui.adapter.PasswordAdapter; + +import java.util.List; public class LoadPasswordActivity extends AppCompatActivity { - + private ActivityLoadPasswordBinding binding; + private PasswordAdapter passwordAdapter; + private Controller controller; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityLoadPasswordBinding binding = ActivityLoadPasswordBinding.inflate(getLayoutInflater()); + binding = ActivityLoadPasswordBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); + + controller = new Controller(LoadPasswordActivity.this); + + List passwordList = controller.getAllPasswords(); + passwordAdapter = new PasswordAdapter(this, passwordList); + binding.passwordList.setAdapter(passwordAdapter); // Add event onclick listener - addOnClickListenerOnButton(binding); + addOnClickListenerOnButton(); // Make window fullscreen WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } // Added all the onclick event listiners - private void addOnClickListenerOnButton(ActivityLoadPasswordBinding binding) { - binding.loadPasswordBtn.setOnClickListener(v -> { - String domain = binding.inputDomain.getText().toString(); - String username = binding.inputUsername.getText().toString(); + private void addOnClickListenerOnButton() { + // binding.loadPasswordBtn.setOnClickListener(v -> { + // String domain = binding.inputDomain.getText().toString(); + // String username = binding.inputUsername.getText().toString(); - Controller controller = new Controller(LoadPasswordActivity.this); + // controller = new Controller(LoadPasswordActivity.this); + // PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); - PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); - - if (passwordmodel == null) { - Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); - } else { - Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); - Intent viewpasswordintent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); - viewpasswordintent.putExtra("id", passwordmodel.getId()); - startActivity(viewpasswordintent); - } + // if (passwordmodel == null) { + // Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); + // } else { + // Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); + // Intent viewpasswordintent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); + // viewpasswordintent.putExtra("id", passwordmodel.getId()); + // startActivity(viewpasswordintent); + // } + // }); + + binding.passwordList.setOnItemClickListener((parent, view, position, id) -> { + PasswordModel selectedPassword = (PasswordModel) passwordAdapter.getItem(position); + + // Do something with the selectedPassword + Intent intent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); + intent.putExtra("id", selectedPassword.getId()); + startActivity(intent); }); } } diff --git a/app/src/main/java/com/passwordmanager/ui/adapter/PasswordAdapter.java b/app/src/main/java/com/passwordmanager/ui/adapter/PasswordAdapter.java new file mode 100644 index 00000000..16f9bcdc --- /dev/null +++ b/app/src/main/java/com/passwordmanager/ui/adapter/PasswordAdapter.java @@ -0,0 +1,57 @@ +package com.passwordmanager.ui.adapter; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.view.LayoutInflater; +import android.widget.BaseAdapter; + +import com.passwordmanager.models.PasswordModel; +import com.passwordmanager.databinding.PasswordListItemBinding; + +import java.util.List; + +public class PasswordAdapter extends BaseAdapter { + + private Context context; + private List passwordList; + + public PasswordAdapter(Context context, List passwordList) { + this.context = context; + this.passwordList = passwordList; + } + + @Override + public int getCount() { + return passwordList.size(); + } + + @Override + public Object getItem(int position) { + return passwordList.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + PasswordListItemBinding binding; + + if (convertView == null) { + binding = PasswordListItemBinding.inflate(LayoutInflater.from(context), parent, false); + convertView = binding.getRoot(); + convertView.setTag(binding); + } else { + binding = (PasswordListItemBinding) convertView.getTag(); + } + + PasswordModel password = passwordList.get(position); + binding.tvDomain.setText(password.getDomain()); + binding.tvUsername.setText(password.getUsername()); + + return convertView; + } +} diff --git a/app/src/main/java/com/passwordmanager/utils/Controller.java b/app/src/main/java/com/passwordmanager/utils/Controller.java index a5245d0b..255be291 100644 --- a/app/src/main/java/com/passwordmanager/utils/Controller.java +++ b/app/src/main/java/com/passwordmanager/utils/Controller.java @@ -5,6 +5,9 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; +import java.util.List; +import java.util.ArrayList; + import com.passwordmanager.database.MyDatabaseHelper; import com.passwordmanager.models.PasswordModel; @@ -109,7 +112,32 @@ public PasswordModel getPasswordByUsernameAndDomain(String username, String doma db.close(); return passwordModel; } + + public List getAllPasswords() { + List passwordList = new ArrayList(); + SQLiteDatabase db = dbHelper.getReadableDatabase(); + Cursor cursor = db.query(MyDatabaseHelper.PASSWORDS_TABLE, null, null, null, null, null, null); + + if (cursor.moveToFirst()) { + do { + int id = cursor.getInt(cursor.getColumnIndexOrThrow("id")); + String domain = cursor.getString(cursor.getColumnIndexOrThrow("domain")); + String username = cursor.getString(cursor.getColumnIndexOrThrow("username")); + String password = cursor.getString(cursor.getColumnIndexOrThrow("password")); + String notes = cursor.getString(cursor.getColumnIndexOrThrow("notes")); + String createdAt = cursor.getString(cursor.getColumnIndexOrThrow("createdat")); + String updatedAt = cursor.getString(cursor.getColumnIndexOrThrow("updatedat")); + + PasswordModel passwordItem = new PasswordModel(id, domain, username, password, notes, createdAt, updatedAt); + passwordList.add(passwordItem); + } while (cursor.moveToNext()); + } + cursor.close(); + db.close(); + + return passwordList; + } public int updatePassword(int id, String domain, String username, String password, String notes) { // Return -2 on empty parameter. diff --git a/app/src/main/res/layout/activity_load_password.xml b/app/src/main/res/layout/activity_load_password.xml index c5c55648..e86a016c 100644 --- a/app/src/main/res/layout/activity_load_password.xml +++ b/app/src/main/res/layout/activity_load_password.xml @@ -7,69 +7,20 @@ android:orientation="vertical" tools:context=".ui.LoadPasswordActivity" android:padding="4sp" > - - - - - - - - - - - - + android:paddingTop="45sp" + android:paddingBottom="12sp" + android:text="@string/textview_loadpassword_headline" + android:textAlignment="center" + android:textSize="32dp" /> + + - - - - - - - - - - - diff --git a/app/src/main/res/layout/password_list_item.xml b/app/src/main/res/layout/password_list_item.xml new file mode 100644 index 00000000..e36c7e35 --- /dev/null +++ b/app/src/main/res/layout/password_list_item.xml @@ -0,0 +1,20 @@ + + + + + + + + From 67212f721940c6ad90a401947c896e023ce0cbaa Mon Sep 17 00:00:00 2001 From: Jeel Dobariya Date: Mon, 12 Aug 2024 20:19:52 +0530 Subject: [PATCH 27/27] refactor: make code consistent --- .../ui/LoadPasswordActivity.java | 37 +++++++------------ .../ui/SavePasswordActivity.java | 4 +- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java index 26f9ab86..c7e72049 100644 --- a/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/LoadPasswordActivity.java @@ -25,12 +25,6 @@ protected void onCreate(Bundle savedInstanceState) { binding = ActivityLoadPasswordBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); - controller = new Controller(LoadPasswordActivity.this); - - List passwordList = controller.getAllPasswords(); - passwordAdapter = new PasswordAdapter(this, passwordList); - binding.passwordList.setAdapter(passwordAdapter); - // Add event onclick listener addOnClickListenerOnButton(); @@ -38,25 +32,16 @@ protected void onCreate(Bundle savedInstanceState) { WindowCompat.setDecorFitsSystemWindows(getWindow(), false); } + private void fillPasswordList() { + controller = new Controller(LoadPasswordActivity.this); + + List passwordList = controller.getAllPasswords(); + passwordAdapter = new PasswordAdapter(this, passwordList); + binding.passwordList.setAdapter(passwordAdapter); + } + // Added all the onclick event listiners private void addOnClickListenerOnButton() { - // binding.loadPasswordBtn.setOnClickListener(v -> { - // String domain = binding.inputDomain.getText().toString(); - // String username = binding.inputUsername.getText().toString(); - - // controller = new Controller(LoadPasswordActivity.this); - // PasswordModel passwordmodel = controller.getPasswordByUsernameAndDomain(username, domain); - - // if (passwordmodel == null) { - // Toast.makeText(LoadPasswordActivity.this, getString(R.string.not_found_error_message), Toast.LENGTH_SHORT).show(); - // } else { - // Toast.makeText(LoadPasswordActivity.this, passwordmodel.toString(), Toast.LENGTH_LONG).show(); - // Intent viewpasswordintent = new Intent(LoadPasswordActivity.this, ViewPasswordActivity.class); - // viewpasswordintent.putExtra("id", passwordmodel.getId()); - // startActivity(viewpasswordintent); - // } - // }); - binding.passwordList.setOnItemClickListener((parent, view, position, id) -> { PasswordModel selectedPassword = (PasswordModel) passwordAdapter.getItem(position); @@ -66,4 +51,10 @@ private void addOnClickListenerOnButton() { startActivity(intent); }); } + + @Override + protected void onResume() { + super.onResume(); + fillPasswordList(); + } } diff --git a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java index 39d40f47..5a0283c3 100644 --- a/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java +++ b/app/src/main/java/com/passwordmanager/ui/SavePasswordActivity.java @@ -10,6 +10,7 @@ import com.passwordmanager.databinding.ActivitySavePasswordBinding; public class SavePasswordActivity extends AppCompatActivity { + private Controller controller; @Override protected void onCreate(Bundle savedInstanceState) { @@ -32,8 +33,7 @@ private void addOnClickListenerOnButton(ActivitySavePasswordBinding binding) { String password = binding.inputPassword.getText().toString(); String notes = binding.inputNotes.getText().toString(); - Controller controller = new Controller(SavePasswordActivity.this); - + controller = new Controller(SavePasswordActivity.this); int res = controller.savePasswordEntity(domain, username, password, notes); if (res == -2) {