diff --git a/app/build.gradle b/app/build.gradle index e49d4cc8d..1f98c5030 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,6 +69,10 @@ android { encoding 'utf-8' } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + // Required and used only by groupie androidExtensions { experimental = true @@ -184,6 +188,7 @@ dependencies { implementation "androidx.recyclerview:recyclerview:1.1.0" implementation "androidx.cardview:cardview:1.0.0" implementation "androidx.constraintlayout:constraintlayout:1.1.3" + implementation 'androidx.core:core-ktx:1.3.1' implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}" implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}" diff --git a/app/src/main/java/org/schabi/newpipe/App.java b/app/src/main/java/org/schabi/newpipe/App.java index 962679cd0..4b2a858c7 100644 --- a/app/src/main/java/org/schabi/newpipe/App.java +++ b/app/src/main/java/org/schabi/newpipe/App.java @@ -1,6 +1,5 @@ package org.schabi.newpipe; -import android.annotation.TargetApi; import android.app.Application; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -33,6 +32,7 @@ import org.schabi.newpipe.util.StateSaver; import java.io.IOException; import java.io.InterruptedIOException; import java.net.SocketException; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -90,7 +90,7 @@ public class App extends Application { Localization.init(getApplicationContext()); StateSaver.init(this); - initNotificationChannel(); + initNotificationChannels(); ServiceHelper.initServices(this); @@ -219,49 +219,31 @@ public class App extends Application { } } - public void initNotificationChannel() { + private void initNotificationChannels() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) { return; } - final String id = getString(R.string.notification_channel_id); - final CharSequence name = getString(R.string.notification_channel_name); - final String description = getString(R.string.notification_channel_description); + String id = getString(R.string.notification_channel_id); + String name = getString(R.string.notification_channel_name); + String description = getString(R.string.notification_channel_description); // Keep this below DEFAULT to avoid making noise on every notification update final int importance = NotificationManager.IMPORTANCE_LOW; - final NotificationChannel mChannel = new NotificationChannel(id, name, importance); - mChannel.setDescription(description); + final NotificationChannel mainChannel = new NotificationChannel(id, name, importance); + mainChannel.setDescription(description); - final NotificationManager mNotificationManager = - (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - mNotificationManager.createNotificationChannel(mChannel); + id = getString(R.string.app_update_notification_channel_id); + name = getString(R.string.app_update_notification_channel_name); + description = getString(R.string.app_update_notification_channel_description); - setUpUpdateNotificationChannel(importance); - } + final NotificationChannel appUpdateChannel = new NotificationChannel(id, name, importance); + appUpdateChannel.setDescription(description); - /** - * Set up notification channel for app update. - * - * @param importance - */ - @TargetApi(Build.VERSION_CODES.O) - private void setUpUpdateNotificationChannel(final int importance) { - final String appUpdateId - = getString(R.string.app_update_notification_channel_id); - final CharSequence appUpdateName - = getString(R.string.app_update_notification_channel_name); - final String appUpdateDescription - = getString(R.string.app_update_notification_channel_description); - - final NotificationChannel appUpdateChannel - = new NotificationChannel(appUpdateId, appUpdateName, importance); - appUpdateChannel.setDescription(appUpdateDescription); - - final NotificationManager appUpdateNotificationManager - = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - appUpdateNotificationManager.createNotificationChannel(appUpdateChannel); + final NotificationManager notificationManager = getSystemService(NotificationManager.class); + notificationManager.createNotificationChannels(Arrays.asList(mainChannel, + appUpdateChannel)); } protected boolean isDisposedRxExceptionsReported() { diff --git a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java index d91230765..10a6a73d7 100644 --- a/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java +++ b/app/src/main/java/org/schabi/newpipe/CheckForNewAppVersionTask.java @@ -2,7 +2,6 @@ package org.schabi.newpipe; import android.app.Application; import android.app.PendingIntent; -import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; @@ -11,11 +10,12 @@ import android.content.pm.Signature; import android.net.ConnectivityManager; import android.net.Uri; import android.os.AsyncTask; -import androidx.preference.PreferenceManager; import android.util.Log; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; +import androidx.preference.PreferenceManager; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; @@ -213,8 +213,8 @@ public class CheckForNewAppVersionTask extends AsyncTask { } private boolean isConnected() { - final ConnectivityManager cm = - (ConnectivityManager) APP.getSystemService(Context.CONNECTIVITY_SERVICE); + final ConnectivityManager cm = ContextCompat.getSystemService(APP, + ConnectivityManager.class); return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 64eaf3a3d..c402565fd 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -5,8 +5,6 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import androidx.core.text.HtmlCompat; -import androidx.preference.PreferenceManager; import android.text.Editable; import android.text.Html; import android.text.TextUtils; @@ -30,6 +28,9 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.TooltipCompat; +import androidx.core.content.ContextCompat; +import androidx.core.text.HtmlCompat; +import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -49,9 +50,9 @@ import org.schabi.newpipe.fragments.list.BaseListFragment; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.report.ErrorActivity; import org.schabi.newpipe.report.UserAction; -import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.AnimationUtils; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExceptionUtils; import org.schabi.newpipe.util.ExtractorHelper; import org.schabi.newpipe.util.NavigationHelper; @@ -639,8 +640,8 @@ public class SearchFragment extends BaseListFragment()!! } private fun showKeyboardSearch() { diff --git a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java index c7fbb444b..e8554e5ac 100644 --- a/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java +++ b/app/src/main/java/org/schabi/newpipe/player/MainPlayer.java @@ -30,6 +30,8 @@ import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import androidx.core.content.ContextCompat; + import org.schabi.newpipe.R; import org.schabi.newpipe.util.ThemeHelper; @@ -91,7 +93,7 @@ public final class MainPlayer extends Service { Log.d(TAG, "onCreate() called"); } assureCorrectAppLanguage(this); - windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + windowManager = ContextCompat.getSystemService(this, WindowManager.class); ThemeHelper.setTheme(this); createView(); diff --git a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java index 997069215..97007f0f6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java +++ b/app/src/main/java/org/schabi/newpipe/player/VideoPlayerImpl.java @@ -58,6 +58,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.content.ContextCompat; import androidx.core.view.DisplayCutoutCompat; import androidx.core.view.ViewCompat; import androidx.preference.PreferenceManager; @@ -105,7 +106,6 @@ import org.schabi.newpipe.util.ShareUtils; import java.util.List; -import static android.content.Context.WINDOW_SERVICE; import static org.schabi.newpipe.player.MainPlayer.ACTION_CLOSE; import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_FORWARD; import static org.schabi.newpipe.player.MainPlayer.ACTION_FAST_REWIND; @@ -269,7 +269,7 @@ public class VideoPlayerImpl extends VideoPlayer super("MainPlayer" + TAG, service); this.service = service; this.shouldUpdateOnProgress = true; - this.windowManager = (WindowManager) service.getSystemService(WINDOW_SERVICE); + this.windowManager = ContextCompat.getSystemService(service, WindowManager.class); this.defaultPreferences = PreferenceManager.getDefaultSharedPreferences(service); this.resolver = new AudioPlaybackResolver(context, dataSource); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index f434b0621..a931c46bd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -12,6 +12,7 @@ import android.os.Build; import android.util.Log; import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.analytics.AnalyticsListener; @@ -39,7 +40,7 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, An @NonNull final SimpleExoPlayer player) { this.player = player; this.context = context; - this.audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); + this.audioManager = ContextCompat.getSystemService(context, AudioManager.class); player.addAnalyticsListener(this); if (SHOULD_BUILD_FOCUS_REQUEST) { diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java b/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java index 6d0cf8e85..270156fe9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/LockManager.java @@ -5,8 +5,7 @@ import android.net.wifi.WifiManager; import android.os.PowerManager; import android.util.Log; -import static android.content.Context.POWER_SERVICE; -import static android.content.Context.WIFI_SERVICE; +import androidx.core.content.ContextCompat; public class LockManager { private final String TAG = "LockManager@" + hashCode(); @@ -18,10 +17,9 @@ public class LockManager { private WifiManager.WifiLock wifiLock; public LockManager(final Context context) { - powerManager = ((PowerManager) context.getApplicationContext() - .getSystemService(POWER_SERVICE)); - wifiManager = ((WifiManager) context.getApplicationContext() - .getSystemService(WIFI_SERVICE)); + powerManager = ContextCompat.getSystemService(context.getApplicationContext(), + PowerManager.class); + wifiManager = ContextCompat.getSystemService(context, WifiManager.class); } public void acquireWifiAndCpu() { diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index f9a8dfa8f..1d1d056a8 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -8,6 +8,7 @@ import android.view.accessibility.CaptioningManager; import androidx.annotation.IntDef; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import com.google.android.exoplayer2.SeekParameters; @@ -312,8 +313,8 @@ public final class PlayerHelper { @NonNull public static CaptionStyleCompat getCaptionStyle(@NonNull final Context context) { - final CaptioningManager captioningManager = (CaptioningManager) - context.getSystemService(Context.CAPTIONING_SERVICE); + final CaptioningManager captioningManager = ContextCompat.getSystemService(context, + CaptioningManager.class); if (captioningManager == null || !captioningManager.isEnabled()) { return CaptionStyleCompat.DEFAULT; } @@ -336,8 +337,8 @@ public final class PlayerHelper { * @return caption scaling */ public static float getCaptionScale(@NonNull final Context context) { - final CaptioningManager captioningManager - = (CaptioningManager) context.getSystemService(Context.CAPTIONING_SERVICE); + final CaptioningManager captioningManager = ContextCompat.getSystemService(context, + CaptioningManager.class); if (captioningManager == null || !captioningManager.isEnabled()) { return 1.0f; } diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index d852c2296..1afedcaef 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -9,10 +9,9 @@ import android.os.Build; import android.view.KeyEvent; import androidx.annotation.NonNull; -import org.schabi.newpipe.App; +import androidx.core.content.ContextCompat; -import static android.content.Context.BATTERY_SERVICE; -import static android.content.Context.UI_MODE_SERVICE; +import org.schabi.newpipe.App; public final class DeviceUtils { @@ -30,15 +29,14 @@ public final class DeviceUtils { final PackageManager pm = App.getApp().getPackageManager(); // from doc: https://developer.android.com/training/tv/start/hardware.html#runtime-check - boolean isTv = ((UiModeManager) context.getSystemService(UI_MODE_SERVICE)) + boolean isTv = ContextCompat.getSystemService(context, UiModeManager.class) .getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION || pm.hasSystemFeature(AMAZON_FEATURE_FIRE_TV) || pm.hasSystemFeature(PackageManager.FEATURE_TELEVISION); // from https://stackoverflow.com/a/58932366 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - final boolean isBatteryAbsent - = ((BatteryManager) context.getSystemService(BATTERY_SERVICE)) + final boolean isBatteryAbsent = context.getSystemService(BatteryManager.class) .getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) == 0; isTv = isTv || (isBatteryAbsent && !pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN) diff --git a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java index 7a428a05d..e26c00fb2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ListHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ListHelper.java @@ -3,6 +3,8 @@ package org.schabi.newpipe.util; import android.content.Context; import android.content.SharedPreferences; import android.net.ConnectivityManager; + +import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import androidx.annotation.Nullable; @@ -543,7 +545,7 @@ public final class ListHelper { */ public static boolean isMeteredNetwork(final Context context) { final ConnectivityManager manager - = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + = ContextCompat.getSystemService(context, ConnectivityManager.class); if (manager == null || manager.getActiveNetworkInfo() == null) { return false; } diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index ccc102a19..45fe11ef4 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -14,6 +14,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; @@ -174,7 +175,7 @@ public final class NavigationHelper { Toast.makeText(context, R.string.popup_playing_toast, Toast.LENGTH_SHORT).show(); final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback); intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP); - startService(context, intent); + ContextCompat.startForegroundService(context, intent); } public static void playOnBackgroundPlayer(final Context context, @@ -184,7 +185,7 @@ public final class NavigationHelper { .show(); final Intent intent = getPlayerIntent(context, MainPlayer.class, queue, resumePlayback); intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO); - startService(context, intent); + ContextCompat.startForegroundService(context, intent); } public static void enqueueOnVideoPlayer(final Context context, final PlayQueue queue, @@ -201,7 +202,7 @@ public final class NavigationHelper { context, MainPlayer.class, queue, selectOnAppend, resumePlayback); intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_VIDEO); - startService(context, intent); + ContextCompat.startForegroundService(context, intent); } public static void enqueueOnPopupPlayer(final Context context, final PlayQueue queue, @@ -221,7 +222,7 @@ public final class NavigationHelper { final Intent intent = getPlayerEnqueueIntent( context, MainPlayer.class, queue, selectOnAppend, resumePlayback); intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_POPUP); - startService(context, intent); + ContextCompat.startForegroundService(context, intent); } public static void enqueueOnBackgroundPlayer(final Context context, final PlayQueue queue, @@ -237,15 +238,7 @@ public final class NavigationHelper { final Intent intent = getPlayerEnqueueIntent( context, MainPlayer.class, queue, selectOnAppend, resumePlayback); intent.putExtra(VideoPlayer.PLAYER_TYPE, VideoPlayer.PLAYER_TYPE_AUDIO); - startService(context, intent); - } - - public static void startService(@NonNull final Context context, @NonNull final Intent intent) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent); - } else { - context.startService(intent); - } + ContextCompat.startForegroundService(context, intent); } /*////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java index 1283f67f5..b631f19da 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/ShareUtils.java @@ -9,6 +9,8 @@ import android.content.pm.ResolveInfo; import android.net.Uri; import android.widget.Toast; +import androidx.core.content.ContextCompat; + import org.schabi.newpipe.R; public final class ShareUtils { @@ -95,7 +97,7 @@ public final class ShareUtils { */ public static void copyToClipboard(final Context context, final String text) { final ClipboardManager clipboardManager = - (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ContextCompat.getSystemService(context, ClipboardManager.class); if (clipboardManager == null) { Toast.makeText(context, diff --git a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java index 828f1adaf..0392e7235 100755 --- a/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java +++ b/app/src/main/java/us/shandian/giga/service/DownloadManagerService.java @@ -24,6 +24,8 @@ import android.os.Handler.Callback; import android.os.IBinder; import android.os.Message; import android.os.Parcelable; + +import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; import android.util.Log; import android.util.SparseArray; @@ -157,8 +159,10 @@ public class DownloadManagerService extends Service { mNotification = builder.build(); - mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + mNotificationManager = ContextCompat.getSystemService(this, + NotificationManager.class); + mConnectivityManager = ContextCompat.getSystemService(this, + ConnectivityManager.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mNetworkStateListenerL = new ConnectivityManager.NetworkCallback() { diff --git a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java index c9518e477..ca590a892 100644 --- a/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java +++ b/app/src/main/java/us/shandian/giga/ui/adapter/MissionAdapter.java @@ -29,6 +29,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.appcompat.app.AlertDialog; +import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.core.view.ViewCompat; import androidx.recyclerview.widget.DiffUtil; @@ -120,7 +121,7 @@ public class MissionAdapter extends Adapter implements Handler.Callb mContext = context; mDownloadManager = downloadManager; - mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + mInflater = ContextCompat.getSystemService(mContext, LayoutInflater.class); mLayout = R.layout.mission_item; mHandler = new Handler(context.getMainLooper()); diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index 551e80a3e..79924435f 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -201,7 +201,7 @@ public class Utility { } public static void copyToClipboard(Context context, String str) { - ClipboardManager cm = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + ClipboardManager cm = ContextCompat.getSystemService(context, ClipboardManager.class); if (cm == null) { Toast.makeText(context, R.string.permission_denied, Toast.LENGTH_LONG).show(); diff --git a/checkstyle-suppressions.xml b/checkstyle-suppressions.xml index 9728c6b8c..70a2afe73 100644 --- a/checkstyle-suppressions.xml +++ b/checkstyle-suppressions.xml @@ -13,7 +13,7 @@ + lines="282,314"/>