Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/build-apks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ jobs:
distribution: "temurin"
java-version: "17"

- name: Decode Keystore
run: |
echo "$KEYSTORE_BASE64" | base64 --decode > passcodes-staging.jks
env:
KEYSTORE_BASE64: ${{ secrets.STAGING_KEYSTORE_BASE64 }}

- name: Decode Keystore Properties
run: |
echo "$KEYSTORE_PROPERTIES_BASE64" | base64 --decode > keystore.properties
env:
KEYSTORE_PROPERTIES_BASE64: ${{ secrets.STAGING_KEYSTORE_PROPERTIES_BASE64 }}

- name: Setup Gradle
uses: gradle/gradle-build-action@v3

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.jeeldobariya.passcodes.ui

import android.annotation.SuppressLint
import android.content.ClipData;
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
Expand All @@ -27,12 +28,13 @@ class ViewPasswordActivity : AppCompatActivity() {
private var passwordEntityId: Int = 0
private lateinit var binding: ActivityViewPasswordBinding
private lateinit var controller: Controller
private lateinit var passwordEntity: Password

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)
Expand All @@ -58,7 +60,7 @@ class ViewPasswordActivity : AppCompatActivity() {
private fun fillDataInTextview() {
lifecycleScope.launch {
try {
val passwordEntity: Password = controller.getPasswordById(passwordEntityId)
passwordEntity = controller.getPasswordById(passwordEntityId)
withContext(Dispatchers.Main) {
binding.tvDomain.text = "${getString(R.string.domain_prefix)} ${passwordEntity.domain}"
binding.tvUsername.text = "${getString(R.string.username_prefix)} ${passwordEntity.username}"
Expand Down Expand Up @@ -90,6 +92,30 @@ class ViewPasswordActivity : AppCompatActivity() {

// Added all the onclick event listeners
private fun addOnClickListenerOnButton() {
binding.copyPasswordBtn.setOnClickListener {
val confirmDialog = AlertDialog.Builder(this@ViewPasswordActivity)
.setTitle(R.string.copy_password_dialog_title)
.setMessage(R.string.danger_copy_to_clipboard_desc)
.setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which ->
val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager
val clip: ClipData = ClipData.newPlainText(passwordEntity.username, passwordEntity.password)

// Set the ClipData to the clipboard
if (clipboard != null) {
clipboard.setPrimaryClip(clip)
Toast.makeText(this, getString(R.string.copy_success), Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, "Clipboard service not available.", Toast.LENGTH_SHORT).show()
}
}
.setNegativeButton(R.string.discard_dialog_button_text) { dialog, which ->
Toast.makeText(this, getString(R.string.action_discard), Toast.LENGTH_SHORT).show();
}
.create();

confirmDialog.show();
}

binding.updatePasswordBtn.setOnClickListener {
val viewPasswordIntent = Intent(this, UpdatePasswordActivity::class.java)
viewPasswordIntent.putExtra("id", passwordEntityId)
Expand All @@ -101,18 +127,18 @@ class ViewPasswordActivity : AppCompatActivity() {
.setTitle(R.string.delete_password_dialog_title)
.setMessage(R.string.irreversible_dialog_desc)
.setPositiveButton(R.string.confirm_dialog_button_text) { dialog, which ->
performDeletePasswordAction();
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() {
private fun performDeletePasswordAction() {
lifecycleScope.launch {
try {
val rowsDeleted = controller.deletePassword(passwordEntityId)
Expand Down
11 changes: 10 additions & 1 deletion app/src/main/res/layout/activity_view_password.xml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,16 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical">


<com.google.android.material.button.MaterialButton
android:id="@+id/copy_password_btn"
android:textColor="?attr/colorSecondary"
app:backgroundTint="?attr/colorSecondaryContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/copy_password_button_text"
android:textSize="14dp" />

<com.google.android.material.button.MaterialButton
android:id="@+id/update_password_btn"
android:textColor="?attr/colorSecondary"
Expand Down
27 changes: 27 additions & 0 deletions app/src/main/res/values/arrays.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<resources>
<string-array name="lang_options">
<item>English (en-us)</item>
<item>Hindi (hi)</item>
<item>Indonesian (in)</item>
<item>Korean (ko)</item>
<item>Korean Romanized (kr)</item>
<item>Japanese (ja)</item>
<item>German (de)</item>
<item>Spanish (es)</item>
<item>Chinese (zh)</item>
<item>Vietnamese (vi)</item>
</string-array>

<string-array name="lang_locale_tags">
<item>en</item>
<item>hi</item>
<item>id</item>
<item>ko</item>
<item>kr</item>
<item>ja</item>
<item>de</item>
<item>es</item>
<item>zh</item>
<item>vi</item>
</string-array>
</resources>
30 changes: 4 additions & 26 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@
<string name="hint_username">Username</string>
<string name="hint_password">Password</string>
<string name="hint_notes">Notes</string>
<string name="copy_success" translatable="false">Copied Successfully</string>
<string name="placeholder_domain_field">e.g. Google, Instagram, WhatsApp, etc.</string>
<string name="placeholder_username_field">e.g. Liam15, Noha, Olivia, Ava_25, etc.</string>
<string name="placeholder_password_field">e.g. 12345, abc123xyz, qwerty, etc.</string>
<string name="password_manager_button_text">Password Manager</string>
<string name="copy_password_button_text" translatable="false">Copy Password</string>
<string name="save_password_button_text">Save Password</string>
<string name="load_password_button_text">Load Password</string>
<string name="update_password_button_text">Update Password</string>
Expand Down Expand Up @@ -83,35 +85,11 @@
<string name="error_invalid_password_id">Something Went Wrong: Invalid ID!!</string>

<!-- Alert Dialog Message -->
<string name="copy_password_dialog_title" translatable="false">Copy to Clipboard?</string>
<string name="update_password_dialog_title">Update password?</string>
<string name="delete_password_dialog_title">Delete password?</string>
<string name="irreversible_dialog_desc">This action cannot be undone.</string>
<string name="danger_copy_to_clipboard_desc" translatable="false">Copying sensitive data like passwords to clipboard is not so good for security!!!</string>
<string name="confirm_dialog_button_text">Confirm</string>
<string name="discard_dialog_button_text">Discard</string>

<string-array name="lang_options">
<item>English (en-us)</item>
<item>Hindi (hi)</item>
<item>Indonesian (in)</item>
<item>Korean (ko)</item>
<item>Korean Romanized (kr)</item>
<item>Japanese (ja)</item>
<item>German (de)</item>
<item>Spanish (es)</item>
<item>Chinese (zh)</item>
<item>Vietnamese (vi)</item>
</string-array>

<string-array name="lang_locale_tags">
<item>en</item>
<item>hi</item>
<item>id</item>
<item>ko</item>
<item>kr</item>
<item>ja</item>
<item>de</item>
<item>es</item>
<item>zh</item>
<item>vi</item>
</string-array>
</resources>