From 5ecab0f48a265c210bcfcaf49f92e9d86f720def Mon Sep 17 00:00:00 2001 From: kglazko Date: Fri, 21 Aug 2020 16:14:40 -0700 Subject: [PATCH 1/9] For #13935: Enhanced File Type List Icons (#14036) * For #13935: Enhanced File Type List Icons * For #13935 - Pulls out and tests logic for getting the icon for a DownloadItem Co-authored-by: Kate Glazko Co-authored-by: Jeff Boek --- .../org/mozilla/fenix/ext/DownloadItem.kt | 48 +++++++++++++++++++ .../DownloadsListItemViewHolder.kt | 3 +- .../main/res/drawable/ic_file_type_apk.xml | 12 +++++ .../res/drawable/ic_file_type_audio_note.xml | 13 +++++ .../res/drawable/ic_file_type_default.xml | 12 +++++ .../res/drawable/ic_file_type_document.xml | 24 ++++++++++ .../main/res/drawable/ic_file_type_image.xml | 18 +++++++ .../main/res/drawable/ic_file_type_video.xml | 12 +++++ .../main/res/drawable/ic_file_type_zip.xml | 21 ++++++++ .../mozilla/fenix/ext/DownloadItemKtTest.kt | 27 +++++++++++ 10 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/org/mozilla/fenix/ext/DownloadItem.kt create mode 100644 app/src/main/res/drawable/ic_file_type_apk.xml create mode 100644 app/src/main/res/drawable/ic_file_type_audio_note.xml create mode 100644 app/src/main/res/drawable/ic_file_type_default.xml create mode 100644 app/src/main/res/drawable/ic_file_type_document.xml create mode 100644 app/src/main/res/drawable/ic_file_type_image.xml create mode 100644 app/src/main/res/drawable/ic_file_type_video.xml create mode 100644 app/src/main/res/drawable/ic_file_type_zip.xml create mode 100644 app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt diff --git a/app/src/main/java/org/mozilla/fenix/ext/DownloadItem.kt b/app/src/main/java/org/mozilla/fenix/ext/DownloadItem.kt new file mode 100644 index 000000000..93fa26aea --- /dev/null +++ b/app/src/main/java/org/mozilla/fenix/ext/DownloadItem.kt @@ -0,0 +1,48 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import org.mozilla.fenix.R +import org.mozilla.fenix.library.downloads.DownloadItem + +// While this looks complex, it's actually pretty simple. +@SuppressWarnings("ComplexMethod") +fun DownloadItem.getIcon(): Int { + fun getIconCornerCases(fileName: String?): Int { + return when { + fileName?.endsWith("apk") == true -> R.drawable.ic_file_type_apk + fileName?.endsWith("zip") == true -> R.drawable.ic_file_type_zip + else -> R.drawable.ic_file_type_default + } + } + + fun checkForApplicationArchiveSubtypes(contentType: String): Int? { + return when { + contentType.contains("rar") -> R.drawable.ic_file_type_zip + contentType.contains("zip") -> R.drawable.ic_file_type_zip + contentType.contains("7z") -> R.drawable.ic_file_type_zip + contentType.contains("tar") -> R.drawable.ic_file_type_zip + contentType.contains("freearc") -> R.drawable.ic_file_type_zip + contentType.contains("octet-stream") -> null + contentType.contains("vnd.android.package-archive") -> null + else -> R.drawable.ic_file_type_document + } + } + + fun getIconFromContentType(contentType: String): Int? { + return when { + contentType.contains("image/") -> R.drawable.ic_file_type_image + contentType.contains("audio/") -> R.drawable.ic_file_type_audio_note + contentType.contains("video/") -> R.drawable.ic_file_type_video + contentType.contains("application/") -> checkForApplicationArchiveSubtypes(contentType) + contentType.contains("text/") -> R.drawable.ic_file_type_document + else -> null + } + } + + return contentType?.let { contentType -> + getIconFromContentType(contentType) + } ?: getIconCornerCases(fileName) +} diff --git a/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt index 4126b2cd7..c367ca674 100644 --- a/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/library/downloads/viewholders/DownloadsListItemViewHolder.kt @@ -14,6 +14,7 @@ import org.mozilla.fenix.library.SelectionHolder import org.mozilla.fenix.library.downloads.DownloadInteractor import org.mozilla.fenix.library.downloads.DownloadItem import mozilla.components.feature.downloads.toMegabyteString +import org.mozilla.fenix.ext.getIcon class DownloadsListItemViewHolder( view: View, @@ -34,7 +35,7 @@ class DownloadsListItemViewHolder( itemView.download_layout.changeSelected(item in selectionHolder.selectedItems) itemView.overflow_menu.hideAndDisable() - itemView.favicon.setImageResource(R.drawable.ic_download_default) + itemView.favicon.setImageResource(item.getIcon()) itemView.favicon.isClickable = false this.item = item diff --git a/app/src/main/res/drawable/ic_file_type_apk.xml b/app/src/main/res/drawable/ic_file_type_apk.xml new file mode 100644 index 000000000..e68e42a68 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_apk.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_file_type_audio_note.xml b/app/src/main/res/drawable/ic_file_type_audio_note.xml new file mode 100644 index 000000000..0d1e65b73 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_audio_note.xml @@ -0,0 +1,13 @@ + + + + diff --git a/app/src/main/res/drawable/ic_file_type_default.xml b/app/src/main/res/drawable/ic_file_type_default.xml new file mode 100644 index 000000000..f76b8b185 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_default.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_file_type_document.xml b/app/src/main/res/drawable/ic_file_type_document.xml new file mode 100644 index 000000000..5d1dd8325 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_document.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_file_type_image.xml b/app/src/main/res/drawable/ic_file_type_image.xml new file mode 100644 index 000000000..45fed07fe --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_image.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_file_type_video.xml b/app/src/main/res/drawable/ic_file_type_video.xml new file mode 100644 index 000000000..881a5c728 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_video.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_file_type_zip.xml b/app/src/main/res/drawable/ic_file_type_zip.xml new file mode 100644 index 000000000..75ad4adc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_file_type_zip.xml @@ -0,0 +1,21 @@ + + + + + + + diff --git a/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt new file mode 100644 index 000000000..25ac365b7 --- /dev/null +++ b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt @@ -0,0 +1,27 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +package org.mozilla.fenix.ext + +import org.junit.Test + +import org.junit.Assert.assertEquals +import org.mozilla.fenix.R +import org.mozilla.fenix.library.downloads.DownloadItem + +class DownloadItemKtTest { + @Test + fun getIcon() { + val downloadItem = DownloadItem(0, "MyAwesomeFile", "", "", "image/png") + + assertEquals(R.drawable.ic_file_type_image, downloadItem.getIcon()) + assertEquals(R.drawable.ic_file_type_audio_note, downloadItem.copy(contentType = "audio/mp3").getIcon()) + assertEquals(R.drawable.ic_file_type_video, downloadItem.copy(contentType = "video/mp4").getIcon()) + assertEquals(R.drawable.ic_file_type_document, downloadItem.copy(contentType = "text/csv").getIcon()) + assertEquals(R.drawable.ic_file_type_zip, downloadItem.copy(contentType = "application/gzip").getIcon()) + assertEquals(R.drawable.ic_file_type_apk, downloadItem.copy(contentType = null, fileName = "Fenix.apk").getIcon()) + assertEquals(R.drawable.ic_file_type_zip, downloadItem.copy(contentType = null, fileName = "Fenix.zip").getIcon()) + assertEquals(R.drawable.ic_file_type_default, downloadItem.copy(contentType = null, fileName = null).getIcon()) + } +} From f3b870d3561babfb5ac73d0c246ef0de15e0e9d0 Mon Sep 17 00:00:00 2001 From: Jonathan Almeida Date: Fri, 21 Aug 2020 18:11:16 -0400 Subject: [PATCH 2/9] For #11918: Take a screenshot when clicking the tab tray We looked into taking a screenshot right before leaving the BrowserFragment, however this call will always fail since it's non-blocking (we never want it to be blocking too), and we will never receive a screenshot when a session is detached from an EngineView before the callback is complete. In Fenix, we can nicely evade this by taking a screenshot when click the tabs tray icon, which is where you would want to see the most up-to-date thumbnail of the tab and also does not leave the BrowserFragment as well. --- .../main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt | 3 +++ app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt index 1acc0e059..42f4f4269 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt @@ -42,6 +42,7 @@ import mozilla.components.browser.state.selector.findTabOrCustomTabOrSelectedTab import mozilla.components.browser.state.state.SessionState import mozilla.components.browser.state.state.content.DownloadState import mozilla.components.browser.state.store.BrowserStore +import mozilla.components.browser.thumbnails.BrowserThumbnails import mozilla.components.concept.engine.prompt.ShareData import mozilla.components.feature.accounts.FxaCapability import mozilla.components.feature.accounts.FxaWebChannelFeature @@ -132,6 +133,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session get() = _browserToolbarView!! protected val readerViewFeature = ViewBoundFeatureWrapper() + protected val thumbnailsFeature = ViewBoundFeatureWrapper() private val sessionFeature = ViewBoundFeatureWrapper() private val contextMenuFeature = ViewBoundFeatureWrapper() @@ -231,6 +233,7 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Session tabCollectionStorage = requireComponents.core.tabCollectionStorage, topSiteStorage = requireComponents.core.topSiteStorage, onTabCounterClicked = { + thumbnailsFeature.get()?.requestScreenshot() findNavController().nav( R.id.browserFragment, BrowserFragmentDirections.actionGlobalTabTrayDialogFragment() diff --git a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt index 797a5c34d..251cec203 100644 --- a/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt @@ -54,7 +54,6 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler { private val windowFeature = ViewBoundFeatureWrapper() private val searchFeature = ViewBoundFeatureWrapper() - private val thumbnailsFeature = ViewBoundFeatureWrapper() private var readerModeAvailable = false From ffb794751e43dc4ef100fcbfb79658a67481c8f1 Mon Sep 17 00:00:00 2001 From: Kate Glazko Date: Fri, 21 Aug 2020 17:01:53 -0700 Subject: [PATCH 3/9] No Issue: Fix DownloadItemKtTest --- app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt index 25ac365b7..d4881dddb 100644 --- a/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt +++ b/app/src/test/java/org/mozilla/fenix/ext/DownloadItemKtTest.kt @@ -4,6 +4,7 @@ package org.mozilla.fenix.ext +import mozilla.components.browser.state.state.content.DownloadState import org.junit.Test import org.junit.Assert.assertEquals @@ -13,7 +14,7 @@ import org.mozilla.fenix.library.downloads.DownloadItem class DownloadItemKtTest { @Test fun getIcon() { - val downloadItem = DownloadItem(0, "MyAwesomeFile", "", "", "image/png") + val downloadItem = DownloadItem("0", "MyAwesomeFile", "", "", "image/png", DownloadState.Status.COMPLETED) assertEquals(R.drawable.ic_file_type_image, downloadItem.getIcon()) assertEquals(R.drawable.ic_file_type_audio_note, downloadItem.copy(contentType = "audio/mp3").getIcon()) From 16b3b7a1b5bd2bc1c2448cd5d1460d7a6532bcf3 Mon Sep 17 00:00:00 2001 From: Tang HuaiZhe Date: Wed, 19 Aug 2020 14:22:29 +0800 Subject: [PATCH 4/9] Fix the comment of TextViewAndroidSrcXmlDetector. --- .../mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt index e582df218..4051900d9 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt @@ -23,7 +23,7 @@ import com.android.tools.lint.detector.api.XmlContext import org.w3c.dom.Element /** - * A custom lint check that prohibits not using the app:srcCompat for ImageViews + * A custom lint check that prohibits not using the android:drawableX to define drawables in TextViews */ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { companion object { From 76f240bad072019dd6328e7a6939d6128efdf549 Mon Sep 17 00:00:00 2001 From: TangHuaiZhe Date: Fri, 21 Aug 2020 11:09:09 +0800 Subject: [PATCH 5/9] Update mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt Co-authored-by: Tiger Oakes --- .../mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt index 4051900d9..f6411fe2b 100644 --- a/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt +++ b/mozilla-lint-rules/src/main/java/org/mozilla/fenix/lintrules/TextViewAndroidSrcXmlDetector.kt @@ -23,7 +23,7 @@ import com.android.tools.lint.detector.api.XmlContext import org.w3c.dom.Element /** - * A custom lint check that prohibits not using the android:drawableX to define drawables in TextViews + * A custom lint check that prohibits not using the app:drawableXCompat to define drawables in TextViews */ class TextViewAndroidSrcXmlDetector : ResourceXmlDetector() { companion object { From b57601df1e443d37f8fd8f41a2ac319056d53fb8 Mon Sep 17 00:00:00 2001 From: bawyap Date: Thu, 20 Aug 2020 14:09:48 +0530 Subject: [PATCH 6/9] FNX2-15653:checks blanks name in homescreen shortcut name --- .../mozilla/fenix/shortcut/CreateShortcutFragment.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt index 9918a677e..54ffa8539 100644 --- a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt @@ -5,6 +5,7 @@ package org.mozilla.fenix.shortcut import android.os.Bundle +import android.text.Editable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -41,7 +42,7 @@ class CreateShortcutFragment : DialogFragment() { cancel_button.setOnClickListener { dismiss() } add_button.setOnClickListener { - val text = shortcut_text.text.toString() + val text = shortcut_text.text.toString().trim() requireActivity().lifecycleScope.launch { requireComponents.useCases.webAppUseCases.addToHomescreen(text) } @@ -57,10 +58,13 @@ class CreateShortcutFragment : DialogFragment() { } private fun updateAddButtonEnabledState() { - add_button.isEnabled = shortcut_text.text.isNotEmpty() - add_button.alpha = if (shortcut_text.text.isNotEmpty()) ENABLED_ALPHA else DISABLED_ALPHA + val text = shortcut_text.text + add_button.isEnabled = isTextValid(text) + add_button.alpha = if (isTextValid(text)) ENABLED_ALPHA else DISABLED_ALPHA } + private fun isTextValid(text: Editable) = text.isNotEmpty() && !text.isBlank() + companion object { private const val ENABLED_ALPHA = 1.0f private const val DISABLED_ALPHA = 0.4f From fb02b8a314df894945d31f1aa29138e069844f39 Mon Sep 17 00:00:00 2001 From: bawyap Date: Thu, 20 Aug 2020 14:53:26 +0530 Subject: [PATCH 7/9] FNX2-15653:Refactors check method --- .../mozilla/fenix/shortcut/CreateShortcutFragment.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt index 54ffa8539..f4c641c90 100644 --- a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt @@ -58,12 +58,14 @@ class CreateShortcutFragment : DialogFragment() { } private fun updateAddButtonEnabledState() { - val text = shortcut_text.text - add_button.isEnabled = isTextValid(text) - add_button.alpha = if (isTextValid(text)) ENABLED_ALPHA else DISABLED_ALPHA + add_button.isEnabled = isTextValid() + add_button.alpha = if (isTextValid()) ENABLED_ALPHA else DISABLED_ALPHA } - private fun isTextValid(text: Editable) = text.isNotEmpty() && !text.isBlank() + private fun isTextValid(): Boolean { + val text = shortcut_text.text + return text.isNotEmpty() && !text.isBlank() + } companion object { private const val ENABLED_ALPHA = 1.0f From 8641fa39e0a127ba3280866694c9a182ec90ff31 Mon Sep 17 00:00:00 2001 From: bawyap Date: Thu, 20 Aug 2020 14:55:26 +0530 Subject: [PATCH 8/9] FNX2-15653:Removes unused import --- .../java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt index f4c641c90..4db57861b 100644 --- a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt @@ -5,7 +5,6 @@ package org.mozilla.fenix.shortcut import android.os.Bundle -import android.text.Editable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup From 88a2273e4cb75e3d906bcaceedcd617a56658e18 Mon Sep 17 00:00:00 2001 From: bawyap Date: Fri, 21 Aug 2020 10:36:10 +0530 Subject: [PATCH 9/9] FNX2-15653:Removes empty check --- .../org/mozilla/fenix/shortcut/CreateShortcutFragment.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt index 4db57861b..836bfce84 100644 --- a/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt +++ b/app/src/main/java/org/mozilla/fenix/shortcut/CreateShortcutFragment.kt @@ -57,13 +57,9 @@ class CreateShortcutFragment : DialogFragment() { } private fun updateAddButtonEnabledState() { - add_button.isEnabled = isTextValid() - add_button.alpha = if (isTextValid()) ENABLED_ALPHA else DISABLED_ALPHA - } - - private fun isTextValid(): Boolean { val text = shortcut_text.text - return text.isNotEmpty() && !text.isBlank() + add_button.isEnabled = text.isNotBlank() + add_button.alpha = if (text.isNotBlank()) ENABLED_ALPHA else DISABLED_ALPHA } companion object {