From 6655ad6c69b5f36436cd8a463d25260a5f809377 Mon Sep 17 00:00:00 2001 From: MohitMali Date: Mon, 7 Aug 2023 17:28:49 +0530 Subject: [PATCH] Refactored code to remove lint errors * Now our minimum SDK version is 24 and we are using some conditions placed on behalf of this api level which are unused now, so we have removed those conditions. * Removed `CompatV21` file as now it is unused. * Renamed `CompatV23` to `CompatV24` and refactored the code to support our new minimum api level. * Refactored `NetworkUtilsTest` to support api level 24. --- .../fileselectView/effects/ShareFiles.kt | 16 ++--- .../org/kiwix/kiwixmobile/core/CoreApp.kt | 8 +-- .../kiwix/kiwixmobile/core/compat/Compat.kt | 2 +- .../kiwixmobile/core/compat/CompatHelper.kt | 3 +- .../kiwixmobile/core/compat/CompatV21.kt | 60 ------------------- .../compat/{CompatV23.kt => CompatV24.kt} | 13 ++-- .../kiwixmobile/core/compat/CompatV33.kt | 6 +- .../fetch/FetchDownloadNotificationManager.kt | 11 +--- .../core/extensions/ContextExtensions.kt | 8 +-- .../core/main/CoreReaderFragment.kt | 21 +++---- .../kiwixmobile/core/main/CoreSearchWidget.kt | 22 ++----- .../effects/SearchArgumentProcessing.kt | 3 - .../kiwixmobile/core/utils/StyleUtils.kt | 6 +- .../core/utils/NetworkUtilsTest.kt | 60 +++---------------- lintConfig.xml | 1 + 15 files changed, 41 insertions(+), 199 deletions(-) delete mode 100644 core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV21.kt rename core/src/main/java/org/kiwix/kiwixmobile/core/compat/{CompatV23.kt => CompatV24.kt} (86%) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/fileselectView/effects/ShareFiles.kt b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/fileselectView/effects/ShareFiles.kt index 614e3f1fb..33f0e9546 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zimManager/fileselectView/effects/ShareFiles.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/zimManager/fileselectView/effects/ShareFiles.kt @@ -18,8 +18,6 @@ package org.kiwix.kiwixmobile.zimManager.fileselectView.effects -import android.net.Uri -import android.os.Build import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import androidx.core.os.bundleOf @@ -33,15 +31,11 @@ data class ShareFiles(private val selectedBooks: List) : SideEffect { override fun invokeWith(activity: AppCompatActivity) { val selectedFileContentURIs = selectedBooks.mapNotNull { - if (Build.VERSION.SDK_INT >= 24) { - FileProvider.getUriForFile( - activity, - activity.packageName + ".fileprovider", - it.file - ) - } else { - Uri.fromFile(it.file) - } + FileProvider.getUriForFile( + activity, + activity.packageName + ".fileprovider", + it.file + ) } activity.navigate( R.id.localFileTransferFragment, diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt index f3d5d2fa2..130387f55 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/CoreApp.kt @@ -90,9 +90,7 @@ abstract class CoreApp : Application() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy( StrictMode.ThreadPolicy.Builder().apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - detectResourceMismatches() - } + detectResourceMismatches() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { detectUnbufferedIo() } @@ -106,9 +104,7 @@ abstract class CoreApp : Application() { ) StrictMode.setVmPolicy( VmPolicy.Builder().apply { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - detectCleartextNetwork() - } + detectCleartextNetwork() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { detectContentUriWithoutPermission() } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/Compat.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/Compat.kt index 39d998e43..bf7464354 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/Compat.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/Compat.kt @@ -32,7 +32,7 @@ import android.net.ConnectivityManager * * * Each implementation ends with a `V` suffix, identifying the minimum API version on which this implementation - * can be used. For example, see [CompatV21]. + * can be used. For example, see [CompatV24]. * * * Each implementation `CompatVn` should extend the implementation `CompatVm` for the greatest m= Build.VERSION_CODES.TIRAMISU -> CompatV33() - sdkVersion >= Build.VERSION_CODES.M -> CompatV23() - else -> CompatV21() + else -> CompatV24() } companion object { diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV21.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV21.kt deleted file mode 100644 index 180b5f661..000000000 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV21.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Kiwix Android - * Copyright (c) 2023 Kiwix - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ -@file:Suppress("DEPRECATION") - -package org.kiwix.kiwixmobile.core.compat - -import android.content.Intent -import android.content.pm.PackageInfo -import android.content.pm.PackageManager -import android.content.pm.ResolveInfo -import android.net.ConnectivityManager -import android.net.ConnectivityManager.TYPE_WIFI -import android.net.NetworkInfo.State.CONNECTED - -open class CompatV21 : Compat { - override fun queryIntentActivities( - packageManager: PackageManager, - intent: Intent, - flags: ResolveInfoFlagsCompat - ): List = packageManager.queryIntentActivities(intent, flags.value.toInt()) - - override fun getPackageInformation( - packageName: String, - packageManager: PackageManager, - flag: Int - ): PackageInfo = packageManager.getPackageInfo(packageName, 0) - - /** - * Checks if the device has a network connection with internet access. - * - * @param connectivity The ConnectivityManager instance. - * @return True if a network connection with internet access is available, false otherwise. - */ - override fun isNetworkAvailable(connectivity: ConnectivityManager): Boolean = - connectivity.allNetworkInfo.any { it.state == CONNECTED } - - /** - * Checks if the device is connected to a Wi-Fi network. - * - * @param connectivity The ConnectivityManager instance. - * @return True if connected to a Wi-Fi network, false otherwise. - */ - override fun isWifi(connectivity: ConnectivityManager): Boolean = - connectivity.getNetworkInfo(TYPE_WIFI)?.isConnected == true -} diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV23.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV24.kt similarity index 86% rename from core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV23.kt rename to core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV24.kt index d3327dbfe..566c0d723 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV23.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV24.kt @@ -15,10 +15,10 @@ * along with this program. If not, see . * */ +@file:Suppress("DEPRECATION") package org.kiwix.kiwixmobile.core.compat -import android.annotation.TargetApi import android.content.Intent import android.content.pm.PackageInfo import android.content.pm.PackageManager @@ -27,24 +27,19 @@ import android.net.ConnectivityManager import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET import android.net.NetworkCapabilities.TRANSPORT_WIFI -const val API_23 = 23 - -@TargetApi(API_23) -open class CompatV23 : Compat { - private val compatV21 = CompatV21() +open class CompatV24 : Compat { override fun queryIntentActivities( packageManager: PackageManager, intent: Intent, flags: ResolveInfoFlagsCompat - ): List = - compatV21.queryIntentActivities(packageManager, intent, flags) + ): List = packageManager.queryIntentActivities(intent, flags.value.toInt()) override fun getPackageInformation( packageName: String, packageManager: PackageManager, flag: Int - ): PackageInfo = compatV21.getPackageInformation(packageName, packageManager, flag) + ): PackageInfo = packageManager.getPackageInfo(packageName, 0) /** * Checks if the device has a network connection with internet access. diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV33.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV33.kt index 1de26339e..ddfd15c4d 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV33.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/compat/CompatV33.kt @@ -30,7 +30,7 @@ const val API_33 = 33 @TargetApi(API_33) open class CompatV33 : Compat { - private val compatV23 = CompatV23() + private val compatV24 = CompatV24() override fun queryIntentActivities( packageManager: PackageManager, intent: Intent, @@ -48,8 +48,8 @@ open class CompatV33 : Compat { packageManager.getPackageInfo(packageName, PackageInfoFlags.of(flag.toLong())) override fun isNetworkAvailable(connectivity: ConnectivityManager): Boolean = - compatV23.isNetworkAvailable(connectivity) + compatV24.isNetworkAvailable(connectivity) override fun isWifi(connectivity: ConnectivityManager): Boolean = - compatV23.isWifi(connectivity) + compatV24.isWifi(connectivity) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt index da5e9b7b7..5249b58cc 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/downloader/fetch/FetchDownloadNotificationManager.kt @@ -142,11 +142,7 @@ class FetchDownloadNotificationManager(private val context: Context) : else -> ACTION_TYPE_INVALID } intent.putExtra(EXTRA_ACTION_TYPE, action) - val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT - } else { - PendingIntent.FLAG_UPDATE_CURRENT - } + val flags = PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT return PendingIntent.getBroadcast( context, downloadNotification.notificationId + action, @@ -166,11 +162,8 @@ class FetchDownloadNotificationManager(private val context: Context) : addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) putExtra(DOWNLOAD_NOTIFICATION_TITLE, downloadNotification.title) } - val pendingIntent = if (Build.VERSION.SDK_INT >= VERSION_CODES.M) { + val pendingIntent = getActivity(context, 0, internal, FLAG_IMMUTABLE or FLAG_UPDATE_CURRENT) - } else { - getActivity(context, 0, internal, FLAG_UPDATE_CURRENT) - } notificationBuilder.setContentIntent(pendingIntent) notificationBuilder.setAutoCancel(true) } diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/ContextExtensions.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/ContextExtensions.kt index 0ac7f5bd9..cae26c73c 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/ContextExtensions.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/extensions/ContextExtensions.kt @@ -21,8 +21,6 @@ package org.kiwix.kiwixmobile.core.extensions import android.content.Context import android.content.Intent import android.content.IntentFilter -import android.os.Build.VERSION -import android.os.Build.VERSION_CODES import android.util.TypedValue import android.widget.Toast import androidx.annotation.AttrRes @@ -53,11 +51,7 @@ fun Context.registerReceiver(baseBroadcastReceiver: BaseBroadcastReceiver): Inte registerReceiver(baseBroadcastReceiver, IntentFilter(baseBroadcastReceiver.action)) val Context.locale: Locale - get() = - if (VERSION.SDK_INT >= VERSION_CODES.N) resources.configuration.locales.get(0) - else - @Suppress("DEPRECATION") - resources.configuration.locale + get() = resources.configuration.locales.get(0) fun Context.getAttribute(@AttrRes attributeRes: Int) = with(TypedValue()) { if (theme.resolveAttribute(attributeRes, this, true)) diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt index 690623a28..870eb6004 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreReaderFragment.kt @@ -1315,16 +1315,12 @@ abstract class CoreReaderFragment : if (sharedPreferenceUtil?.isPlayStoreBuildWithAndroid11OrAbove() == false && Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU ) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // For Marshmallow & higher API levels - if (requireActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED - ) { - isPermissionGranted = true - } else { - storagePermissionForNotesLauncher?.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) - } - } else { // For Android versions below Marshmallow 6.0 (API 23) - isPermissionGranted = true // As already requested at install time + if (requireActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED + ) { + isPermissionGranted = true + } else { + storagePermissionForNotesLauncher?.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } } else { isPermissionGranted = true @@ -1661,10 +1657,7 @@ abstract class CoreReaderFragment : } private fun goToSearchWithText(intent: Intent) { - val searchString = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) - intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT) - else "" + val searchString = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT) openSearch( searchString, isOpenedFromTabView = false, diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreSearchWidget.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreSearchWidget.kt index 8d886067f..edf42b825 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreSearchWidget.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/main/CoreSearchWidget.kt @@ -23,7 +23,6 @@ import android.appwidget.AppWidgetManager import android.appwidget.AppWidgetProvider import android.content.Context import android.content.Intent -import android.os.Build import android.widget.RemoteViews import org.kiwix.kiwixmobile.core.R import kotlin.reflect.KClass @@ -50,21 +49,12 @@ abstract class CoreSearchWidget : AppWidgetProvider() { @SuppressLint("UnspecifiedImmutableFlag") private fun pendingIntent(context: Context, action: String) = - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - PendingIntent.getActivity( - context, - (System.currentTimeMillis() % Int.MAX_VALUE).toInt(), - Intent(context, activityKClass.java).setAction(action), - 0 or PendingIntent.FLAG_IMMUTABLE - ) - } else { - PendingIntent.getActivity( - context, - (System.currentTimeMillis() % Int.MAX_VALUE).toInt(), - Intent(context, activityKClass.java).setAction(action), - 0 - ) - } + PendingIntent.getActivity( + context, + (System.currentTimeMillis() % Int.MAX_VALUE).toInt(), + Intent(context, activityKClass.java).setAction(action), + 0 or PendingIntent.FLAG_IMMUTABLE + ) companion object { const val TEXT_CLICKED = "KiwixSearchWidget.TEXT_CLICKED" diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchArgumentProcessing.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchArgumentProcessing.kt index 5a3f49e7d..e44adb883 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchArgumentProcessing.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/effects/SearchArgumentProcessing.kt @@ -18,8 +18,6 @@ package org.kiwix.kiwixmobile.core.search.viewmodel.effects -import android.annotation.TargetApi -import android.os.Build.VERSION_CODES import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import kotlinx.coroutines.channels.Channel @@ -38,7 +36,6 @@ data class SearchArgumentProcessing( private val bundle: Bundle?, private val actions: Channel ) : SideEffect { - @TargetApi(VERSION_CODES.M) override fun invokeWith(activity: AppCompatActivity) { bundle?.let { actions.trySend( diff --git a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/StyleUtils.kt b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/StyleUtils.kt index 41d026350..b37c6c1ac 100644 --- a/core/src/main/java/org/kiwix/kiwixmobile/core/utils/StyleUtils.kt +++ b/core/src/main/java/org/kiwix/kiwixmobile/core/utils/StyleUtils.kt @@ -18,8 +18,6 @@ package org.kiwix.kiwixmobile.core.utils import android.content.Context -import android.os.Build.VERSION -import android.os.Build.VERSION_CODES import android.text.Html import android.text.Spanned import android.util.AttributeSet @@ -43,14 +41,12 @@ object StyleUtils { return Xml.asAttributeSet(parser) } - @Suppress("DEPRECATION") @JvmStatic fun String?.fromHtml(): Spanned { return (this ?: "").let { - if (VERSION.SDK_INT >= VERSION_CODES.N) Html.fromHtml( + Html.fromHtml( this, Html.FROM_HTML_MODE_LEGACY ) - else Html.fromHtml(this) } } } diff --git a/core/src/test/java/org/kiwix/kiwixmobile/core/utils/NetworkUtilsTest.kt b/core/src/test/java/org/kiwix/kiwixmobile/core/utils/NetworkUtilsTest.kt index fd3326a93..3b5267e93 100644 --- a/core/src/test/java/org/kiwix/kiwixmobile/core/utils/NetworkUtilsTest.kt +++ b/core/src/test/java/org/kiwix/kiwixmobile/core/utils/NetworkUtilsTest.kt @@ -20,12 +20,10 @@ package org.kiwix.kiwixmobile.core.utils import android.content.Context import android.net.ConnectivityManager -import android.net.ConnectivityManager.TYPE_WIFI import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET import android.net.NetworkCapabilities.TRANSPORT_WIFI -import android.net.NetworkInfo import io.mockk.every import io.mockk.mockk import org.junit.Assert.assertEquals @@ -33,8 +31,7 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.jupiter.api.Test import org.kiwix.kiwixmobile.core.R -import org.kiwix.kiwixmobile.core.compat.CompatV21 -import org.kiwix.kiwixmobile.core.compat.CompatV23 +import org.kiwix.kiwixmobile.core.compat.CompatV24 import java.util.regex.Pattern class NetworkUtilsTest { @@ -43,26 +40,10 @@ class NetworkUtilsTest { private val connectivity: ConnectivityManager = mockk() private val networkCapabilities: NetworkCapabilities = mockk() - @Suppress("Deprecation") @Test - fun testNetworkAvailability_CompatV21() { + fun testNetworkAvailability_CompatV24() { every { context.getSystemService(Context.CONNECTIVITY_SERVICE) } returns connectivity - val compatV21 = CompatV21() - val networkInfo: NetworkInfo = mockk() - - every { connectivity.allNetworkInfo } returns arrayOf(networkInfo) - every { networkInfo.state } returns NetworkInfo.State.CONNECTED - - assertTrue(compatV21.isNetworkAvailable(connectivity)) - - every { networkInfo.state } returns NetworkInfo.State.DISCONNECTED - assertFalse(compatV21.isNetworkAvailable(connectivity)) - } - - @Test - fun testNetworkAvailability_CompatV23() { - every { context.getSystemService(Context.CONNECTIVITY_SERVICE) } returns connectivity - val compatV23 = CompatV23() + val compatV23 = CompatV24() val network: Network = mockk() every { connectivity.activeNetwork } returns network @@ -74,25 +55,9 @@ class NetworkUtilsTest { assertFalse(compatV23.isNetworkAvailable(connectivity)) } - @Suppress("Deprecation") @Test - fun test_isWifi_CompatV21() { - val compatV21 = CompatV21() - val networkInfo: NetworkInfo = mockk() - - every { connectivity.getNetworkInfo(TYPE_WIFI) } returns networkInfo - every { networkInfo.type } returns ConnectivityManager.TYPE_WIFI - every { networkInfo.isConnected } returns true - - assertTrue(compatV21.isWifi(connectivity)) - - every { networkInfo.isConnected } returns false - assertFalse(compatV21.isWifi(connectivity)) - } - - @Test - fun test_isWifi_CompatV23() { - val compatV23 = CompatV23() + fun test_isWifi_CompatV24() { + val compatV23 = CompatV24() val network: Network = mockk() every { connectivity.activeNetwork } returns network @@ -104,21 +69,10 @@ class NetworkUtilsTest { assertFalse(compatV23.isWifi(connectivity)) } - @Suppress("Deprecation") @Test - fun testNetworkAvailability_NoNetwork_CompatV21() { + fun testNetworkAvailability_NoNetwork_CompatV24() { every { context.getSystemService(Context.CONNECTIVITY_SERVICE) } returns connectivity - val compatV21 = CompatV21() - - every { connectivity.allNetworkInfo } returns arrayOf() - - assertFalse(compatV21.isNetworkAvailable(connectivity)) - } - - @Test - fun testNetworkAvailability_NoNetwork_CompatV23() { - every { context.getSystemService(Context.CONNECTIVITY_SERVICE) } returns connectivity - val compatV23 = CompatV23() + val compatV23 = CompatV24() val network: Network = mockk() every { connectivity.activeNetwork } returns network diff --git a/lintConfig.xml b/lintConfig.xml index ab038e334..3266191e3 100644 --- a/lintConfig.xml +++ b/lintConfig.xml @@ -46,4 +46,5 @@ +