From c39c3303912c0a9bd6a0a75dc53b0af718ac2420 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sat, 19 Jun 2021 21:18:31 +0200 Subject: [PATCH 01/13] Start working on the next version --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 30d1fade..c4abf619 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.parseus.codecinfo" minSdkVersion 16 targetSdkVersion 30 - versionCode 19 - versionName "2.2.1" + versionCode 20 + versionName "2.2.2" resConfigs "en" vectorDrawables.useSupportLibrary = true From ba0f3731094593318799ebe58fd07c4e5691d188 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sat, 19 Jun 2021 21:34:30 +0200 Subject: [PATCH 02/13] Catch possible exceptions from native methods when trying to access DRM features introduced in Android 9.0 --- .../parseus/codecinfo/data/drm/DrmUtils.kt | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt b/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt index 2a5b85c2..ac2b7127 100644 --- a/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt +++ b/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt @@ -37,23 +37,40 @@ fun getDetailedDrmInfo(context: Context, drmVendor: DrmVendor): List= 28) { - addReadableHdcpLevel(context, mediaDrm.connectedHdcpLevel, - context.getString(R.string.drm_property_hdcp_level), drmPropertyList) - addReadableHdcpLevel(context, mediaDrm.maxHdcpLevel, - context.getString(R.string.drm_property_max_hdcp_level), drmPropertyList) - - val maxSessionCount = mediaDrm.maxSessionCount.toString() - val maxSessionsEntry = drmPropertyList.find { - it.name == context.getString(R.string.drm_property_max_sessions) + val connectedHdcpLevel = try { + mediaDrm.connectedHdcpLevel + } catch (e: Exception) { + MediaDrm.HDCP_LEVEL_UNKNOWN } - if (maxSessionsEntry != null) { - val index = drmPropertyList.indexOf(maxSessionsEntry) - drmPropertyList.remove(maxSessionsEntry) - maxSessionsEntry.value = maxSessionCount - drmPropertyList.add(index, maxSessionsEntry) - } else { - drmPropertyList.add(DetailsProperty(drmPropertyList.size.toLong(), - context.getString(R.string.drm_property_max_sessions), maxSessionCount)) + addReadableHdcpLevel(context, connectedHdcpLevel, + context.getString(R.string.drm_property_hdcp_level), drmPropertyList) + + val maxHdcpLevel = try { + mediaDrm.maxHdcpLevel + } catch (e: Exception) { + MediaDrm.HDCP_LEVEL_UNKNOWN + } + addReadableHdcpLevel(context, maxHdcpLevel, + context.getString(R.string.drm_property_max_hdcp_level), drmPropertyList) + + val maxSessionCount = try { + mediaDrm.maxSessionCount + } catch (e: Exception) { + 0 + } + if (maxSessionCount > 0) { + val maxSessionsEntry = drmPropertyList.find { + it.name == context.getString(R.string.drm_property_max_sessions) + } + if (maxSessionsEntry != null) { + val index = drmPropertyList.indexOf(maxSessionsEntry) + drmPropertyList.remove(maxSessionsEntry) + maxSessionsEntry.value = maxSessionCount.toString() + drmPropertyList.add(index, maxSessionsEntry) + } else { + drmPropertyList.add(DetailsProperty(drmPropertyList.size.toLong(), + context.getString(R.string.drm_property_max_sessions), maxSessionCount.toString())) + } } } From 30aa39c887a1b57c5c61c868e2f4b90b797ae94f Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sat, 19 Jun 2021 21:50:45 +0200 Subject: [PATCH 03/13] Catch possible exceptions from native methods when trying to enumerate supported DRM schemes --- .../parseus/codecinfo/data/drm/DrmUtils.kt | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt b/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt index ac2b7127..53ed226c 100644 --- a/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt +++ b/app/src/main/java/com/parseus/codecinfo/data/drm/DrmUtils.kt @@ -16,10 +16,20 @@ fun getSimpleDrmInfoList(context: Context): List { return if (drmList.isNotEmpty()) { drmList } else { - DrmVendor.values() - .filter { MediaDrm.isCryptoSchemeSupported(it.uuid) } - .mapNotNull { it.getIfSupported(context) } - .also { drmList.addAll(it) } + val list = mutableListOf() + DrmVendor.values().forEach { + try { + // This can crash in native code if something goes wrong while querying it. + val schemeSupported = MediaDrm.isCryptoSchemeSupported(it.uuid) + if (schemeSupported) { + val drmInfo = it.getIfSupported(context) + if (drmInfo != null) { + list.add(drmInfo) + } + } + } catch (e: Exception) {} + } + list } } @@ -36,6 +46,7 @@ fun getDetailedDrmInfo(context: Context, drmVendor: DrmVendor): List= 28) { val connectedHdcpLevel = try { mediaDrm.connectedHdcpLevel From 542b8f7b43c90dac50b5b96a57ebbce906cc7f06 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Wed, 23 Jun 2021 22:34:39 +0200 Subject: [PATCH 04/13] Fixed crashing on destroying a fragment as its view is still scrolling --- .../java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt index fd521562..2d9693cd 100644 --- a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt +++ b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt @@ -51,6 +51,7 @@ class DetailsFragment : Fragment(), SearchView.OnQueryTextListener { override fun onDestroyView() { searchListenerDestroyedListener?.onSearchListenerDestroyed(this) searchListenerDestroyedListener = null + binding.itemDetailsContent.setOnScrollChangeListener(null as NestedScrollView.OnScrollChangeListener?) _binding = null super.onDestroyView() } From 30e1de6f0de5f3be4b58f0c63e887ef86d0d5ba6 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Thu, 24 Jun 2021 20:47:07 +0200 Subject: [PATCH 05/13] Updated Kotlin to 1.5.20 and Kotlin Coroutines to 1.5.0 --- app/build.gradle | 3 ++- build.gradle | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index c4abf619..40e21ab4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,7 +94,8 @@ configurations { } dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' implementation 'androidx.appcompat:appcompat:1.3.0' implementation "androidx.core:core-ktx:1.5.0" diff --git a/build.gradle b/build.gradle index f6d2f569..fc9dbe2d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.5.10' + ext.kotlin_version = '1.5.20' ext.leakCanary_version = '2.7' ext.moshi_version = '1.12.0' From a0cf4b20ceda1da9fa6b186fb6041de9263880ee Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sun, 27 Jun 2021 17:49:42 +0200 Subject: [PATCH 06/13] Added separator between category tabs and content --- app/src/mobile/res/layout/fragment_main.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/mobile/res/layout/fragment_main.xml b/app/src/mobile/res/layout/fragment_main.xml index 1156dbb7..d5f37b79 100644 --- a/app/src/mobile/res/layout/fragment_main.xml +++ b/app/src/mobile/res/layout/fragment_main.xml @@ -13,6 +13,13 @@ app:tabMode="auto" app:tabInlineLabel="true" /> + + Date: Sun, 27 Jun 2021 18:13:33 +0200 Subject: [PATCH 07/13] Load lists/details asynchronously --- .../codecinfo/ui/fragments/DetailsFragment.kt | 29 ++++++--- .../codecinfo/ui/fragments/ItemFragment.kt | 64 +++++++++++-------- .../item_details_fragment_layout.xml | 13 +++- .../layout/item_details_fragment_layout.xml | 13 +++- .../mobile/res/layout/tab_content_layout.xml | 25 ++++++-- 5 files changed, 98 insertions(+), 46 deletions(-) diff --git a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt index 2d9693cd..a4f0bd2a 100644 --- a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt +++ b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/DetailsFragment.kt @@ -11,6 +11,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.isVisible import androidx.core.widget.NestedScrollView import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.parseus.codecinfo.data.DetailsProperty @@ -26,6 +27,8 @@ import com.parseus.codecinfo.ui.expandablelist.ExpandableItemAdapter import com.parseus.codecinfo.ui.expandablelist.ExpandableItemAnimator import com.parseus.codecinfo.utils.getAttributeColor import com.parseus.codecinfo.utils.isInTwoPaneMode +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext import java.util.* class DetailsFragment : Fragment(), SearchView.OnQueryTextListener { @@ -94,18 +97,26 @@ class DetailsFragment : Fragment(), SearchView.OnQueryTextListener { } } - propertyList = when { - codecId != null && codecName != null -> - getDetailedCodecInfo(requireContext(), codecId!!, codecName!!) - drmName != null && drmUuid != null -> - //noinspection NewApi - getDetailedDrmInfo(requireContext(), DrmVendor.getFromUuid(drmUuid!!)) - else -> emptyList() + viewLifecycleOwner.lifecycleScope.launchWhenStarted { + binding.loadingProgress.isVisible = true + + propertyList = withContext(Dispatchers.IO) { + when { + codecId != null && codecName != null -> + getDetailedCodecInfo(requireContext(), codecId!!, codecName!!) + drmName != null && drmUuid != null -> + //noinspection NewApi + getDetailedDrmInfo(requireContext(), DrmVendor.getFromUuid(drmUuid!!)) + else -> emptyList() + } + } + + binding.loadingProgress.isVisible = false + showFullDetails() } - getFullDetails() } - private fun getFullDetails() { + private fun showFullDetails() { @Suppress("USELESS_CAST") (binding.fullCodecInfoName as TextView).text = codecName ?: drmName diff --git a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt index b26e2673..519ee90b 100644 --- a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt +++ b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt @@ -7,7 +7,9 @@ import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView import androidx.core.view.ViewCompat +import androidx.core.view.isVisible import androidx.fragment.app.Fragment +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.snackbar.Snackbar @@ -21,6 +23,8 @@ import com.parseus.codecinfo.databinding.TabContentLayoutBinding import com.parseus.codecinfo.ui.adapters.CodecAdapter import com.parseus.codecinfo.ui.adapters.DrmAdapter import com.parseus.codecinfo.ui.adapters.SearchListenerDestroyedListener +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext internal var emptyListInformed = false @@ -51,37 +55,45 @@ class ItemFragment : Fragment(), SearchView.OnQueryTextListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val infoType = InfoType.fromInt(requireArguments().getInt("infoType")) - val itemAdapter = if (infoType != InfoType.DRM) { - val codecSimpleInfoList = getSimpleCodecInfoList(requireContext(), - infoType == InfoType.Audio) - if (codecSimpleInfoList.isEmpty()) emptyList = true - CodecAdapter().also { - if (!emptyList) { - it.add(codecSimpleInfoList) + viewLifecycleOwner.lifecycleScope.launchWhenStarted { + binding.loadingProgress.isVisible = true + + val infoType = InfoType.fromInt(requireArguments().getInt("infoType")) + val itemAdapter = withContext(Dispatchers.IO) { + if (infoType != InfoType.DRM) { + val codecSimpleInfoList = getSimpleCodecInfoList(requireContext(), + infoType == InfoType.Audio) + if (codecSimpleInfoList.isEmpty()) emptyList = true + CodecAdapter().also { + if (!emptyList) { + it.add(codecSimpleInfoList) + } + } + } else { + val drmSimpleInfoList = getSimpleDrmInfoList(requireContext()) + if (drmSimpleInfoList.isEmpty()) emptyList = true + DrmAdapter(drmSimpleInfoList) } } - } else { - val drmSimpleInfoList = getSimpleDrmInfoList(requireContext()) - if (drmSimpleInfoList.isEmpty()) emptyList = true - DrmAdapter(drmSimpleInfoList) - } - if (!emptyList) { - binding.simpleCodecListView.apply { - layoutManager = LinearLayoutManager(context) - adapter = itemAdapter - ViewCompat.setNestedScrollingEnabled(this, false) - addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL)) - } - } else if (!emptyListInformed) { - // Do not spam the user with multiple snackbars. - emptyListInformed = true - val errorId = if (InfoType.currentInfoType != InfoType.DRM) - R.string.unable_to_get_codec_info_error + binding.loadingProgress.isVisible = false + + if (!emptyList) { + binding.simpleCodecListView.apply { + layoutManager = LinearLayoutManager(context) + adapter = itemAdapter + ViewCompat.setNestedScrollingEnabled(this, false) + addItemDecoration(DividerItemDecoration(context, DividerItemDecoration.VERTICAL)) + } + } else if (!emptyListInformed) { + // Do not spam the user with multiple snackbars. + emptyListInformed = true + val errorId = if (InfoType.currentInfoType != InfoType.DRM) + R.string.unable_to_get_codec_info_error else R.string.unable_to_get_drm_info_error - Snackbar.make(requireActivity().findViewById(android.R.id.content), + Snackbar.make(requireActivity().findViewById(android.R.id.content), errorId, Snackbar.LENGTH_LONG).show() + } } } diff --git a/app/src/mobile/res/layout-v21/item_details_fragment_layout.xml b/app/src/mobile/res/layout-v21/item_details_fragment_layout.xml index eeaecdf6..df3a750b 100644 --- a/app/src/mobile/res/layout-v21/item_details_fragment_layout.xml +++ b/app/src/mobile/res/layout-v21/item_details_fragment_layout.xml @@ -1,5 +1,5 @@ - @@ -55,4 +57,11 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/item_details_fragment_layout.xml b/app/src/mobile/res/layout/item_details_fragment_layout.xml index 9e6a32d1..cf6f59f9 100644 --- a/app/src/mobile/res/layout/item_details_fragment_layout.xml +++ b/app/src/mobile/res/layout/item_details_fragment_layout.xml @@ -1,5 +1,5 @@ - @@ -55,4 +57,11 @@ - \ No newline at end of file + + + \ No newline at end of file diff --git a/app/src/mobile/res/layout/tab_content_layout.xml b/app/src/mobile/res/layout/tab_content_layout.xml index c1672964..2dfef22e 100644 --- a/app/src/mobile/res/layout/tab_content_layout.xml +++ b/app/src/mobile/res/layout/tab_content_layout.xml @@ -1,11 +1,22 @@ - + android:layout_height="match_parent"> - \ No newline at end of file + + + + + \ No newline at end of file From de8b2040a44c8f3836275d107634c4b8254ff478 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sun, 27 Jun 2021 18:16:11 +0200 Subject: [PATCH 08/13] Update changelog and fix version for 2.2.1 --- app/src/main/assets/changelog.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 2c151acf..681cd0da 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -1,7 +1,10 @@ -

Version 2.3.0

+

Version 2.2.2

+

Bugfixes.

+ +

Version 2.2.1

UI improvements for bigger tablets and Chromebooks.

App should now be resizable if Samsung DeX is enabled.

Bugfixes and general improvements.

From c4a6988375e0a5482fc13cc5b9bfee1ef3a22e7a Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Mon, 28 Jun 2021 21:34:22 +0200 Subject: [PATCH 09/13] Fix a memory leak when destroying a list item fragment --- .../com/parseus/codecinfo/ui/fragments/ItemFragment.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt index 519ee90b..8113eea6 100644 --- a/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt +++ b/app/src/mobile/java/com/parseus/codecinfo/ui/fragments/ItemFragment.kt @@ -20,6 +20,7 @@ import com.parseus.codecinfo.data.codecinfo.getSimpleCodecInfoList import com.parseus.codecinfo.data.drm.DrmSimpleInfo import com.parseus.codecinfo.data.drm.getSimpleDrmInfoList import com.parseus.codecinfo.databinding.TabContentLayoutBinding +import com.parseus.codecinfo.ui.MainActivity import com.parseus.codecinfo.ui.adapters.CodecAdapter import com.parseus.codecinfo.ui.adapters.DrmAdapter import com.parseus.codecinfo.ui.adapters.SearchListenerDestroyedListener @@ -46,6 +47,12 @@ class ItemFragment : Fragment(), SearchView.OnQueryTextListener { override fun onDestroyView() { searchListenerDestroyedListener?.onSearchListenerDestroyed(this) searchListenerDestroyedListener = null + + if (activity as? MainActivity != null) { + val searchListenerList = (activity as MainActivity).searchListeners + searchListenerList.remove(this) + } + _binding = null super.onDestroyView() From 39b5113b2a5f3d574d247d450c6a1b42c0560881 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Wed, 30 Jun 2021 20:10:33 +0200 Subject: [PATCH 10/13] Updated Android Gradle plugin to 4.2.2 and core-ktx to 1.6.0 --- app/build.gradle | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 40e21ab4..eaf16807 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,7 +98,7 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' implementation 'androidx.appcompat:appcompat:1.3.0' - implementation "androidx.core:core-ktx:1.5.0" + implementation "androidx.core:core-ktx:1.6.0" implementation 'androidx.preference:preference-ktx:1.1.1' implementation "com.squareup.leakcanary:plumber-android:$leakCanary_version" diff --git a/build.gradle b/build.gradle index fc9dbe2d..a7d3998c 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.2.1' + classpath 'com.android.tools.build:gradle:4.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From c823529380b9b9441138b2a145823e947b659188 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Wed, 30 Jun 2021 20:16:02 +0200 Subject: [PATCH 11/13] Updated alpha for separators to match the default color value for material dividers --- app/src/mobile/res/layout-w511dp/activity_main.xml | 2 +- app/src/mobile/res/layout/fragment_main.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/mobile/res/layout-w511dp/activity_main.xml b/app/src/mobile/res/layout-w511dp/activity_main.xml index 45fa4e69..b6814322 100644 --- a/app/src/mobile/res/layout-w511dp/activity_main.xml +++ b/app/src/mobile/res/layout-w511dp/activity_main.xml @@ -48,7 +48,7 @@ android:layout_height="0dp" android:layout_gravity="center_horizontal" android:layout_centerHorizontal="true" - android:alpha="0.1" + android:alpha="0.12" android:background="?attr/colorOnSurface" android:importantForAccessibility="no" app:layout_constraintTop_toBottomOf="@id/appBar" diff --git a/app/src/mobile/res/layout/fragment_main.xml b/app/src/mobile/res/layout/fragment_main.xml index d5f37b79..c00f285d 100644 --- a/app/src/mobile/res/layout/fragment_main.xml +++ b/app/src/mobile/res/layout/fragment_main.xml @@ -16,7 +16,7 @@ From fdc462a5b2236b1f2423cf2dc773e656d521b135 Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Sat, 3 Jul 2021 16:30:44 +0200 Subject: [PATCH 12/13] Material Components update --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index eaf16807..78d8db58 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,7 +115,7 @@ dependencies { mobileImplementation 'androidx.constraintlayout:constraintlayout:2.0.4' mobileImplementation 'com.github.ditacristianionut:AppInfoBadge:1.3' - mobileImplementation 'com.google.android.material:material:1.4.0-rc01' + mobileImplementation 'com.google.android.material:material:1.4.0' nonFreeMobileImplementation fileTree(include: ['*.jar'], dir: 'libs') nonFreeMobileImplementation 'com.google.android.play:core:1.10.0' From 2f8c664323b24ee58598b68d5046184118aea09a Mon Sep 17 00:00:00 2001 From: Krzysztof Nawrot Date: Tue, 6 Jul 2021 19:28:55 +0200 Subject: [PATCH 13/13] Update changelog --- app/src/main/assets/changelog.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/changelog.html b/app/src/main/assets/changelog.html index 681cd0da..195973de 100644 --- a/app/src/main/assets/changelog.html +++ b/app/src/main/assets/changelog.html @@ -2,7 +2,7 @@

Version 2.2.2

-

Bugfixes.

+

Bugfixes and general improvements.

Version 2.2.1

UI improvements for bigger tablets and Chromebooks.