Skip to content
Closed
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
18 changes: 10 additions & 8 deletions app/src/main/java/org/fedorahosted/freeotp/token/TokenLayout.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,22 +84,24 @@ class TokenLayout : MaterialCardView, View.OnClickListener, Runnable {
mImage.setTokenImage(token)

// Set the labels.
mLabel.text = token.label
val category = token.category?.trim()?.takeIf { it.isNotEmpty() }
val accountLabel = if (category == null) {
token.label
} else {
"${token.label} ($category)"
}
mLabel.text = accountLabel
mIssuer.text = token.issuer
mCode.text = mPlaceholder
if (mIssuer.text.isEmpty()) {
mIssuer.text = token.label
mIssuer.text = accountLabel
mLabel.visibility = View.GONE
} else {
mLabel.visibility = View.VISIBLE
}

if (token.category.isNullOrBlank()) {
mCategory.visibility = View.GONE
} else {
mCategory.visibility = View.VISIBLE
mCategory.text = token.category
}
mCategory.visibility = View.GONE
mCategory.text = ""
}

private fun animate(view: View, anim: Int, animate: Boolean) {
Expand Down
110 changes: 105 additions & 5 deletions app/src/main/java/org/fedorahosted/freeotp/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.first
Expand Down Expand Up @@ -96,6 +97,9 @@ class MainActivity : AppCompatActivity() {
private var menu: Menu? = null
private var lastSessionEndTimestamp = 0L;
private var categories: List<String> = emptyList()
private var hasUncategorizedTokens = false
private var selectedCategoryFilter: String? = null
private var updatingCategoryTabs = false

private val tokenListObserver: AdapterDataObserver = object: AdapterDataObserver() {
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
Expand Down Expand Up @@ -181,6 +185,15 @@ class MainActivity : AppCompatActivity() {
launch {
viewModel.getAllCategories().collect {
categories = it
updateCategoryTabs()
invalidateOptionsMenu()
}
}

launch {
viewModel.hasUncategorizedTokens().collect {
hasUncategorizedTokens = it
updateCategoryTabs()
invalidateOptionsMenu()
}
}
Expand All @@ -203,6 +216,20 @@ class MainActivity : AppCompatActivity() {

})

binding.categoryTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
override fun onTabSelected(tab: TabLayout.Tab) {
if (!updatingCategoryTabs) {
selectCategoryFilter(tab.tag as? String, updateTabs = false)
}
}

override fun onTabUnselected(tab: TabLayout.Tab) {
}

override fun onTabReselected(tab: TabLayout.Tab) {
}
})

binding.addTokenFab.setOnClickListener {
startActivity(Intent(this, ScanTokenActivity::class.java))
}
Expand Down Expand Up @@ -245,14 +272,19 @@ class MainActivity : AppCompatActivity() {
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
val filterItem = menu.findItem(R.id.action_filter)
val filterMenu = filterItem?.subMenu ?: return super.onPrepareOptionsMenu(menu)
filterItem.isVisible = categories.isNotEmpty() || hasUncategorizedTokens
filterMenu.clear()

filterMenu.add(Menu.NONE, R.id.action_filter_all, Menu.NONE, R.string.all_categories)
filterMenu.add(Menu.NONE, R.id.action_filter_uncategorized, Menu.NONE, R.string.uncategorized)
if (categories.isNotEmpty()) {
filterMenu.add(Menu.NONE, R.id.action_filter_all, Menu.NONE, R.string.all_categories)
}
if (hasUncategorizedTokens) {
filterMenu.add(Menu.NONE, R.id.action_filter_uncategorized, Menu.NONE, R.string.uncategorized)
}

for (category in categories) {
filterMenu.add(Menu.NONE, Menu.NONE, Menu.NONE, category).setOnMenuItemClickListener {
viewModel.setCategoryFilter(category)
selectCategoryFilter(category)
true
}
}
Expand All @@ -273,12 +305,12 @@ class MainActivity : AppCompatActivity() {
}

R.id.action_filter_all -> {
viewModel.setCategoryFilter(null)
selectCategoryFilter(null)
return true
}

R.id.action_filter_uncategorized -> {
viewModel.setCategoryFilter(MainViewModel.CATEGORY_UNCATEGORIZED)
selectCategoryFilter(MainViewModel.CATEGORY_UNCATEGORIZED)
return true
}

Expand Down Expand Up @@ -478,6 +510,74 @@ class MainActivity : AppCompatActivity() {
this.menu?.findItem(R.id.require_authentication)?.isChecked = settings.requireAuthentication
}

private fun selectCategoryFilter(category: String?, updateTabs: Boolean = true) {
selectedCategoryFilter = category
viewModel.setCategoryFilter(category)

if (updateTabs) {
selectCategoryTab(category)
}
}

private fun updateCategoryTabs() {
normalizeCategoryFilter()

updatingCategoryTabs = true
binding.categoryTabs.removeAllTabs()
if (categories.isEmpty() && !hasUncategorizedTokens) {
binding.categoryTabs.visibility = View.GONE
updatingCategoryTabs = false
return
}

binding.categoryTabs.visibility = View.VISIBLE
if (categories.isNotEmpty()) {
addCategoryTab(getString(R.string.category_tab_all), null)
}
if (hasUncategorizedTokens) {
addCategoryTab(getString(R.string.category_tab_none), MainViewModel.CATEGORY_UNCATEGORIZED)
}
categories.forEach { category ->
addCategoryTab(category, category)
}
selectCategoryTab(selectedCategoryFilter)
updatingCategoryTabs = false
}

private fun normalizeCategoryFilter() {
val normalizedCategory = when {
categories.isEmpty() && !hasUncategorizedTokens -> null
categories.isEmpty() && hasUncategorizedTokens -> MainViewModel.CATEGORY_UNCATEGORIZED
selectedCategoryFilter == MainViewModel.CATEGORY_UNCATEGORIZED && !hasUncategorizedTokens -> null
selectedCategoryFilter != null &&
selectedCategoryFilter != MainViewModel.CATEGORY_UNCATEGORIZED &&
!categories.contains(selectedCategoryFilter) -> null
else -> selectedCategoryFilter
}

if (selectedCategoryFilter != normalizedCategory) {
selectedCategoryFilter = normalizedCategory
viewModel.setCategoryFilter(normalizedCategory)
}
}

private fun addCategoryTab(title: String, category: String?) {
val tab = binding.categoryTabs.newTab()
.setText(title)
tab.tag = category
binding.categoryTabs.addTab(tab, category == selectedCategoryFilter)
}

private fun selectCategoryTab(category: String?) {
for (index in 0 until binding.categoryTabs.tabCount) {
val tab = binding.categoryTabs.getTabAt(index) ?: continue
if (tab.tag == category) {
tab.select()
return
}
}
}

private fun verifyAuthentication(isEnabling: Boolean = false, isDisabling: Boolean = false) {
val executor = ContextCompat.getMainExecutor(this)
val biometricPrompt = BiometricPrompt(this, executor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class MainViewModel @Inject constructor(

fun getAllCategories(): Flow<List<String>> = otpTokenDatabase.otpTokenDao().getAllCategories()

fun hasUncategorizedTokens(): Flow<Boolean> = otpTokenDatabase.otpTokenDao().hasUncategorizedTokens()

fun getTokenList(): Flow<List<OtpToken>> {
return combine(authState, tokenSearchQuery, categoryFilter, otpTokenDatabase.otpTokenDao().getAll()) {auth, searchQuery, category, tokens ->
if (auth != AuthState.AUTHENTICATED) {
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/res/layout/main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@
android:layout_marginEnd="@dimen/space_2"
android:iconifiedByDefault="true"/>
</com.google.android.material.appbar.MaterialToolbar>
<com.google.android.material.tabs.TabLayout
android:id="@+id/category_tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabGravity="start"
app:tabMode="scrollable" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/res/values-af-rZA/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Launch with screenshot enabled</string>
<string name="token_details">Token details</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">Alles</string>
<string name="category_tab_none">Geen</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ar-rSA/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">إطلاق مع تمكين لقطة الشاشة</string>
<string name="token_details">تفاصيل الرمز</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">الكل</string>
<string name="category_tab_none">لا شيء</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ca-rES/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Inicia amb la captura de pantalla activada</string>
<string name="token_details">Detalls de l\'OTP</string>
<string name="share_to_other_apps">Envia a una altra app</string>
<string name="category_tab_all">Tot</string>
<string name="category_tab_none">Cap</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-cs-rCZ/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Spustit s povoleným snímkem obrazovky</string>
<string name="token_details">Detaily tokenu</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">Vše</string>
<string name="category_tab_none">Žádné</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-de-rDE/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Starte mit aktiviertem Screenshot</string>
<string name="token_details">Token-Details</string>
<string name="share_to_other_apps">Mit anderen Apps teilen</string>
<string name="category_tab_all">Alle</string>
<string name="category_tab_none">Keine</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-es-rES/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Iniciar con captura de pantalla activada</string>
<string name="token_details">Detalles del token</string>
<string name="share_to_other_apps">Enviar a otras aplicaciones</string>
<string name="category_tab_all">Todo</string>
<string name="category_tab_none">Ninguna</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-eu-rES/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Abiarazi pantaila-argazkiak gaituz</string>
<string name="token_details">Token xehetasunak</string>
<string name="share_to_other_apps">Partekatu beste aplikazioekin</string>
<string name="category_tab_all">Denak</string>
<string name="category_tab_none">Bat ere ez</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-fr-rFR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Lancer avec capture d\'écran activée</string>
<string name="token_details">Détails du jeton</string>
<string name="share_to_other_apps">Partager avec d\'autres applications</string>
<string name="category_tab_all">Tout</string>
<string name="category_tab_none">Aucune</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-hu-rHU/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Launch with screenshot enabled</string>
<string name="token_details">Token details</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">Mind</string>
<string name="category_tab_none">Nincs</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-id-rID/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,4 +76,6 @@
<string name="launch_with_screenshot_enabled">Luncurkan dengan tangkapan layar aktif</string>
<string name="token_details">Detail Token</string>
<string name="share_to_other_apps">Bagikan ke aplikasi lain</string>
<string name="category_tab_all">Semua</string>
<string name="category_tab_none">Tidak ada</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-it-rIT/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Usa con gli screenshot abilitati</string>
<string name="token_details">Dettagli del token</string>
<string name="share_to_other_apps">Condividi con altre app</string>
<string name="category_tab_all">Tutti</string>
<string name="category_tab_none">Nessuna</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-iw-rHE/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">הפעלה כאשר צילום מסך מופעל</string>
<string name="token_details">פרטי אסימון</string>
<string name="share_to_other_apps">שיתוף עם יישומים אחרים</string>
<string name="category_tab_all">הכל</string>
<string name="category_tab_none">ללא</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ja-rJP/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">スクリーンショットを有効にして起動</string>
<string name="token_details">トークンの詳細</string>
<string name="share_to_other_apps">他のアプリと共有する</string>
<string name="category_tab_all">すべて</string>
<string name="category_tab_none">なし</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-pl-rPL/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Uruchom z włączonym zrzutem ekranu</string>
<string name="token_details">Szczegóły tokenu</string>
<string name="share_to_other_apps">Udostępnij innym aplikacjom</string>
<string name="category_tab_all">Wszystkie</string>
<string name="category_tab_none">Brak</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-pt-rBR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Iniciar com captura de tela ativada</string>
<string name="token_details">Detalhes do token</string>
<string name="share_to_other_apps">Compartilhar com outros apps</string>
<string name="category_tab_all">Todos</string>
<string name="category_tab_none">Nenhuma</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ru-rRU/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Запуск с включённым режимом скриншота</string>
<string name="token_details">Детали токена</string>
<string name="share_to_other_apps">Поделиться с другими приложениями</string>
<string name="category_tab_all">Все</string>
<string name="category_tab_none">Нет</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-si-rLK/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">තිර රුවක් සබල කර දියත් කරන්න</string>
<string name="token_details">ටෝකන් විස්තර</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">සියල්ල</string>
<string name="category_tab_none">නැත</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-sv-rSE/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Starta med skärmdump aktiverad</string>
<string name="token_details">Tokendetaljer</string>
<string name="share_to_other_apps">Dela med andra appar</string>
<string name="category_tab_all">Alla</string>
<string name="category_tab_none">Ingen</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-ta-rIN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Launch with screenshot enabled</string>
<string name="token_details">Token details</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">அனைத்தும்</string>
<string name="category_tab_none">எதுவுமில்லை</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-tr-rTR/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Ekran görüntüsü aktifken başlat</string>
<string name="token_details">Token ayrıntıları</string>
<string name="share_to_other_apps">Diğer uygulamalarla paylaş</string>
<string name="category_tab_all">Tümü</string>
<string name="category_tab_none">Yok</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-uk-rUA/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">Запустити з дозволеним знімком екрана</string>
<string name="token_details">Деталі ключа</string>
<string name="share_to_other_apps">Share to other apps</string>
<string name="category_tab_all">Усі</string>
<string name="category_tab_none">Немає</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-zh-rCN/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">启动时允许屏幕截图</string>
<string name="token_details">令牌详细信息</string>
<string name="share_to_other_apps">分享到其他应用</string>
<string name="category_tab_all">全部</string>
<string name="category_tab_none">无</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values-zh-rTW/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,6 @@
<string name="launch_with_screenshot_enabled">啟用螢幕截圖啟動</string>
<string name="token_details">權杖詳細資訊</string>
<string name="share_to_other_apps">分享給其他應用程式</string>
<string name="category_tab_all">全部</string>
<string name="category_tab_none">無</string>
</resources>
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,6 @@
<string name="category">Category</string>
<string name="all_categories">All categories</string>
<string name="uncategorized">Uncategorized</string>
<string name="category_tab_all">All</string>
<string name="category_tab_none">None</string>
</resources>
Loading