Skip to content

Commit cdc4c84

Browse files
committed
qp:re 3.0.0.b6: Import/EXport settings
1 parent 7ba72e4 commit cdc4c84

File tree

11 files changed

+272
-151
lines changed

11 files changed

+272
-151
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ dependencies {
114114
// Constraint
115115
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
116116

117+
// CSV Writer
118+
implementation "com.github.doyaaaaaken:kotlin-csv-jvm:0.9.0"
119+
117120
// Color picker
118121
implementation 'com.thebluealliance:spectrum:0.7.1'
119122

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595

9696
<provider
9797
android:name="androidx.core.content.FileProvider"
98-
android:authorities="${applicationId}.provider"
98+
android:authorities="com.mikhailgrigorev.quickpassword.fileprovider"
9999
android:exported="false"
100100
android:grantUriPermissions="true">
101101
<meta-data
Lines changed: 23 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,36 @@
11
package com.mikhailgrigorev.quickpassword.common.manager
22

33
import android.content.Context
4-
import android.os.Environment
5-
import android.util.Log
6-
import com.mikhailgrigorev.quickpassword.R
4+
import android.content.Intent
5+
import androidx.core.content.FileProvider
6+
import com.mikhailgrigorev.quickpassword.data.database.FOLDER_CARD_DB_NAME
7+
import com.mikhailgrigorev.quickpassword.data.database.PASSWORD_CARD_DB_NAME
78
import java.io.File
8-
import java.io.FileInputStream
9-
import java.io.FileOutputStream
10-
import javax.crypto.Cipher
11-
import javax.crypto.CipherInputStream
12-
import javax.crypto.CipherOutputStream
13-
import javax.crypto.spec.SecretKeySpec
149

1510

1611
object BackupManager {
17-
fun importEncryptedDB(context: Context, DB_NAME: String): Int {
18-
try {
19-
val appName = context.resources.getString(R.string.app_name)
20-
val file =
21-
File(Environment.getExternalStorageDirectory().toString() + "/" + appName + "/")
22-
if (!file.exists()) {
23-
file.mkdirs()
24-
}
25-
val sd = Environment.getExternalStorageDirectory()
26-
if (sd.canWrite()) {
27-
val data = Environment.getDataDirectory()
28-
val currentDBPath = "//data//" + context.packageName + "//databases//" + DB_NAME
29-
val backupDBPath = "/$appName/$DB_NAME"
30-
val currentDB = File(sd, backupDBPath)
31-
val backupDB = File(data, currentDBPath)
32-
val src = FileInputStream(currentDB)
33-
val dst = FileOutputStream(backupDB)
34-
35-
val sks = SecretKeySpec("1234567890123456".toByteArray(), "AES")
36-
val cipher = Cipher.getInstance("AES")
37-
cipher.init(Cipher.DECRYPT_MODE, sks)
38-
val cis = CipherInputStream(src, cipher)
39-
var b: Int
40-
val d = ByteArray(8)
41-
while (cis.read(d).also { b = it } != -1) {
42-
dst.write(d, 0, b)
43-
}
44-
dst.flush()
45-
src.close()
46-
dst.close()
47-
cis.close()
48-
Log.e("IMPORT_DB", "Database has been imported.")
49-
return 1
50-
} else {
51-
Log.e("IMPORT_DB", "No storage permission.")
52-
return 2
53-
}
54-
} catch (e: java.lang.Exception) {
55-
e.printStackTrace()
56-
Log.e("IMPORT_DB", "Error importing database!")
57-
return 3
12+
fun generateFile(context: Context, fileName: String): File? {
13+
val csvFile = File(context.filesDir, fileName)
14+
csvFile.createNewFile()
15+
return if (csvFile.exists()) {
16+
csvFile
17+
} else {
18+
null
5819
}
5920
}
6021

61-
fun exportEncryptedDB(context: Context, DB_NAME: String): Int {
62-
try {
63-
val appName: String = context.resources.getString(R.string.app_name)
64-
val file =
65-
File(Environment.getExternalStorageDirectory().toString() + "/" + appName + "/")
66-
if (!file.exists()) {
67-
file.mkdirs()
68-
}
69-
val sd: File = Environment.getExternalStorageDirectory()
70-
if (sd.canWrite()) {
71-
val data: File = Environment.getDataDirectory()
72-
val currentDBPath =
73-
"//data//" + context.packageName.toString() + "//databases//" + DB_NAME
74-
val backupDBPath = "/$appName/$DB_NAME"
75-
val currentDB = File(data, currentDBPath)
76-
val backupDB = File(sd, backupDBPath)
77-
val src = FileInputStream(currentDB)
78-
val dst = FileOutputStream(backupDB)
79-
80-
val sks = SecretKeySpec("1234567890123456".toByteArray(), "AES")
22+
fun goToFileIntent(context: Context, file: File): Intent {
23+
val intent = Intent(Intent.ACTION_VIEW)
24+
val contentUri =
25+
FileProvider.getUriForFile(context, "com.mikhailgrigorev.quickpassword.fileprovider", file)
26+
val mimeType = context.contentResolver.getType(contentUri)
27+
intent.setDataAndType(contentUri, mimeType)
28+
intent.flags =
29+
Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
8130

82-
val cipher: Cipher = Cipher.getInstance("AES")
83-
cipher.init(Cipher.ENCRYPT_MODE, sks)
84-
val cos = CipherOutputStream(dst, cipher)
85-
val b = ByteArray(8)
86-
var i: Int = src.read(b)
87-
while (i != -1) {
88-
cos.write(b, 0, i)
89-
i = src.read(b)
90-
}
91-
src.close()
92-
dst.close()
93-
cos.flush()
94-
cos.close()
95-
return 1
96-
} else {
97-
Log.e("EXPORT_DB", "No storage permission.")
98-
return 2
99-
}
100-
} catch (e: Exception) {
101-
e.printStackTrace()
102-
Log.e("EXPORT_DB", "Error exporting database!")
103-
return 3
104-
}
31+
return intent
10532
}
33+
34+
fun getCSVFileName(folder: Boolean): String =
35+
if (folder) "$FOLDER_CARD_DB_NAME.csv" else "$PASSWORD_CARD_DB_NAME.csv"
10636
}

app/src/main/java/com/mikhailgrigorev/quickpassword/di/component/AppComponent.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import com.mikhailgrigorev.quickpassword.ui.password.PasswordFragment
1212
import com.mikhailgrigorev.quickpassword.ui.password_card.create.PasswordCreateActivity
1313
import com.mikhailgrigorev.quickpassword.ui.password_card.edit.PasswordEditActivity
1414
import com.mikhailgrigorev.quickpassword.ui.password_card.view.PasswordViewActivity
15+
import com.mikhailgrigorev.quickpassword.ui.settings.SettingsFragment
1516
import dagger.Component
1617
import javax.inject.Singleton
1718

@@ -33,4 +34,5 @@ interface ApplicationComponent {
3334
fun inject(fragment: ProfileFragment)
3435
fun inject(fragment: ProfileEditFragment)
3536
fun inject(fragment: PasswordFragment)
37+
fun inject(fragment: SettingsFragment)
3638
}

app/src/main/java/com/mikhailgrigorev/quickpassword/di/modules/viewModel/Extentions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.mikhailgrigorev.quickpassword.di.modules.viewModel
22

3-
import androidx.fragment.app.Fragment
43
import androidx.lifecycle.ViewModel
54
import androidx.lifecycle.ViewModelProvider
65
import com.mikhailgrigorev.quickpassword.ui.account.edit.ProfileEditFragment
@@ -10,6 +9,7 @@ import com.mikhailgrigorev.quickpassword.ui.password.PasswordFragment
109
import com.mikhailgrigorev.quickpassword.ui.password_card.create.PasswordCreateActivity
1110
import com.mikhailgrigorev.quickpassword.ui.password_card.edit.PasswordEditActivity
1211
import com.mikhailgrigorev.quickpassword.ui.password_card.view.PasswordViewActivity
12+
import com.mikhailgrigorev.quickpassword.ui.settings.SettingsFragment
1313

1414
inline fun <reified T : ViewModel> FolderViewActivity.injectViewModel(factory: ViewModelProvider.Factory): T {
1515
return ViewModelProvider(this, factory)[T::class.java]
@@ -39,6 +39,6 @@ inline fun <reified T : ViewModel> PasswordFragment.injectViewModel(factory: Vie
3939
return ViewModelProvider(this, factory)[T::class.java]
4040
}
4141

42-
inline fun <reified T : ViewModel> Fragment.injectViewModel(factory: ViewModelProvider.Factory): T {
42+
inline fun <reified T : ViewModel> SettingsFragment.injectViewModel(factory: ViewModelProvider.Factory): T {
4343
return ViewModelProvider(this, factory)[T::class.java]
4444
}

app/src/main/java/com/mikhailgrigorev/quickpassword/ui/main_activity/MainViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ class MainViewModel @Inject constructor(
2323
folderRepo.insert(item)
2424
}
2525

26+
fun insertPassword(item: PasswordCard) {
27+
passwordCardRepo.insert(item)
28+
}
29+
2630
suspend fun updateCard(item: FolderCard) {
2731
folderRepo.update(item)
2832
}

app/src/main/java/com/mikhailgrigorev/quickpassword/ui/password/PasswordFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,6 @@ class PasswordFragment: Fragment() {
969969
}
970970

971971
private fun initViewModel() {
972-
viewModel = this.injectViewModel<MainViewModel>(viewModelFactory)
972+
viewModel = this.injectViewModel(viewModelFactory)
973973
}
974974
}

0 commit comments

Comments
 (0)