diff --git a/autofill/build.gradle.kts b/autofill/build.gradle.kts index 2832a9c4..ac29b3a4 100644 --- a/autofill/build.gradle.kts +++ b/autofill/build.gradle.kts @@ -46,7 +46,7 @@ android { } dependencies { - // implementation(project(":password_manager")) + implementation(project(":database")) implementation(libs.androidx.core.ktx) implementation(libs.appcompat) @@ -55,4 +55,7 @@ dependencies { // Data/Persistence (Room Bundle) ksp(libs.room.compiler) implementation(libs.room.ktx) + + implementation(libs.coroutines.core) + implementation(libs.koin.compose) } diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt index c460aa12..a5d30837 100644 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt +++ b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/PasswordAutofillService.kt @@ -10,12 +10,14 @@ import android.service.autofill.SaveCallback import android.service.autofill.SaveRequest import android.view.autofill.AutofillValue import android.widget.RemoteViews -import com.jeeldobariya.passcodes.autofill.data.Passcode -import com.jeeldobariya.passcodes.autofill.data.PasscodeDatabase +import android.widget.Toast +import com.jeeldobariya.passcodes.database.master.PasswordEntity +import com.jeeldobariya.passcodes.database.master.PasswordsDao import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch +import org.koin.android.ext.android.inject // TODO: currently the code here serves as a foundation for autofill features.. class PasswordAutofillService : AutofillService() { @@ -49,20 +51,31 @@ class PasswordAutofillService : AutofillService() { } serviceScope.launch { - // TODO: use the database module instead of separate database - val passcodes = - PasscodeDatabase.getDatabase(applicationContext).passcodeDao().getAllPasscodes() - .first() + Toast.makeText( + applicationContext, + "Passcodes autofill is preview feature!!!", + Toast.LENGTH_LONG + ).show() + + val passwordsDao by inject() + val passwords = passwordsDao.getAllPasswords().first() val responseBuilder = FillResponse.Builder() - for (passcode in passcodes) { + if (passwords.isEmpty()) { + callback.onSuccess(null) + } + + for (password in passwords) { val presentation = RemoteViews(packageName, R.layout.autofill_list_item).apply { - setTextViewText(R.id.autofill_username, passcode.name) + setTextViewText( + R.id.autofill_username, + "${password.domain}(${password.username})" + ) } val dataset = android.service.autofill.Dataset.Builder(presentation) - .setValue(usernameId, AutofillValue.forText(passcode.name)) - .setValue(passwordId, AutofillValue.forText(passcode.value)) + .setValue(usernameId, AutofillValue.forText(password.username)) + .setValue(passwordId, AutofillValue.forText(password.password)) .build() responseBuilder.addDataset(dataset) } @@ -86,10 +99,22 @@ class PasswordAutofillService : AutofillService() { if (!username.isNullOrEmpty() && !password.isNullOrEmpty()) { serviceScope.launch { - PasscodeDatabase.getDatabase(applicationContext).passcodeDao().insert( - Passcode(name = username, value = password) + val passwordsDao by inject() + passwordsDao.insertPassword( + PasswordEntity( + domain = "Autofill", + username = username, + password = password, + notes = "Save using autofill service..." + ) ) + Toast.makeText( + applicationContext, + "Open passcodes app and configure the saved password!!!", + Toast.LENGTH_LONG + ).show() } + callback.onSuccess() } else { callback.onFailure(getString(R.string.could_not_save_credentials)) diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt deleted file mode 100644 index 61a37394..00000000 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/Passcode.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.jeeldobariya.passcodes.autofill.data - -import androidx.room.Entity -import androidx.room.PrimaryKey - -@Entity(tableName = "passcodes") -data class Passcode( - @PrimaryKey(autoGenerate = true) - val id: Int = 0, - val name: String, - val value: String -) diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt deleted file mode 100644 index 9519602d..00000000 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDao.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.jeeldobariya.passcodes.autofill.data - -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Update -import kotlinx.coroutines.flow.Flow - -@Dao -interface PasscodeDao { - - @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insert(passcode: Passcode) - - @Update - suspend fun update(passcode: Passcode) - - @Delete - suspend fun delete(passcode: Passcode) - - @Query("SELECT * FROM passcodes ORDER BY name ASC") - fun getAllPasscodes(): Flow> - - @Query("SELECT * FROM passcodes WHERE id = :id") - fun getPasscode(id: Int): Flow -} diff --git a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt b/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt deleted file mode 100644 index e81ca689..00000000 --- a/autofill/src/main/kotlin/com/jeeldobariya/passcodes/autofill/data/PasscodeDatabase.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.jeeldobariya.passcodes.autofill.data - -import android.content.Context -import androidx.room.Database -import androidx.room.Room -import androidx.room.RoomDatabase - -@Database(entities = [Passcode::class], version = 1, exportSchema = false) -abstract class PasscodeDatabase : RoomDatabase() { - - abstract fun passcodeDao(): PasscodeDao - - companion object { - @Volatile - private var INSTANCE: PasscodeDatabase? = null - - fun getDatabase(context: Context): PasscodeDatabase { - return INSTANCE ?: synchronized(this) { - val instance = Room.databaseBuilder( - context.applicationContext, - PasscodeDatabase::class.java, - "passcode_database" - ).build() - INSTANCE = instance - instance - } - } - } -}