From b6bc82f6b14e506bcf4b3fdcff0b0a18a658574f Mon Sep 17 00:00:00 2001 From: Yogesh Choudhary Paliyal Date: Sat, 25 Sep 2021 14:43:28 +0530 Subject: [PATCH] Working on TOTP --- .idea/misc.xml | 2 ++ .../keypass/data/AccountModel.kt | 11 +++++++ .../keypass/ui/addTOTP/AddTOTPActivity.kt | 6 ++++ .../keypass/ui/addTOTP/AddTOTPViewModel.kt | 6 ++-- .../keypass/ui/home/DashboardViewModel.kt | 31 ++++++++++++++----- .../keypass/ui/home/HomeFragment.kt | 7 +++-- .../keypass/ui/nav/DashboardActivity.kt | 4 ++- .../keypass/utils/TOTPHelper.java | 5 +++ .../res/layout/activity_add_totpactivity.xml | 4 +-- app/src/main/res/layout/item_totp.xml | 13 ++++---- 10 files changed, 68 insertions(+), 21 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 3e591463..5df666d1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,9 @@ + + diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/data/AccountModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/data/AccountModel.kt index b26047d6..02fe3146 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/data/AccountModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/data/AccountModel.kt @@ -3,6 +3,7 @@ package com.yogeshpaliyal.keypass.data import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey +import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.yogeshpaliyal.keypass.R import com.yogeshpaliyal.keypass.constants.AccountType @@ -66,7 +67,17 @@ data class AccountModel( return id } + override fun getDiffBody(): Any? { + return if(type == AccountType.TOPT){ + super.getDiffBody() + }else{ + Gson().toJson(this) + } + } + fun getOtp() = TOTPHelper.generate(password?.toByteArray()) + fun getTOtpProgress() = TOTPHelper.getProgress().toInt() + override fun getLayoutId(): Int = if(type == AccountType.TOPT) R.layout.item_totp else R.layout.item_accounts } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPActivity.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPActivity.kt index 6b005486..0dd51ec5 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPActivity.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPActivity.kt @@ -51,6 +51,12 @@ class AddTOTPActivity : AppCompatActivity() { } }) + mViewModel.goBack.observe(this, Observer { + it.getContentIfNotHandled()?.let { + onBackPressed() + } + }) + } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPViewModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPViewModel.kt index fd71fd4d..6cf8328e 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPViewModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/addTOTP/AddTOTPViewModel.kt @@ -6,6 +6,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.yogeshpaliyal.keypass.AppDatabase import com.yogeshpaliyal.keypass.R +import com.yogeshpaliyal.keypass.constants.AccountType import com.yogeshpaliyal.keypass.data.AccountModel import com.yogeshpaliyal.keypass.utils.Event import dagger.hilt.android.lifecycle.HiltViewModel @@ -31,7 +32,7 @@ class AddTOTPViewModel @Inject constructor(private val appDatabase: AppDatabase) val secretKey = secretKey.value val accountName = accountName.value - if (accountName.isNullOrEmpty()){ + if (secretKey.isNullOrEmpty()){ _error.postValue(Event(R.string.alert_black_secret_key)) return@launch } @@ -41,8 +42,9 @@ class AddTOTPViewModel @Inject constructor(private val appDatabase: AppDatabase) return@launch } - val accountModel = AccountModel(password = secretKey, title = accountName) + val accountModel = AccountModel(password = secretKey, title = accountName,type = AccountType.TOPT) appDatabase.getDao().insertOrUpdateAccount(accountModel) + _goBack.postValue(Event(Unit)) } } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/DashboardViewModel.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/DashboardViewModel.kt index 032708aa..6cdfceb7 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/DashboardViewModel.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/DashboardViewModel.kt @@ -1,13 +1,13 @@ package com.yogeshpaliyal.keypass.ui.home import android.app.Application -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData -import androidx.lifecycle.MediatorLiveData -import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.* import com.yogeshpaliyal.keypass.AppDatabase import com.yogeshpaliyal.keypass.data.AccountModel import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import javax.inject.Inject /* @@ -27,16 +27,31 @@ class DashboardViewModel @Inject constructor(application: Application, val appDb MutableLiveData() } + private val appDao = appDb.getDao() + val mediator = MediatorLiveData>>() init { - mediator.addSource(keyword) { - mediator.postValue(appDb.getDao().getAllAccounts(keyword.value, tag.value)) + mediator.postValue(appDao.getAllAccounts(keyword.value, tag.value)) } mediator.addSource(tag) { - mediator.postValue(appDb.getDao().getAllAccounts(keyword.value, tag.value)) + mediator.postValue(appDao.getAllAccounts(keyword.value, tag.value)) } - mediator.postValue(appDb.getDao().getAllAccounts(keyword.value, tag.value)) + mediator.postValue(appDao.getAllAccounts(keyword.value, tag.value)) + + reloadData() } + + + + private fun reloadData(){ + viewModelScope.launch(Dispatchers.IO) { + while (true){ + delay(1000) + mediator.postValue(appDao.getAllAccounts(keyword.value, tag.value)) + } + } + } + } diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt index fefd4fe7..ffbeeab5 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/home/HomeFragment.kt @@ -72,8 +72,11 @@ class HomeFragment : Fragment() { return binding.root } - val observer = Observer> { - mAdapter.updateData(Resource.success(it)) + private val observer = Observer> { + val newList = it.map { + it.copy(id = it.id, title = it.title, uniqueId = it.uniqueId, username = it.username, it.password, it.site, it.notes, it.tags, it.type) + } + mAdapter.updateData(Resource.success(ArrayList(newList))) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardActivity.kt b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardActivity.kt index c600d174..9ecdd5be 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardActivity.kt +++ b/app/src/main/java/com/yogeshpaliyal/keypass/ui/nav/DashboardActivity.kt @@ -19,6 +19,7 @@ import androidx.navigation.findNavController import com.google.android.material.transition.MaterialElevationScale import com.yogeshpaliyal.keypass.R import com.yogeshpaliyal.keypass.databinding.ActivityDashboardBinding +import com.yogeshpaliyal.keypass.ui.addTOTP.AddTOTPActivity import com.yogeshpaliyal.keypass.ui.detail.DetailActivity import com.yogeshpaliyal.keypass.ui.generate.GeneratePasswordActivity import com.yogeshpaliyal.keypass.ui.home.DashboardViewModel @@ -86,7 +87,8 @@ class DashboardActivity : } } - DetailActivity.start(this) + // DetailActivity.start(this) + AddTOTPActivity.start(this) } bottomNavDrawer.apply { diff --git a/app/src/main/java/com/yogeshpaliyal/keypass/utils/TOTPHelper.java b/app/src/main/java/com/yogeshpaliyal/keypass/utils/TOTPHelper.java index 9b122cd7..2f937927 100644 --- a/app/src/main/java/com/yogeshpaliyal/keypass/utils/TOTPHelper.java +++ b/app/src/main/java/com/yogeshpaliyal/keypass/utils/TOTPHelper.java @@ -12,6 +12,10 @@ public class TOTPHelper { return String.format(Locale.getDefault(),"%06d", generate(secret, System.currentTimeMillis() / 1000, 6)); } + public static long getProgress(){ + return 30 - ((System.currentTimeMillis() / 1000)%30); + } + public static int generate(byte[] key, long t, int digits) { int r = 0; @@ -44,6 +48,7 @@ public class TOTPHelper { } catch(Exception e){ + e.printStackTrace(); } return r; diff --git a/app/src/main/res/layout/activity_add_totpactivity.xml b/app/src/main/res/layout/activity_add_totpactivity.xml index 56a81d70..930a5c32 100644 --- a/app/src/main/res/layout/activity_add_totpactivity.xml +++ b/app/src/main/res/layout/activity_add_totpactivity.xml @@ -41,7 +41,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Secret Key" - android:text="@{mViewModel.secretKey}" + android:text="@={mViewModel.secretKey}" android:id="@+id/etSecretKey"/> @@ -59,7 +59,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/account_name" - android:text="@{mViewModel.accountName}" + android:text="@={mViewModel.accountName}" android:id="@+id/etAccount"/> diff --git a/app/src/main/res/layout/item_totp.xml b/app/src/main/res/layout/item_totp.xml index ae33c810..dfa295b0 100644 --- a/app/src/main/res/layout/item_totp.xml +++ b/app/src/main/res/layout/item_totp.xml @@ -25,16 +25,15 @@ app:layout_constraintEnd_toEndOf="parent" app:cardUseCompatPadding="true" android:elevation="@dimen/plane_00" - android:clickable="true" - android:focusable="true" app:cardElevation="0dp" - android:onClick="@{(view)->listener.onItemClick(view, model)}" android:layout_marginVertical="@dimen/grid_0_25" android:layout_marginHorizontal="@dimen/grid_0_5"> + android:paddingStart="8dp" + android:paddingVertical="12dp" + android:paddingEnd="12dp">