diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 238116ee..0d9dacbb 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -1,32 +1,38 @@ --- name: Bug Report about: Create a report to help us improve -title: 'Bug Report: [Give a title for bug]' +title: "Bug Report: [Give a title for bug]" labels: bug assignees: JeelDobariya38 - --- ## Describe the bug: + A clear and concise description of what the bug is. ## To Reproduce: + Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error ## Expected behavior: + A clear and concise description of what you expected to happen. ## Screenshots: + If applicable, add screenshots to help explain your problem. ## Smartphone (please complete the following information): - - Device: [e.g. Google Pixel 9] - - Android Version: [e.g. 14] - - App Version: [e.g. v0.1.0] + +- Device: [e.g. Google Pixel 9] +- Android Version: [e.g. 14] +- App Version: [e.g. v0.1.0] ## Additional Context: + Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md index 09e3532f..96aaa35d 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -1,10 +1,9 @@ --- name: Feature Request about: Suggest an idea for this project -title: 'Feature Request: [Your feature name]' -labels: '' +title: "Feature Request: [Your feature name]" +labels: "" assignees: JeelDobariya38 - --- **Is your feature request related to a problem? Please describe.** diff --git a/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md b/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md index 4ff90661..5186aa09 100644 --- a/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md +++ b/.github/ISSUE_TEMPLATE/feedback---question---help-wanted.md @@ -3,23 +3,26 @@ name: FeedBack / Question / Help Wanted about: Describe your question, thought or feedback regarding passcodes project title: General Concerns labels: question -assignees: '' - +assignees: "" --- > ![Note] > For faster, more casual, chat like conversation join our telegram community.. ## Overview + describe in short paragraph, what you are write or what question or concern you have.. ## Required Information + - **Are your concerns related to?** Security / Customization / Something Else - **What is app version you use?** ............ - **What is the device and what version of android you use?** ......... ## Thoughts + describe your thought and feedback related to app. if you have question then delete this section and fill the question section... ## Question + describe your question or your concern if any... diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5c0e1cbb..d92b6be3 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -43,8 +43,8 @@ jobs: fail-fast: false matrix: include: - - language: java-kotlin - build-mode: autobuild # This mode only analyzes Java. Set this to 'autobuild' or 'manual' to analyze Kotlin too. + - language: java-kotlin + build-mode: autobuild # This mode only analyzes Java. Set this to 'autobuild' or 'manual' to analyze Kotlin too. # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both @@ -54,39 +54,39 @@ jobs: # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹ️ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - if: matrix.build-mode == 'manual' - shell: bash - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹ️ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: "/language:${{matrix.language}}" + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8a578672..1215a568 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing Guidelines -*Pull requests, bug reports, and all other forms of contribution are welcomed and highly encouraged!* :octocat: +_Pull requests, bug reports, and all other forms of contribution are welcomed and highly encouraged!_ :octocat: ### Contents @@ -22,7 +22,7 @@ See our [Community](https://t.me/passwordmanagercommunity) on telegram we appric ## :inbox_tray: Opening an Issue -Before [creating an issue](https://github.com/JeelDobariya38/password-manager/issues/new), check if you are using the latest version of the project. If you are not up-to-date, see if updating fixes your issue first. +Before [creating an issue](https://github.com/JeelDobariya38/Passcodes/issues/new), check if you are using the latest version of the project. If you are not up-to-date, see if updating fixes your issue first. ### :lock: Reporting Security Issues @@ -36,7 +36,7 @@ In short, since you are most likely a developer, **provide a ticket that you wou - **Review the Documentation and Support Guide** before opening a new issue. -- **Do not open a duplicate issue!** Search through existing issues to see if your issue has previously been reported. If your issue exists, comment with any additional information you have. You may simply note "I have this problem too", which helps prioritize the most common problems and requests. +- **Do not open a duplicate issue!** Search through existing issues to see if your issue has previously been reported. If your issue exists, comment with any additional information you have. You may simply note "I have this problem too", which helps prioritize the most common problems and requests. - **Prefer using [reactions](https://github.blog/2016-03-10-add-reactions-to-pull-requests-issues-and-comments/)**, not comments, if you simply want to "+1" an existing issue. @@ -60,9 +60,9 @@ We **love** pull requests! Before [forking the repo](https://help.github.com/en/ For most contributions, after your first pull request is accepted and merged, you will be [invited to the project](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) and given **push access**. :tada: -*Note: All contributions will be licensed under the project's license.* +_Note: All contributions will be licensed under the project's license._ -- **Smaller is better.** Submit **one** pull request per bug fix or feature. A pull request should contain isolated changes pertaining to a single bug fix or feature implementation. **Do not** refactor or reformat code that is unrelated to your change. It is better to **submit many small pull requests** rather than a single large one. Enormous pull requests will take enormous amounts of time to review, or may be rejected altogether. +- **Smaller is better.** Submit **one** pull request per bug fix or feature. A pull request should contain isolated changes pertaining to a single bug fix or feature implementation. **Do not** refactor or reformat code that is unrelated to your change. It is better to **submit many small pull requests** rather than a single large one. Enormous pull requests will take enormous amounts of time to review, or may be rejected altogether. - **Coordinate bigger changes.** For large and non-trivial changes, open an issue to discuss a strategy with the maintainers. Otherwise, you risk doing a lot of work for nothing! @@ -80,7 +80,7 @@ For most contributions, after your first pull request is accepted and merged, yo - **[Resolve any merge conflicts](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/resolving-a-merge-conflict-on-github)** that occur. -- **Promptly address any CI failures**. If your pull request fails to build or pass tests, please push another commit to fix it. +- **Promptly address any CI failures**. If your pull request fails to build or pass tests, please push another commit to fix it. - When writing comments, use properly constructed sentences, including punctuation. @@ -98,32 +98,33 @@ Please [write a great commit message](https://gist.github.com/joshbuchea/6f47e86 - **Always do your best.** No one writes bugs on purpose. Do your best, and learn from your mistakes. -- Kindly note any violations to the guidelines specified in this document. +- Kindly note any violations to the guidelines specified in this document. ## :medal_sports: Certificate of Origin -*Developer's Certificate of Origin 1.1* +_Developer's Certificate of Origin 1.1_ By making a contribution to this project, I certify that: + > I understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information I submit with it, including my sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open source license(s) involved. ## [No Brown M&M's](https://en.wikipedia.org/wiki/Van_Halen#Contract_riders) -If you are reading this, bravo dear user and (hopefully) contributor for making it this far! You are awesome. :100: +If you are reading this, bravo dear user and (hopefully) contributor for making it this far! You are awesome. :100: To confirm that you have read this guide and are following it as best as possible, **include this emoji at the top** of your issue or pull request: :black_heart: `:black_heart:` ## :pray: Credits -Written by [@jessesquires](https://github.com/jessesquires). +Written by [@jessesquires](https://github.com/jessesquires). **Please feel free to adopt this guide in your own projects. Fork it wholesale or remix it for your needs.** -*Many of the ideas and prose for the statements in this document were based on or inspired by work from the following communities:* +_Many of the ideas and prose for the statements in this document were based on or inspired by work from the following communities:_ - [Alamofire](https://github.com/Alamofire/Alamofire/blob/master/CONTRIBUTING.md) - [CocoaPods](https://github.com/CocoaPods/CocoaPods/blob/master/CONTRIBUTING.md) - [Docker](https://github.com/moby/moby/blob/master/CONTRIBUTING.md) - [Linux](https://elinux.org/Developer_Certificate_Of_Origin) -*We commend them for their efforts to facilitate collaboration in their projects.* +_We commend them for their efforts to facilitate collaboration in their projects._ diff --git a/README.md b/README.md index ee86f1d8..5555b45b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Password Manager +# Passcodes A android app that take down the headace of remember passwords. It is open source solutions that help you in keep your passwords safe and secure in your own local storage without ever need to push them to cloud. @@ -17,26 +17,29 @@ Android 14 [API level 34] (we support offically) Note: high version can still run but are not guaranteed offically. ``` +> What we think of passcodes? +> Password management is one such thing that is as simple as remember a password yet, it very important topic in term of security. So, we as developer of passcode think to streamline and securing the process as much as possible. [Read more](docs/project-overview.md) + ## Features -- [X] Intuitive UI. +- [x] Intuitive UI. - [ ] Update Checkers & Manager. -- [X] Password Management. (Current Priority) +- [x] Password Management. (Current Priority) - [ ] Secure File. (Least Priority, Because it include permission. Which, I am as developer not familar with 😂) - - Could be Image. (JPG. PNG ....) - - Could be Vidoe. - - Could any Binary File. (more like won't be a text file) + - Could be Image. (JPG. PNG ....) + - Could be Vidoe. + - Could any Binary File. (more like won't be a text file) - [ ] Other Secret Info Management. - - Could be note. (txt file) - - Could be any info that can encode as key & value. - ```json - { - "key": "SECRET API KEY", - "content": "qwerty-let-say" - "createdat": "...", - "updatedat": "..." - } - ``` + - Could be note. (txt file) + - Could be any info that can encode as key & value. + ```json + { + "key": "SECRET API KEY", + "content": "qwerty-let-say" + "createdat": "...", + "updatedat": "..." + } + ``` - [ ] NON Secret Info Store - [ ] Encryption and Decryption. - [ ] Backup Manager. @@ -49,7 +52,7 @@ Note: high version can still run but are not guaranteed offically. ## Installation Steps -1. Go to our [github repository release page](https://github.com/JeelDobariya38/password-manager/releases/latest). +1. Go to our [github repository release page](https://github.com/JeelDobariya38/Passcodes/releases/latest). 2. Download the apk for your phone. If Don't know the architecture of phone then download apk file that has universal in its name. @@ -65,7 +68,7 @@ It was most shortest and sweetest description (I have ever crafted), For more de 3. Follow the general step and build the app. -4. For code documention and support docs, check the `docs/` folder in our repository. +4. For code documention and support docs, check the `docs/` folder in our repository. It was general, intuitive, short and sweet description, For more detailed description, Vist the file [docs/building.md](docs/building.md). diff --git a/SECURITY.md b/SECURITY.md index e55012fc..83d1c6a0 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,5 +3,6 @@ ## Reporting a Vulnerability Report a vulnerability on a maintainer email. don't create a github issue or report publicly. + - `dobariyaj34@gmail.com` - `achmad24daniel@gmail.com` diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fc631e7e..197002ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,7 +23,8 @@ android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/PasscodesTheme"> + android:theme="@style/PasscodesTheme.Default" + android:localeConfig="@xml/locales_config"> @@ -38,7 +39,17 @@ + + + + + diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt index 26b56dc1..6a3c7aa9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/AboutUsActivity.kt @@ -1,10 +1,13 @@ package com.jeeldobariya.passcodes.ui; +import android.content.Context import android.content.Intent; import android.net.Uri; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.WindowCompat; + +import com.jeeldobariya.passcodes.R import com.jeeldobariya.passcodes.databinding.ActivityAboutUsBinding; import com.jeeldobariya.passcodes.utils.Constant; @@ -13,6 +16,10 @@ public class AboutUsActivity : AppCompatActivity() { private lateinit var binding: ActivityAboutUsBinding override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState); binding = ActivityAboutUsBinding.inflate(layoutInflater); setContentView(binding.root); diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt index a1d1d3f8..f4c4527c 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/LoadPasswordActivity.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast @@ -24,6 +25,10 @@ class LoadPasswordActivity : AppCompatActivity() { private lateinit var controller: Controller override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivityLoadPasswordBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt index 3e2b38a3..e6d2702e 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/MainActivity.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.os.Bundle import android.content.Intent import androidx.appcompat.app.AppCompatActivity @@ -17,6 +18,10 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) @@ -58,6 +63,11 @@ class MainActivity : AppCompatActivity() { startActivity(passwordManagerIntent) } + binding.settingBtn.setOnClickListener { + val settingIntent = Intent(this, SettingsActivity::class.java) + startActivity(settingIntent) + } + binding.aboutUsBtn.setOnClickListener { val aboutUsIntent = Intent(this, AboutUsActivity::class.java) startActivity(aboutUsIntent) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt index 8c94c48d..1374c2d6 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/PasswordManagerActivity.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.app.Activity import android.content.Intent import android.os.Bundle @@ -15,6 +16,10 @@ class PasswordManagerActivity : AppCompatActivity() { private lateinit var binding: ActivityPasswordManagerBinding // Use lateinit for binding override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivityPasswordManagerBinding.inflate(layoutInflater) setContentView(binding.root) diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt index 109a42d0..7404bdf0 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SavePasswordActivity.kt @@ -1,5 +1,6 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity @@ -20,6 +21,10 @@ class SavePasswordActivity : AppCompatActivity() { private lateinit var binding: ActivitySavePasswordBinding override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivitySavePasswordBinding.inflate(layoutInflater) setContentView(binding.root) @@ -35,35 +40,63 @@ class SavePasswordActivity : AppCompatActivity() { // Added all the onclick event listeners private fun addOnClickListenerOnButton() { + binding.inputDomain.setOnFocusChangeListener { v, hasFocus -> + if (hasFocus) { + binding.inputDomain.setHint(getString(R.string.placeholder_domain_field)); + } else { + binding.inputDomain.setHint(""); + } + }; + + binding.inputUsername.setOnFocusChangeListener { v, hasFocus -> + if (hasFocus) { + binding.inputUsername.setHint(getString(R.string.placeholder_username_field)); + } else { + binding.inputUsername.setHint(""); + } + }; + + binding.inputPassword.setOnFocusChangeListener { v, hasFocus -> + if (hasFocus) { + binding.inputPassword.setHint(getString(R.string.placeholder_password_field)); + } else { + binding.inputPassword.setHint(""); + } + }; + binding.savePasswordBtn.setOnClickListener { val domain = binding.inputDomain.text.toString() val username = binding.inputUsername.text.toString() val password = binding.inputPassword.text.toString() val notes = binding.inputNotes.text.toString() - // Launch a coroutine to call the suspend function - lifecycleScope.launch { - try { - val rowId = controller.savePasswordEntity(domain, username, password, notes) - // Switch back to Main dispatcher for UI updates - withContext(Dispatchers.Main) { - Toast.makeText(this@SavePasswordActivity, "${getString(R.string.sucess_clause)} $rowId", Toast.LENGTH_SHORT).show() - finish() - } - } catch (e: InvalidInputException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@SavePasswordActivity, getString(R.string.warn_fill_form), Toast.LENGTH_SHORT).show() - } - } catch (e: DatabaseOperationException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@SavePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() - } - } catch (e: Exception) { - withContext(Dispatchers.Main) { - Toast.makeText(this@SavePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() - } + performSavePasswordAction(domain, username, password, notes) + } + } + + fun performSavePasswordAction(domain: String, username: String, password: String, notes: String) { + // Launch a coroutine to call the suspend function + lifecycleScope.launch { + try { + val rowId = controller.savePasswordEntity(domain, username, password, notes) + // Switch back to Main dispatcher for UI updates + withContext(Dispatchers.Main) { + Toast.makeText(this@SavePasswordActivity, "${getString(R.string.success_clause)} $rowId", Toast.LENGTH_SHORT).show() + finish() + } + } catch (e: InvalidInputException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@SavePasswordActivity, getString(R.string.warn_fill_form), Toast.LENGTH_SHORT).show() + } + } catch (e: DatabaseOperationException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@SavePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText(this@SavePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt new file mode 100644 index 00000000..ffbddbd5 --- /dev/null +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/SettingsActivity.kt @@ -0,0 +1,98 @@ +package com.jeeldobariya.passcodes.ui + +import android.content.Context +import android.os.Bundle +import android.widget.Toast +import android.widget.AdapterView +import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.app.AppCompatDelegate +import androidx.core.os.LocaleListCompat +import android.view.View +import androidx.core.view.WindowCompat +import android.view.LayoutInflater + +import com.jeeldobariya.passcodes.R +import com.jeeldobariya.passcodes.databinding.ActivitySettingsBinding + +class SettingsActivity : AppCompatActivity() { + + private lateinit var binding: ActivitySettingsBinding + + companion object { + const val THEME_PREFS_NAME = "theme_prefs" + const val THEME_KEY = "selected_theme" + } + + + // List of available themes to cycle through + private val THEMES = listOf( + R.style.PasscodesTheme_Default, + R.style.PasscodesTheme_Trusted, + R.style.PasscodesTheme_Pink, + R.style.PasscodesTheme_Cute + ) + + override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + + super.onCreate(savedInstanceState) + binding = ActivitySettingsBinding.inflate(layoutInflater) + setContentView(binding.root) + + setInitialLangSelection() + + // Add event onclick listener + addOnClickListenerOnButton() + + // Make window fullscreen + WindowCompat.setDecorFitsSystemWindows(window, false) + } + + private fun setInitialLangSelection() { + val currentAppLocales: String = AppCompatDelegate.getApplicationLocales().toLanguageTags() + + val languageTags = resources.getStringArray(R.array.lang_locale_tags) + for ((index, localeTag) in languageTags.withIndex()) { + if (currentAppLocales.contains(localeTag)) { + binding.langSwitchDropdown.setSelection(index) + return + } + } + + binding.langSwitchDropdown.setSelection(0) + Toast.makeText(this@SettingsActivity, getString(R.string.something_went_wrong_msg), Toast.LENGTH_SHORT).show() + } + + // Added all the onclick event listeners + private fun addOnClickListenerOnButton() { + binding.langSwitchDropdown.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + val languageTags = resources.getStringArray(R.array.lang_locale_tags) + val localeTag = languageTags[position] + val appLocale: LocaleListCompat = LocaleListCompat.forLanguageTags(localeTag) + AppCompatDelegate.setApplicationLocales(appLocale) + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + // Not needed in this case, as we've already set a default + } + } + + binding.toggleThemeBtn.setOnClickListener { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val currentThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + + val currentIndex = THEMES.indexOf(currentThemeStyle) + val nextIndex = (currentIndex + 1) % THEMES.size + val newThemeStyle = THEMES[nextIndex] + + // Save the new theme and restart the application to apply it + sharedPrefs.edit().putInt(THEME_KEY, newThemeStyle).apply() + recreate() + + Toast.makeText(this@SettingsActivity, getString(R.string.restart_app_require), Toast.LENGTH_SHORT).show() + } + } +} diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt index aff95953..2a1af6b5 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/UpdatePasswordActivity.kt @@ -1,8 +1,10 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast +import android.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope @@ -27,6 +29,10 @@ class UpdatePasswordActivity : AppCompatActivity() { private lateinit var binding: ActivityUpdatePasswordBinding override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivityUpdatePasswordBinding.inflate(layoutInflater) setContentView(binding.root) @@ -93,38 +99,53 @@ class UpdatePasswordActivity : AppCompatActivity() { val newPassword = binding.inputPassword.text.toString() val newNotes = binding.inputNotes.text.toString() - lifecycleScope.launch { - try { - val rowsAffected = controller.updatePassword(passwordEntityId, newDomain, newUsername, newPassword, newNotes) - withContext(Dispatchers.Main) { - if (rowsAffected > 0) { - Toast.makeText(this@UpdatePasswordActivity, getString(R.string.update_sucess_msg), Toast.LENGTH_SHORT).show() - finish() - } else { - Toast.makeText(this@UpdatePasswordActivity, getString(R.string.something_went_wrong_msg) + ": No changes applied or password not found.", Toast.LENGTH_SHORT).show() - finish() - } - } - } catch (e: InvalidInputException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@UpdatePasswordActivity, getString(R.string.warn_fill_form), Toast.LENGTH_SHORT).show() - } - } catch (e: PasswordNotFoundException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@UpdatePasswordActivity, e.message, Toast.LENGTH_LONG).show() - e.printStackTrace() + val confirmDialog = AlertDialog.Builder(this@UpdatePasswordActivity) + .setTitle(R.string.update_password_dialog_title) + .setMessage(R.string.irreversible_dialog_desc) + .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> + performUpdatePasswordAction(newDomain, newUsername, newPassword, newNotes); + } + .setNegativeButton(R.string.discard_dialog_button_text) { dialog, which -> + Toast.makeText(this, getString(R.string.action_discard), Toast.LENGTH_SHORT).show(); + } + .create(); + + confirmDialog.show(); + } + } + + fun performUpdatePasswordAction(newDomain: String, newUsername: String, newPassword: String, newNotes: String) { + lifecycleScope.launch { + try { + val rowsAffected = controller.updatePassword(passwordEntityId, newDomain, newUsername, newPassword, newNotes) + withContext(Dispatchers.Main) { + if (rowsAffected > 0) { + Toast.makeText(this@UpdatePasswordActivity, getString(R.string.update_success_msg), Toast.LENGTH_SHORT).show() + finish() + } else { + Toast.makeText(this@UpdatePasswordActivity, getString(R.string.something_went_wrong_msg) + ": No changes applied or password not found.", Toast.LENGTH_SHORT).show() finish() } - } catch (e: DatabaseOperationException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@UpdatePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() - } - } catch (e: Exception) { - withContext(Dispatchers.Main) { - Toast.makeText(this@UpdatePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() - } + } + } catch (e: InvalidInputException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@UpdatePasswordActivity, getString(R.string.warn_fill_form), Toast.LENGTH_SHORT).show() + } + } catch (e: PasswordNotFoundException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@UpdatePasswordActivity, e.message, Toast.LENGTH_LONG).show() + e.printStackTrace() + finish() + } + } catch (e: DatabaseOperationException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@UpdatePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText(this@UpdatePasswordActivity, "${getString(R.string.fail_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt index 2801cfaa..934c7053 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/ui/ViewPasswordActivity.kt @@ -1,8 +1,10 @@ package com.jeeldobariya.passcodes.ui +import android.content.Context import android.content.Intent import android.os.Bundle import android.widget.Toast +import android.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.lifecycle.lifecycleScope @@ -26,6 +28,10 @@ class ViewPasswordActivity : AppCompatActivity() { private lateinit var controller: Controller override fun onCreate(savedInstanceState: Bundle?) { + val sharedPrefs = getSharedPreferences(SettingsActivity.THEME_PREFS_NAME, Context.MODE_PRIVATE) + val savedThemeStyle = sharedPrefs.getInt(SettingsActivity.THEME_KEY, R.style.PasscodesTheme_Default) + setTheme(savedThemeStyle) + super.onCreate(savedInstanceState) binding = ActivityViewPasswordBinding.inflate(layoutInflater) setContentView(binding.root) @@ -91,29 +97,44 @@ class ViewPasswordActivity : AppCompatActivity() { } binding.deletePasswordBtn.setOnClickListener { - lifecycleScope.launch { - try { - val rowsDeleted = controller.deletePassword(passwordEntityId) - withContext(Dispatchers.Main) { - if (rowsDeleted > 0) { - Toast.makeText(this@ViewPasswordActivity, getString(R.string.delete_sucess_msg), Toast.LENGTH_SHORT).show() - finish() - } else { - Toast.makeText(this@ViewPasswordActivity, getString(R.string.something_went_wrong_msg) + ": Password not found for deletion or no rows affected.", Toast.LENGTH_SHORT).show() - finish() - } - } - } catch (e: DatabaseOperationException) { - withContext(Dispatchers.Main) { - Toast.makeText(this@ViewPasswordActivity, "${getString(R.string.something_went_wrong_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() - } - } catch (e: Exception) { - withContext(Dispatchers.Main) { - Toast.makeText(this@ViewPasswordActivity, "${getString(R.string.something_went_wrong_msg)}: ${e.message}", Toast.LENGTH_LONG).show() - e.printStackTrace() + val confirmDialog = AlertDialog.Builder(this@ViewPasswordActivity) + .setTitle(R.string.delete_password_dialog_title) + .setMessage(R.string.irreversible_dialog_desc) + .setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which -> + performDeletePasswordAction(); + } + .setNegativeButton(R.string.discard_dialog_button_text) { dialog, which -> + Toast.makeText(this, getString(R.string.action_discard), Toast.LENGTH_SHORT).show(); + } + .create(); + + confirmDialog.show(); + } + } + + fun performDeletePasswordAction() { + lifecycleScope.launch { + try { + val rowsDeleted = controller.deletePassword(passwordEntityId) + withContext(Dispatchers.Main) { + if (rowsDeleted > 0) { + Toast.makeText(this@ViewPasswordActivity, getString(R.string.delete_success_msg), Toast.LENGTH_SHORT).show() + finish() + } else { + Toast.makeText(this@ViewPasswordActivity, getString(R.string.something_went_wrong_msg) + ": Password not found for deletion or no rows affected.", Toast.LENGTH_SHORT).show() + finish() } } + } catch (e: DatabaseOperationException) { + withContext(Dispatchers.Main) { + Toast.makeText(this@ViewPasswordActivity, "${getString(R.string.something_went_wrong_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() + } + } catch (e: Exception) { + withContext(Dispatchers.Main) { + Toast.makeText(this@ViewPasswordActivity, "${getString(R.string.something_went_wrong_msg)}: ${e.message}", Toast.LENGTH_LONG).show() + e.printStackTrace() + } } } } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt index aaf1010d..01e41ee7 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/Constants.kt @@ -1,8 +1,8 @@ package com.jeeldobariya.passcodes.utils object Constant { - const val REPO_URL = "https://github.com/JeelDobariya38/password-manager" - const val LICENSE_URL = "https://github.com/JeelDobariya38/password-manager/blob/main/LICENSE.txt" - const val CHANGELOG_URL = "https://github.com/JeelDobariya38/password-manager/blob/main/changelog.md" - const val SECURITY_GUIDE_URL = "https://github.com/JeelDobariya38/password-manager/blob/main/docs/security_guide.md" + const val REPO_URL = "https://github.com/JeelDobariya38/Passcodes" + const val LICENSE_URL = "https://github.com/JeelDobariya38/Passcodes/blob/main/LICENSE.txt" + const val CHANGELOG_URL = "https://github.com/JeelDobariya38/Passcodes/blob/main/changelog.md" + const val SECURITY_GUIDE_URL = "https://github.com/JeelDobariya38/Passcodes/blob/main/docs/security_guide.md" } diff --git a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/ExampleTestableCode.kt b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/ExampleTestableCode.kt index d7097f4d..91b65ad9 100644 --- a/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/ExampleTestableCode.kt +++ b/app/src/main/kotlin/com/jeeldobariya/passcodes/utils/ExampleTestableCode.kt @@ -2,7 +2,7 @@ package com.jeeldobariya.passcodes.utils class ExampleTestableCode { fun checkStrength(password: String): Int { - if (password == null || password.isEmpty()) { + if (password.isEmpty()) { return -1; } diff --git a/app/src/main/res/layout/activity_about_us.xml b/app/src/main/res/layout/activity_about_us.xml index ebd2678d..f502745d 100644 --- a/app/src/main/res/layout/activity_about_us.xml +++ b/app/src/main/res/layout/activity_about_us.xml @@ -71,6 +71,8 @@ + + - - - - - - + + + android:gravity="center" + android:orientation="vertical" + android:layout_margin="16sp"> - - - - + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_save_password.xml b/app/src/main/res/layout/activity_save_password.xml index fa1ceb26..68dc1977 100644 --- a/app/src/main/res/layout/activity_save_password.xml +++ b/app/src/main/res/layout/activity_save_password.xml @@ -1,5 +1,6 @@ + android:hint="@string/hint_domain" + app:helperTextEnabled="true" + app:helperText="@string/helper_text_domain_field"> + + android:hint="@string/hint_password" + app:endIconMode="password_toggle"> + android:minLines="2" + android:maxLines="5" /> diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 00000000..2018c7c2 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_view_password.xml b/app/src/main/res/layout/activity_view_password.xml index 21bed510..985e588f 100644 --- a/app/src/main/res/layout/activity_view_password.xml +++ b/app/src/main/res/layout/activity_view_password.xml @@ -1,5 +1,6 @@ - - \ No newline at end of file + diff --git a/app/src/main/res/resources.properties b/app/src/main/res/resources.properties new file mode 100644 index 00000000..467b3efe --- /dev/null +++ b/app/src/main/res/resources.properties @@ -0,0 +1 @@ +unqualifiedResLocale=en-US diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml new file mode 100644 index 00000000..c6336819 --- /dev/null +++ b/app/src/main/res/values-de/strings.xml @@ -0,0 +1,86 @@ + + + Passcodes + v0.1.0-Alpha + + + Entwickelt von: Jeel Dobariya + UI/UX Design von: Hamada Issas (Native) + Codepflege & Tests: Achmad Daniel (Kudanill) + + + Beenden + + + Ein Open-Source-Passwort-Manager, der dir hilft, Passwörter nicht mehr selbst merken zu müssen. + Diese App befindet sich noch in der Entwicklung und ist nur für Lern- und Testzwecke gedacht. Sie ist möglicherweise nicht sicher für sensible Daten. Bitte lies die Sicherheitshinweise. + + + Domain + Name der zugehörigen Webseite oder Domain + Benutzername + Passwort + Notizen + z. B. Google, Instagram, WhatsApp usw. + z. B. Liam15, Noha, Olivia, Ava_25 usw. + z. B. 12345, abc123xyz, qwerty usw. + Passwort-Manager + Speichern + Laden + Aktualisieren + Löschen + Importieren + Exportieren + Sicherheitsprüfung + Einstellungen + Design wechseln + Sprache: + Design: + Über uns + Lizenz anzeigen + Sicherheitsrichtlinien + Änderungsprotokoll + + + Passwort-Manager + Passwort laden + Passwort speichern + Passwort anzeigen + Passwort aktualisieren + Einstellungen + Über uns + + + ID: + Domain: + Benutzername: + Passwort: + Notizen: + Erstellt am: + Aktualisiert am: + + + Zugriff erlaubt + Zugriff verweigert + + + App muss neu gestartet werden. + Diese Funktion ist in Arbeit. + 404: Nicht gefunden + Bitte zuerst das Formular ausfüllen. + Fehler: Bitte versuche es erneut. + Erfolg: + Erfolgreich aktualisiert + Erfolgreich gelöscht + Etwas ist schiefgelaufen + Aktion abgebrochen + Fehler: Ungültige ID!! + + + Passwort aktualisieren? + Passwort löschen? + Dieser Vorgang kann nicht rückgängig gemacht werden. + Bestätigen + Abbrechen + + diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml new file mode 100644 index 00000000..fb178c2e --- /dev/null +++ b/app/src/main/res/values-es/strings.xml @@ -0,0 +1,84 @@ + + Passcodes + v0.1.0-Alpha + + + Desarrollado por: Dobariya Jeel + Diseño UI/UX por: Hamada Issas (Native) + Mantenimiento de código y pruebas: Achmad Daniel (Kudanill) + + + Salir + + + Un gestor de contraseñas de código abierto que te ayuda a no tener que recordar tus contraseñas. + Esta app está en desarrollo activo y es solo para fines educativos y experimentales. Puede que no sea segura para guardar información sensible. Consulta las directrices de seguridad para más detalles. + + + Dominio + Nombre del sitio web o dominio + Usuario + Contraseña + Notas + Ej: Google, Instagram, WhatsApp, etc. + Ej: Liam15, Noha, Olivia, Ava_25, etc. + Ej: 12345, abc123xyz, qwerty, etc. + Gestor de Contraseñas + Guardar Contraseña + Cargar Contraseña + Actualizar Contraseña + Eliminar Contraseña + Importar Contraseña + Exportar Contraseña + Revisar Seguridad + Ajustes + Cambiar Tema + Idioma: + Temas: + Sobre Nosotros + Ver Licencia + Ver Seguridad + Ver Cambios + + + Gestor de Contraseñas + Cargar Contraseña + Guardar Contraseña + Ver Contraseña + Actualizar Contraseña + Ajustes + Sobre Nosotros + + + ID: + Dominio: + Usuario: + Contraseña: + Notas: + Creado el: + Actualizado el: + + + Permiso concedido + Permiso denegado + + + Es necesario reiniciar la app. + Esta función está en desarrollo. + 404: No encontrado. + Aviso: Por favor, completa el formulario primero. + Falló: Intenta de nuevo. + Éxito: + Actualizado correctamente. + Eliminado correctamente. + Algo salió mal. + Acción descartada. + Algo salió mal: ¡ID inválido! + + + ¿Actualizar contraseña? + ¿Eliminar contraseña? + Esta acción no se puede deshacer. + Confirmar + Cancelar + diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml new file mode 100644 index 00000000..506ac27b --- /dev/null +++ b/app/src/main/res/values-hi/strings.xml @@ -0,0 +1,86 @@ + + + पासकोड्स + v0.1.0-Alpha + + + डेवलप किया गया: जीत डोबरिया + यूआई/यूएक्स डिजाइन: हामदा इस्सास (नेटिव) + कोड मेंटेनेंस और टेस्टिंग: अहमद डेनियल (कुडानिल) + + + बंद करें + + + ओपन-सोर्स पासवर्ड मैनेजर जो पासवर्ड याद रखने की झंझट को खत्म करता है। + यह ऐप अभी डेवलपमेंट में है और सिर्फ एजुकेशनल और एक्सपेरिमेंटल यूज़ के लिए है। जरूरी डेटा स्टोर करने के लिए यह सिक्योर नहीं हो सकता। कृपया सिक्योरिटी गाइडलाइंस देखें। + + + डोमेन + वेबसाइट या डोमेन का नाम + यूज़रनेम + पासवर्ड + नोट्स + जैसे Google, Instagram, WhatsApp वगैरह + जैसे Liam15, Noha, Olivia, Ava_25 वगैरह + जैसे 12345, abc123xyz, qwerty वगैरह + पासवर्ड मैनेजर + पासवर्ड सेव करें + पासवर्ड लोड करें + पासवर्ड अपडेट करें + पासवर्ड हटाएं + पासवर्ड इंपोर्ट करें + पासवर्ड एक्सपोर्ट करें + सिक्योरिटी चेक + सेटिंग्स + थीम बदलें + भाषा: + थीम: + हमारे बारे में + लाइसेंस देखें + सिक्योरिटी गाइडलाइंस + चेंजलॉग देखें + + + पासवर्ड मैनेजर + पासवर्ड लोड करें + पासवर्ड सेव करें + पासवर्ड देखें + पासवर्ड अपडेट करें + सेटिंग्स + हमारे बारे में + + + आईडी: + डोमेन: + यूज़रनेम: + पासवर्ड: + नोट्स: + बनाया गया: + अपडेट किया गया: + + + परमिशन मिल गई + परमिशन नहीं मिली + + + ऐप को फिर से शुरू करना जरूरी है। + यह फीचर अभी बन रहा है। + 404: नहीं मिला। + चेतावनी: पहले फॉर्म भरें। + फेल हुआ: फिर से कोशिश करें। + सफलता: + सफलतापूर्वक अपडेट हुआ। + सफलतापूर्वक हटाया गया। + कुछ गलत हो गया। + कार्रवाई रद्द की गई। + कुछ गलत हुआ: ID सही नहीं है!! + + + पासवर्ड अपडेट करें? + पासवर्ड हटाएं? + यह काम वापस नहीं लिया जा सकता। + पक्का करें + रद्द करें + + diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml new file mode 100644 index 00000000..5f0c204f --- /dev/null +++ b/app/src/main/res/values-in/strings.xml @@ -0,0 +1,86 @@ + + + Passcodes + v0.1.0-Alpha + + + Dikembangkan oleh: Jeel Dobariya + Desain UI/UX oleh: Hamada Issas (Native) + Pemeliharaan & Pengujian Kode: Achmad Daniel (Kudanill) + + + Keluar + + + Pengelola kata sandi open-source yang bantu kamu bebas dari repotnya mengingat password. + Aplikasi ini masih dalam tahap pengembangan aktif dan ditujukan untuk pembelajaran dan eksperimen. Mungkin belum aman untuk menyimpan informasi penting. Silakan baca panduan keamanan untuk info lebih lanjut. + + + Domain + Nama situs web atau domain yang digunakan + Nama pengguna + Kata sandi + Catatan + cth. Google, Instagram, WhatsApp, dll. + cth. Liam15, Noha, Olivia, Ava_25, dll. + cth. 12345, abc123xyz, qwerty, dll. + Pengelola Kata Sandi + Simpan Kata Sandi + Muat Kata Sandi + Perbarui Kata Sandi + Hapus Kata Sandi + Impor Kata Sandi + Ekspor Kata Sandi + Cek Keamanan + Pengaturan + Ganti Tema + Bahasa: + Tema: + Tentang Kami + Lihat Lisensi + Panduan Keamanan + Lihat Changelog + + + Pengelola Kata Sandi + Muat Kata Sandi + Simpan Kata Sandi + Lihat Kata Sandi + Perbarui Kata Sandi + Pengaturan + Tentang Kami + + + ID: + Domain: + Nama Pengguna: + Kata Sandi: + Catatan: + Dibuat: + Diperbarui: + + + Izin diberikan + Izin ditolak + + + Aplikasi perlu dimulai ulang. + Fitur ini sedang dikembangkan. + 404: Tidak ditemukan. + Peringatan: Harap isi formulir dulu. + Gagal: Coba lagi nanti. + Berhasil: + Berhasil diperbarui. + Berhasil dihapus. + Terjadi kesalahan. + Aksi dibatalkan. + Terjadi kesalahan: ID tidak valid!! + + + Perbarui kata sandi? + Hapus kata sandi? + Tindakan ini tidak dapat dibatalkan. + Konfirmasi + Batal + + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..1a852c6b --- /dev/null +++ b/app/src/main/res/values-ja/strings.xml @@ -0,0 +1,86 @@ + + + パスコード + v0.1.0-Alpha + + + 開発者:Jeel Dobariya + UI/UXデザイン:Hamada Issas(Native) + コード管理・テスト:Achmad Daniel(Kudanill) + + + 終了 + + + パスワードを覚える手間をなくす、オープンソースのパスワードマネージャーです。 + このアプリは開発中で、教育・実験目的のみでの使用を想定しています。機密情報の保存には安全でない可能性があります。セキュリティガイドラインをご確認ください。 + + + ドメイン + 関連するウェブサイトやドメインの名前 + ユーザー名 + パスワード + メモ + 例:Google、Instagram、WhatsApp など + 例:Liam15、Noha、Olivia、Ava_25 など + 例:12345、abc123xyz、qwerty など + パスワードマネージャー + 保存 + 読み込み + 更新 + 削除 + インポート + エクスポート + セキュリティチェック + 設定 + テーマ切替 + 言語: + テーマ: + アプリについて + ライセンスを見る + セキュリティガイドライン + 更新履歴 + + + パスワードマネージャー + パスワード読み込み + パスワード保存 + パスワードを見る + パスワード更新 + 設定 + アプリについて + + + ID: + ドメイン: + ユーザー名: + パスワード: + メモ: + 作成日: + 更新日: + + + 許可されました + 許可されませんでした + + + アプリを再起動する必要があります。 + この機能は現在開発中です。 + 404:見つかりませんでした + 警告:フォームを入力してください + 失敗しました:もう一度お試しください + 成功: + 更新に成功しました + 削除に成功しました + 問題が発生しました + 操作がキャンセルされました + エラー:無効なIDです!! + + + パスワードを更新しますか? + パスワードを削除しますか? + この操作は元に戻せません。 + 確認 + キャンセル + + diff --git a/app/src/main/res/values-ko/string.xml b/app/src/main/res/values-ko/string.xml new file mode 100644 index 00000000..af921d05 --- /dev/null +++ b/app/src/main/res/values-ko/string.xml @@ -0,0 +1,86 @@ + + + 패스코드 + v0.1.0-Alpha + + + 개발자: Jeel Dobariya + UI/UX 디자인: Hamada Issas (Native) + 코드 유지보수 및 테스트: Achmad Daniel (Kudanill) + + + 종료 + + + 비밀번호 기억하기 귀찮을 때 사용하는 오픈소스 비밀번호 관리자입니다. + 이 앱은 현재 개발 중이며 교육 및 실험용으로만 사용해야 합니다. 중요한 정보를 저장하기엔 아직 안전하지 않을 수 있습니다. 보안 가이드를 꼭 참고해주세요. + + + 도메인 + 사이트 또는 도메인 이름 + 사용자 이름 + 비밀번호 + 메모 + 예: Google, Instagram, WhatsApp 등 + 예: Liam15, Noha, Olivia, Ava_25 등 + 예: 12345, abc123xyz, qwerty 등 + 비밀번호 관리자 + 비밀번호 저장 + 비밀번호 불러오기 + 비밀번호 수정 + 비밀번호 삭제 + 비밀번호 가져오기 + 비밀번호 내보내기 + 보안 확인 + 설정 + 테마 전환 + 언어: + 테마: + 앱 정보 + 라이선스 보기 + 보안 지침 보기 + 변경 기록 + + + 비밀번호 관리자 + 비밀번호 불러오기 + 비밀번호 저장 + 비밀번호 보기 + 비밀번호 수정 + 설정 + 앱 정보 + + + ID: + 도메인: + 사용자 이름: + 비밀번호: + 메모: + 생성일: + 수정일: + + + 권한 허용됨 + 권한 거부됨 + + + 앱을 다시 시작해야 해요. + 이 기능은 아직 개발 중입니다. + 404: 찾을 수 없음 + 주의: 먼저 양식을 작성해주세요. + 실패: 다시 시도해주세요. + 성공: + 성공적으로 수정되었습니다. + 성공적으로 삭제되었습니다. + 문제가 발생했습니다. + 작업이 취소되었습니다. + 문제 발생: 잘못된 ID입니다!! + + + 비밀번호를 수정할까요? + 비밀번호를 삭제할까요? + 이 작업은 되돌릴 수 없습니다. + 확인 + 취소 + + diff --git a/app/src/main/res/values-kr/strings.xml b/app/src/main/res/values-kr/strings.xml new file mode 100644 index 00000000..ef756684 --- /dev/null +++ b/app/src/main/res/values-kr/strings.xml @@ -0,0 +1,84 @@ + + Passcodes + v0.1.0-Alpha + + + Jaejak: Dobariya Jeel + UI/UX Design: Hamada Issas (Native) + Code Maintenance & Test: Achmad Daniel (Kudanill) + + + Jeolryo + + + Gieokhagi himdeun byeol-ui bimilbeonho jeongnihae juseyo. I app-eun open-source-imnida! + I app-eun jigeum gaebal jung-imnida. hakseup mit silheom mokjeok-euro ssie juseyo. hwaldongjeog-in seculi anjeon-eun bojangdoeji anhassseubnida. + + + Domain + Website name ttoneun domain + I-yongja + Bimilbeonho + Bijul + 예: Google, Instagram, WhatsApp + 예: Liam15, Noha, Ava_25 + 예: 12345, abc123xyz + Bimilbeonho Gwanli + Jeojang + Buteowagi + Gengsin + Sakje + Import + Export + Anjeon Seolmyeong + Seoljeong + Tema Byeongyeong + Eon-eo: + Tema: + Ulineun Nuguinga + Laiseonse Bogi + Anjeon Jichim Bogi + Byeon-gye Nolog Bogi + + + Bimilbeonho Gwanli + Bimilbeonho Buteowagi + Bimilbeonho Jeojang + Bimilbeonho Bogi + Bimilbeonho Gengsin + Seoljeong + Ulineun Nuguinga + + + ID: + Domain: + I-yongja: + Bimilbeonho: + Bijul: + Sangseong ilja: + Gengsin ilja: + + + Heung-in doem + Geohwa doem + + + Aeb-eul dasi sijakhaeya haeyo. + I gineung-eun majimag junbi jung-imnida. + 404: Chal su eobs-eum + Gyeong-go: Munsuhyeong-eul da chaeujuseyo. + Silpae: Dasi sihae juseyo. + Seong-gong: + Seong-gongjeog-eulo gengsin! + Jeong sangjeongdoe-eossseubnida. + Mueonga jalmosdoeeossseubnida. + Haengdong jeohwa + Jalmosdoe-eossseubnida: ID Mubeon! + + + Gengsin haneun geos-eulo hal-kka? + Jeongmal sangjehal-kka? + I haengdong-eun dora gal su eobs-seubnida. + Hwagin + Jeohwa + diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 00000000..dddb87cb --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,156 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-vi/string.xml b/app/src/main/res/values-vi/string.xml new file mode 100644 index 00000000..e72ab62b --- /dev/null +++ b/app/src/main/res/values-vi/string.xml @@ -0,0 +1,86 @@ + + + Mã Bảo Mật + v0.1.0-Alpha + + + Phát triển bởi: Jeel Dobariya + Thiết kế UI/UX: Hamada Issas (Native) + Bảo trì & Kiểm thử mã: Achmad Daniel (Kudanill) + + + Thoát + + + Trình quản lý mật khẩu mã nguồn mở giúp bạn không cần nhớ mật khẩu nữa. + Ứng dụng này đang được phát triển và chỉ dùng cho mục đích học tập hoặc thử nghiệm. Có thể chưa đủ an toàn để lưu thông tin nhạy cảm. Vui lòng xem hướng dẫn bảo mật để biết thêm chi tiết. + + + Tên miền + Tên trang web hoặc tên miền liên quan + Tên người dùng + Mật khẩu + Ghi chú + vd: Google, Instagram, WhatsApp, v.v. + vd: Liam15, Noha, Olivia, Ava_25, v.v. + vd: 12345, abc123xyz, qwerty, v.v. + Quản lý Mật khẩu + Lưu mật khẩu + Tải mật khẩu + Cập nhật mật khẩu + Xóa mật khẩu + Nhập mật khẩu + Xuất mật khẩu + Kiểm tra bảo mật + Cài đặt + Chuyển giao diện + Ngôn ngữ: + Giao diện: + Giới thiệu + Xem giấy phép + Hướng dẫn bảo mật + Xem lịch sử thay đổi + + + Quản lý Mật khẩu + Tải Mật khẩu + Lưu Mật khẩu + Xem Mật khẩu + Cập nhật Mật khẩu + Cài đặt + Giới thiệu + + + ID: + Tên miền: + Tên người dùng: + Mật khẩu: + Ghi chú: + Tạo lúc: + Cập nhật lúc: + + + Đã cấp quyền + Từ chối quyền + + + Cần khởi động lại ứng dụng. + Tính năng đang được phát triển. + 404: Không tìm thấy + Vui lòng điền vào biểu mẫu trước. + Thất bại: Vui lòng thử lại. + Thành công: + Cập nhật thành công. + Xóa thành công. + Đã xảy ra lỗi. + Đã hủy hành động. + Lỗi: ID không hợp lệ!! + + + Cập nhật mật khẩu? + Xóa mật khẩu? + Hành động này không thể hoàn tác. + Xác nhận + Hủy + + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml new file mode 100644 index 00000000..fa1d75f7 --- /dev/null +++ b/app/src/main/res/values-zh/strings.xml @@ -0,0 +1,86 @@ + + + 密码本 + v0.1.0-Alpha + + + 开发者:Jeel Dobariya + UI/UX 设计:Hamada Issas(Native) + 代码维护与测试:Achmad Daniel(Kudanill) + + + 退出 + + + 一个开源的密码管理器,帮你省去记密码的烦恼。 + 该应用正在积极开发中,仅用于学习和实验目的。暂不建议用于存储敏感信息。请查看安全指南了解详情。 + + + 域名 + 对应的网站或域名 + 用户名 + 密码 + 备注 + 例如:Google、Instagram、WhatsApp 等 + 例如:Liam15、Noha、Olivia、Ava_25 等 + 例如:12345、abc123xyz、qwerty 等 + 密码管理器 + 保存密码 + 加载密码 + 更新密码 + 删除密码 + 导入密码 + 导出密码 + 安全检查 + 设置 + 切换主题 + 语言: + 主题: + 关于我们 + 查看许可证 + 查看安全指南 + 查看更新记录 + + + 密码管理器 + 加载密码 + 保存密码 + 查看密码 + 更新密码 + 设置 + 关于我们 + + + ID: + 域名: + 用户名: + 密码: + 备注: + 创建时间: + 更新时间: + + + 已授予权限 + 权限被拒绝 + + + 需要重新启动应用。 + 该功能正在开发中。 + 404:未找到 + 请先填写表单。 + 失败:请重试。 + 成功: + 更新成功。 + 删除成功。 + 发生错误。 + 操作已取消。 + 错误:无效的 ID!! + + + 要更新密码吗? + 要删除密码吗? + 此操作无法撤销。 + 确认 + 取消 + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 93824d8d..ea1e3c59 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,7 @@ + + #6750A4 #FFFFFF #EADDFF @@ -30,6 +32,8 @@ #6750A4 #CAC4D0 #000000 + + #D0BCFF #381E72 #4F378B @@ -61,4 +65,171 @@ #49454F #000000 + + #0061A4 + #FFFFFF + #D0E4FF + #001D36 + #535F70 + #FFFFFF + #D7E3F8 + #101C2B + #6B5778 + #FFFFFF + #F4DAFF + #251532 + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #FDFBFF + #1A1C1E + #FDFBFF + #1A1C1E + #DEE3EB + #42474E + #72777F + #2F3033 + #F1F0F4 + #9ECAFF + + + #9ECAFF + #003258 + #00497D + #D0E4FF + #BBC7DB + #253140 + #3C4858 + #D7E3F8 + #D7BDE4 + #3B2A48 + #53405F + #F4DAFF + #FFB4AB + #690005 + #93000A + #FFDAD6 + #1A1C1E + #E2E2E5 + #1A1C1E + #E2E2E5 + #42474E + #C2C7CE + #8C9199 + #E2E2E5 + #1A1C1E + #0061A4 + + + #9D405D + #FFFFFF + #FFD9E2 + #40001B + #755661 + #FFFFFF + #FFD9E4 + #2C151E + #7E525E + #FFFFFF + #FFD9E1 + #31111C + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #FFFBFF + #1F1B1C + #FFFBFF + #1F1B1C + #F2DEE3 + #514347 + #837378 + #343032 + #F9EFF1 + #FFB1C8 + + + #FFB1C8 + #611030 + #7E2847 + #FFD9E2 + #E4BDC7 + #432A33 + #5C3F49 + #FFD9E4 + #F1B8C5 + #4B2531 + #643B47 + #FFD9E1 + #FFB4AB + #690005 + #93000A + #FFDAD6 + #1F1B1C + #EAE0E1 + #1F1B1C + #EAE0E1 + #514347 + #D5C2C7 + #9D8D91 + #EAE0E1 + #1F1B1C + #9D405D + + + #BC396A + #FFFFFF + #FFD9E3 + #3F001F + #745660 + #FFFFFF + #FFD9E3 + #2B151D + #8D525C + #FFFFFF + #FFD9E1 + #38111B + #BA1A1A + #FFFFFF + #FFDAD6 + #410002 + #FFFBFF + #1E1B1C + #FFFBFF + #1E1B1C + #F2DEE3 + #514347 + #837378 + #333032 + #F8EFF1 + #FFB2C8 + + + #FFB2C8 + #700039 + #951A51 + #FFD9E3 + #E3BDC7 + #422932 + #5B3F48 + #FFD9E3 + #FFB2C4 + #52202E + #6D3845 + #FFD9E1 + #FFB4AB + #690005 + #93000A + #FFDAD6 + #1E1B1C + #EAE0E1 + #1E1B1C + #EAE0E1 + #514347 + #D5C2C7 + #9D8D91 + #EAE0E1 + #1E1B1C + #BC396A diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5fb6ff40..17c6e12b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,21 +5,25 @@ Developed by: Dobariya Jeel - UI/UX Designed by: Hamada Issas (Native) - Code Maintainer and Tester: Achmad Daniel (Kudanill) + UI/UX Design by: Hamada Issas (Native) + Code Maintenance & Testing: Achmad Daniel (Kudanill) Quit - An open source password managing solution that take down you headace of remembering password!! - App is currently under active development and it is made for fun and educational purpose and it might not be safe to save your auth info with it. For more info, view security guidelines!!! + An open-source password manager that helps eliminate the headache of remembering your passwords. + This app is currently under active development and is intended for educational and experimental purposes. It may not be secure for storing sensitive authentication information. Please review the security guidelines for more details. Domain + The name of the website or domain associated Username Password Notes + e.g. Google, Instagram, WhatsApp, etc. + e.g. Liam15, Noha, Olivia, Ava_25, etc. + e.g. 12345, abc123xyz, qwerty, etc. Password Manager Save Password Load Password @@ -28,41 +32,80 @@ Import Password Export Password Check Security + Settings + Toggle Theme + Language: + Themes: About Us View License View Security Guidelines View Changelog - Passcodes + Password Manager Load Password Save Password View Password Update Password + Settings About Us - Id: + ID: Domain: Username: Password: Notes: - CreatedAt: - UpdatedAt: + Created At: + Updated At: - Permission Granted - Permission Denied + Permission granted + Permission denied - Feature is under development!! - 404: Not Found!! - Warning: please fill the form first!! - Failed: please try again!! - Success: - Updated Successfully!! - Deleted Successfully!! + Restart App Require. + This feature is currently under development. + 404: Not found. + Warning: Please fill out the form first. + Failed: Please try again. + Success: + Updated successfully. + Deleted successfully. + Something went wrong. + Action discarded. Something Went Wrong: Invalid ID!! - Something Went Wrong!! - \ No newline at end of file + + Update password? + Delete password? + This action cannot be undone. + Confirm + Discard + + + English (en-us) + Hindi (hi) + Indonesian (in) + Korean (ko) + Korean Romanized (kr) + Japanese (ja) + German (de) + Spanish (es) + Chinese (zh) + Vietnamese (vi) + + + + en + hi + id + ko + kr + ja + de + es + zh + vi + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index c316e556..72b7825d 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,41 +1,155 @@ + - + + + + + + + + + diff --git a/app/src/main/res/xml/locales_config.xml b/app/src/main/res/xml/locales_config.xml new file mode 100644 index 00000000..6f5fa173 --- /dev/null +++ b/app/src/main/res/xml/locales_config.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/changelog.md b/changelog.md index 5699ead2..f51425d4 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## Added + +- **Localized App**: add language support for English, Chinese, Hindi, Indonesian, Japanese, Korean, German, Spanish, Vietnamese. Contributed by [@JeelDobariya]. +- **Improved UI/UX**: add confirmation dialogs, support for light & dark theme with additional minor changes. Contributed by [@JeelDobariya]. + ### Changed - **Mirgated Package Name**: Migrate package name from `com.passwordmanager` to `com.jeeldobariya.passcodes`. Contributed by [@JeelDobariya]. @@ -22,5 +27,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - **Main Page Development**: Developed the main page of the app, including basic UI components and initial layout. Contributed by [@HamadaNative]. ### Notes -- This is the initial alpha release, focused on setting up the basic structure and key visual elements of the app. +- This is the initial alpha release, focused on setting up the basic structure and key visual elements of the app. diff --git a/docs/building.md b/docs/building.md index d4c8c8f4..510afd10 100644 --- a/docs/building.md +++ b/docs/building.md @@ -27,7 +27,7 @@ cd passcodes Something like this... ```powershell -PS D:\####\####\passcodes> adb --version +PS D:\####\####\passcodes> adb --version Android Debug Bridge version 1.0.41 Version 35.0.2-12147458 Installed as D:\####\####\lib\platform-tools\adb.exe @@ -74,6 +74,7 @@ storePassword= you can build the app for production and dev version. - Development Builds + ```bat installondevice.bat ``` diff --git a/docs/database-design-guide.md b/docs/database-design-guide.md index 2886f0ca..a6b5c998 100644 --- a/docs/database-design-guide.md +++ b/docs/database-design-guide.md @@ -7,15 +7,13 @@ In this file, You will find the general structure & format in which app stores u > [!NOTE] > Database schema versioning system is completely separate from the app versioning system. - --- - ## Master Database (master.db) **Database**: Sqlite3(`master.db`) -It is a database where user info is stored. It schema changes often between the app versions, based on changes in feature requirements. Here, in this section you will find all the version of database schema & will also find info about how we adopated to the new schema. +It is a database where user info is stored. It schema changes often between the app versions, based on changes in feature requirements. Here, in this section you will find all the version of database schema & will also find info about how we adopated to the new schema. ### Current Database Design (v1) @@ -25,12 +23,12 @@ It is a database where user info is stored. It schema changes often between the #### passwords table -| Fields | Property | Constraints | Description | -| ------------ | ------------ | ------------------------------ | ------------------------------------------------------------------------------------------------------- | -| `id` | Integer | PRIMARY KEY, AUTOINCREMENT | -- | -| `domain` | Text | NOT NULL | domain/platform name to which password enitity is associated with. | -| `username` | Text | NOT NULL | username on that domain / platform. email can be even used as a value. | -| `password` | Text | NOT NULL | password for that specfic username on that specfic domain / platform. | -| `notes` | Text | NOT NULL | notes that you wanna take for that record. more like be some information about account on that platform | -| `created_at` | Text | DEFAULT CURRENT_TIMESTAMP | -- | -| `updated_at` | Text | DEFAULT CURRENT_TIMESTAMP | -- | +| Fields | Property | Constraints | Description | +| ------------ | -------- | -------------------------- | ------------------------------------------------------------------------------------------------------- | +| `id` | Integer | PRIMARY KEY, AUTOINCREMENT | -- | +| `domain` | Text | NOT NULL | domain/platform name to which password enitity is associated with. | +| `username` | Text | NOT NULL | username on that domain / platform. email can be even used as a value. | +| `password` | Text | NOT NULL | password for that specfic username on that specfic domain / platform. | +| `notes` | Text | NOT NULL | notes that you wanna take for that record. more like be some information about account on that platform | +| `created_at` | Text | DEFAULT CURRENT_TIMESTAMP | -- | +| `updated_at` | Text | DEFAULT CURRENT_TIMESTAMP | -- | diff --git a/docs/installing.md b/docs/installing.md index a3eb3a96..895966c9 100644 --- a/docs/installing.md +++ b/docs/installing.md @@ -5,6 +5,7 @@ This file give you a deep guide on installion & updation process. we hope that y 👏👏 We appreciate your efforts. As developer we try to abstract away complicated process, But sometimes this abstraction make thing simple that it is.. Which lead to false image of the process. To avoid that, we have created this guide that help you navigate installion and updation process.. # Table of Contents + - [Installion Process](#installion-process) - [Updation Process](#updation-process) - [Guide To Find A Best Release](#guide-to-find-a-best-release) @@ -15,33 +16,26 @@ This file give you a deep guide on installion & updation process. we hope that y For inital installion of app, you follow step given below it work in most scenario. 1. Checking whether the app can run on your device or not. - - - go to your setting app and check whether you are on android 8+ or not? - - - if no, then sorry, app is not comatible with your device. - - - and if yes, then mostly you are good to go but, officially we only support device between android 8 to 14. For more high android version app can be run, But we don;t officially support it. + - go to your setting app and check whether you are on android 8+ or not? + - if no, then sorry, app is not comatible with your device. + - and if yes, then mostly you are good to go but, officially we only support device between android 8 to 14. For more high android version app can be run, But we don;t officially support it. 2. After completing first step, Pick a version of app to install. - - - Go to our [github repository release page](https://github.com/JeelDobariya38/password-manager/releases). There you will find a list of release avaiable. - - - pick up any one of the release you like. (we recommend you to pick a good release. [how can you find a good release](#guide-to-find-a-best-release)?) - - - after pick up a release, you can read the changelog to know what has changed. (optional step) - + - Go to our [github repository release page](https://github.com/JeelDobariya38/Passcodes/releases). There you will find a list of release avaiable. + - pick up any one of the release you like. (we recommend you to pick a good release. [how can you find a good release](#guide-to-find-a-best-release)?) + - after pick up a release, you can read the changelog to know what has changed. (optional step) 3. Downloading apk files - - after pick up a release, you can scroll to the assets and download the apk that better fits your phone cpu architecture. + - after pick up a release, you can scroll to the assets and download the apk that better fits your phone cpu architecture. - - if you don;t know your phone cpu architecture. just download the apk file that has universal in its name. + - if you don;t know your phone cpu architecture. just download the apk file that has universal in its name. 4. Installing apk files. - - install the apk file. the apk file will be mostly like downloaded in your browser (probably like chrome, firefox or edge). + - install the apk file. the apk file will be mostly like downloaded in your browser (probably like chrome, firefox or edge). - - open the app. - -if any problem occur while performing the above 4 step. report your problem using [github issues](https://github.com/JeelDobariya38/password-manager/issues/new) after checking other support docs avaiable in github repositoy "docs/" folder. + - open the app. + +if any problem occur while performing the above 4 step. report your problem using [github issues](https://github.com/JeelDobariya38/Passcodes/issues/new) after checking other support docs avaiable in github repositoy "docs/" folder. ## Updation Process @@ -54,39 +48,34 @@ you can follow step given below. they work for most scenario. > this try of data loss are likely to occur, when you are update from one major version to another major version meaning from `1.x.x` to `2.x.x`. 1. Checking Whether The Update Exist Or Not - - compare your current app version with lastest app update. (you can find your current installed passcodes app version under app info in your phone settings) - - - check whether a update exist or not? - - - if no, then you can;t update but, can surely enquire about the next update using github issues. - - > if you know a bit of android then just clone the repo and build from main. it will work fine, because we use main branch as production. take reference from existing building docs in github. - > Ignore this if it doesn;t make sense to you.. - - - if yes, then check how big the update is and how it affect your expirence as user? - - - to find the update impact you can check what the difference between your version and new version you are updating to. - > eg, if you update from 1.x.x to 2.x.x the the change will be big. if you update from 1.x.0 to 1.x.2 then change might be not visible even. + - compare your current app version with lastest app update. (you can find your current installed passcodes app version under app info in your phone settings) + - check whether a update exist or not? + - if no, then you can;t update but, can surely enquire about the next update using github issues. + + > if you know a bit of android then just clone the repo and build from main. it will work fine, because we use main branch as production. take reference from existing building docs in github. + > Ignore this if it doesn;t make sense to you.. + + - if yes, then check how big the update is and how it affect your expirence as user? + - to find the update impact you can check what the difference between your version and new version you are updating to. + > eg, if you update from 1.x.x to 2.x.x the the change will be big. if you update from 1.x.0 to 1.x.2 then change might be not visible even. 2. Downloaded the updated apk files. - - it is same as you did earlier while installing the app. + - it is same as you did earlier while installing the app. - - goto release page and download the asset from select release. refer installion guide above if needed. + - goto release page and download the asset from select release. refer installion guide above if needed. 3. Update the app. - - if, you updating to a new major release, meaning from 1.x.x to 2.x.x then, don;t forget to backup your data. you will thank your self later, if something goes wrong... - - - now install the new apk file it will ask you to upgrade instead of install. - - - open the app and enjoy your updated expirence. + - if, you updating to a new major release, meaning from 1.x.x to 2.x.x then, don;t forget to backup your data. you will thank your self later, if something goes wrong... + - now install the new apk file it will ask you to upgrade instead of install. + - open the app and enjoy your updated expirence. 4. Restore the backup if need. - - if, needed restore the files/data back. or even revert to prevoius release if, problem occurs. + - if, needed restore the files/data back. or even revert to prevoius release if, problem occurs. - - we admire the contribution even in form of your exprience with app. + - we admire the contribution even in form of your exprience with app. - > meaning, reporting your data erase on update problem. will be appricate. - > it help us make better exprience & fix bug that might be missed by us. + > meaning, reporting your data erase on update problem. will be appricate. + > it help us make better exprience & fix bug that might be missed by us. --- @@ -101,23 +90,24 @@ Each release on github may have a label but, some even lack them completely. The There are majorly two ways, In which we classify release. Mean a release will have two labels. So to speak: - - **Build Label**: a label which won't change once after release. (alpha/beta/stable) - - **Github Release Label**: a label that can change. (pre-release/latest) +- **Build Label**: a label which won't change once after release. (alpha/beta/stable) +- **Github Release Label**: a label that can change. (pre-release/latest) + +#### Three type that are there in app itself, you find them in release title on github: -#### Three type that are there in app itself, you find them in release title on github: (this tags/labels can;t change after initial release of that version is done). - - - Alpha: special design for development purpose, not intented to use by end users, they comes with likely lots of bugs and security venurablitity. - - Beta: release that can be used by mass audience, and likely can contain minior bugs. - - Stable: are likey to be more stable then others release type, contain nearly zero bugs as they are very well tested. this release also will have extra developer support. +- Alpha: special design for development purpose, not intented to use by end users, they comes with likely lots of bugs and security venurablitity. +- Beta: release that can be used by mass audience, and likely can contain minior bugs. +- Stable: are likey to be more stable then others release type, contain nearly zero bugs as they are very well tested. this release also will have extra developer support. #### Two type are specific to github release. they are label on github release itself: + (this tags can label can change with time as they are dynamic and are not tied to app itself. meaning they are no hard coded anywhere) - - - Pre Release: this release are not so good to install or to stick with. they are generally like `marked as deperacted` or more like `yanked release` - - Latest: this release label make a release as the best up to date release to install. but latest doesn't mean stable. it means latest feature. + +- Pre Release: this release are not so good to install or to stick with. they are generally like `marked as deperacted` or more like `yanked release` +- Latest: this release label make a release as the best up to date release to install. but latest doesn't mean stable. it means latest feature. > [!NOTE] > this label or flag changes with time. meaning, a app version after it release, can be marked as pre-release as there are lots of bug found in that release later or a release can later be marked as latest release as it all good after test in production enviroment. diff --git a/docs/release-workflow.md b/docs/release-workflow.md index eb98f783..e8dda0a4 100644 --- a/docs/release-workflow.md +++ b/docs/release-workflow.md @@ -13,11 +13,8 @@ In this file, you will find documented process about, how we release, new versio 5. Draft a new release with all apk files uploaded (signed apks). 6. Discuss on community and check & test release app on various parameters and + - We run unit tests. + - We run android tests. + - And ofcourse, we internally as developers also test it (manually). - - We run unit tests. - - - We run android tests. - - - And ofcourse, we internally as developers also test it (manually). - -8. Then release it. +7. Then release it. diff --git a/docs/security_guide.md b/docs/security_guide.md index c17890bc..433806ec 100644 --- a/docs/security_guide.md +++ b/docs/security_guide.md @@ -12,7 +12,6 @@ We as developers, recommended you to wait, for its stable release. before full t While, save your password with passcodes application. you should consider or should have knowledge of following things. - Project is license under MIT License. which means that application is given `as it is, without any warranty or guarantee` and is openly/freely available to redistribution or modify. (but you need to have a copy of original license in it) - - With passcodes, your password are as safe as you write it down on pieces of paper or in a txt file digitally. which means that, `your information is not specially protected.` ## Recommendation diff --git a/installondevice.bat b/installondevice.bat index b612e4fe..a8c3e2be 100644 --- a/installondevice.bat +++ b/installondevice.bat @@ -1,9 +1,9 @@ @REM WARNING: Script is Deprecated!! From 2025-07-29T12:45:00Z. -@REM Checkout: https://github.com/JeelDobariya38/password-manager/blob/main/docs/building.md. +@REM Checkout: https://github.com/JeelDobariya38/Passcodes/blob/main/docs/building.md. @REM Build & install on Android phone -echo "WARNING: Script is Deprecated!! From 2025-07-29T12:45:00Z. More Info:- https://github.com/JeelDobariya38/password-manager/blob/main/docs/building.md." +echo "WARNING: Script is Deprecated!! From 2025-07-29T12:45:00Z. More Info:- https://github.com/JeelDobariya38/Passcodes/blob/main/docs/building.md." pause diff --git a/website/README.md b/website/README.md index 4fe1155f..ed2a51b9 100644 --- a/website/README.md +++ b/website/README.md @@ -77,13 +77,11 @@ We understand some contributors may want to work on both the app and the website ### ✅ Correct Workflow: 1. **App Contribution:** - - Branch off from `main` -> `yourname-dev`. - Make changes. - Open a PR to `main`. 2. **Website Contribution:** - - Branch off from `website-production`-> `yourname-website-development`. - Make your changes. - Open a PR to `website-production`.