From 098828d8d5383269dc371bb096520695eb91d0d4 Mon Sep 17 00:00:00 2001 From: benya Date: Sat, 17 Jan 2026 22:51:58 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9F=D0=BE=D0=B2=D1=8B=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D0=B1=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5=D0=B9=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Этот коммит включает ряд улучшений по всему приложению: Стабильность: - Реализована null-безопасность для getArguments() в ChatListFragment, чтобы предотвратить NullPointerException. - Устранено предупреждение о непроверенном приведении типов в ChatListFragment с использованием @SuppressWarnings("unchecked"). - Обеспечено корректное управление ресурсами: объект Response в VkApiClient обёрнут в try-with-resources для предотвращения утечек ресурсов. Управление зависимостями: - Проект обновлён до Java 17 для повышения производительности и использования современных возможностей языка. - Все прямые объявления зависимостей перенесены в Gradle Version Catalog (libs.versions.toml) для лучшей организации и упрощённого управления внешними библиотеками. Пользовательский интерфейс: - Улучшено визуальное отображение ViewPager2 в activity_main.xml путём добавления горизонтальных отступов для более сбалансированного макета. - В MultiLinkDialog заменён LayoutInflater.from(requireContext()) на getLayoutInflater() для лучшего соответствия жизненному циклу Fragment. --- app/build.gradle | 20 +++++++-------- .../vkchatmanager/ChatListFragment.java | 16 +++++------- .../dialogs/MultiLinkDialog.java | 3 +-- .../vkchatmanager/network/VkApiClient.java | 25 ++++++++++--------- app/src/main/res/layout/activity_main.xml | 4 ++- gradle/libs.versions.toml | 22 ++++++++-------- settings.gradle | 1 + 7 files changed, 45 insertions(+), 46 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8ce36b3..563d3e6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.anabasis.vkchatmanager" minSdk 26 targetSdk 36 - versionCode 2 - versionName "1.1" + versionCode 3 + versionName "1.1.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -25,17 +25,17 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } } dependencies { - implementation 'androidx.recyclerview:recyclerview:1.3.2' - implementation 'androidx.viewpager2:viewpager2:1.1.0' - implementation "com.google.android.material:material:1.12.0" - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - implementation 'com.squareup.okhttp3:okhttp:4.12.0' - implementation 'org.json:json:20240303' + implementation libs.recyclerview + implementation libs.viewpager2 + implementation libs.material + implementation libs.swiperefreshlayout + implementation libs.okhttp + implementation libs.json } diff --git a/app/src/main/java/com/anabasis/vkchatmanager/ChatListFragment.java b/app/src/main/java/com/anabasis/vkchatmanager/ChatListFragment.java index eefbb90..9347943 100644 --- a/app/src/main/java/com/anabasis/vkchatmanager/ChatListFragment.java +++ b/app/src/main/java/com/anabasis/vkchatmanager/ChatListFragment.java @@ -42,10 +42,13 @@ public class ChatListFragment extends Fragment { @Override + @SuppressWarnings("unchecked") public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - chats = (ArrayList) - getArguments().getSerializable(ARG_CHATS); + Bundle arguments = getArguments(); + if (arguments != null) { + chats = (ArrayList) arguments.getSerializable(ARG_CHATS); + } if (chats == null) chats = new ArrayList<>(); } @@ -90,11 +93,4 @@ public class ChatListFragment extends Fragment { if (c.selected) res.add(c); return res; } - - public void updateChats() { - if (adapter != null) { - adapter.notifyDataSetChanged(); - } - } - -} +} \ No newline at end of file diff --git a/app/src/main/java/com/anabasis/vkchatmanager/dialogs/MultiLinkDialog.java b/app/src/main/java/com/anabasis/vkchatmanager/dialogs/MultiLinkDialog.java index 0b15cbd..6a9e6dc 100644 --- a/app/src/main/java/com/anabasis/vkchatmanager/dialogs/MultiLinkDialog.java +++ b/app/src/main/java/com/anabasis/vkchatmanager/dialogs/MultiLinkDialog.java @@ -2,7 +2,6 @@ package com.anabasis.vkchatmanager.dialogs; import android.app.Dialog; import android.os.Bundle; -import android.view.LayoutInflater; import android.view.View; import android.widget.EditText; @@ -33,7 +32,7 @@ public class MultiLinkDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - View view = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_multilink, null); + View view = getLayoutInflater().inflate(R.layout.dialog_multilink, null); EditText input = view.findViewById(R.id.linksInput); return new MaterialAlertDialogBuilder(requireContext()) diff --git a/app/src/main/java/com/anabasis/vkchatmanager/network/VkApiClient.java b/app/src/main/java/com/anabasis/vkchatmanager/network/VkApiClient.java index e8f5ebc..7e8b4da 100644 --- a/app/src/main/java/com/anabasis/vkchatmanager/network/VkApiClient.java +++ b/app/src/main/java/com/anabasis/vkchatmanager/network/VkApiClient.java @@ -23,20 +23,21 @@ public class VkApiClient { "&v=5.131"; Request r = new Request.Builder().url(url).build(); - Response res = client.newCall(r).execute(); - - String body = res.body().string(); - JSONObject json = new JSONObject(body); + try (Response res = client.newCall(r).execute()) { - if (json.has("error")) { - JSONObject error = json.getJSONObject("error"); - if (error.getInt("error_code") == 5) { - throw new TokenExpiredException(); + String body = res.body().string(); + JSONObject json = new JSONObject(body); + + if (json.has("error")) { + JSONObject error = json.getJSONObject("error"); + if (error.getInt("error_code") == 5) { + throw new TokenExpiredException(); + } + throw new Exception(error.getString("error_msg")); } - throw new Exception(error.getString("error_msg")); - } - return json; + return json; + } } public JSONArray getChats() throws Exception { @@ -83,4 +84,4 @@ public class VkApiClient { return u.getString("first_name") + " " + u.getString("last_name"); } -} +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index f51e9c7..a663729 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -121,7 +121,9 @@ + android:layout_height="match_parent" + android:paddingStart="16dp" + android:paddingEnd="16dp" /> diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d387dc3..53ebea6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,20 +1,20 @@ [versions] agp = "9.0.0" -coreKtx = "1.17.0" -junit = "4.13.2" -junitVersion = "1.3.0" -espressoCore = "3.7.0" -appcompat = "1.7.1" material = "1.13.0" +recyclerview = "1.4.0" +viewpager2 = "1.1.0" +swiperefreshlayout = "1.2.0" +okhttp = "5.3.2" +json = "20251224" [libraries] -androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -junit = { group = "junit", name = "junit", version.ref = "junit" } -androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" } -androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } material = { group = "com.google.android.material", name = "material", version.ref = "material" } +recyclerview = { group = "androidx.recyclerview", name = "recyclerview", version.ref = "recyclerview" } +viewpager2 = { group = "androidx.viewpager2", name = "viewpager2", version.ref = "viewpager2" } +swiperefreshlayout = { group = "androidx.swiperefreshlayout", name = "swiperefreshlayout", version.ref = "swiperefreshlayout" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } +json = { group = "org.json", name = "json", version.ref = "json" } + [plugins] android-application = { id = "com.android.application", version.ref = "agp" } - diff --git a/settings.gradle b/settings.gradle index 985bb9e..4e65a95 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,7 @@ pluginManagement { gradlePluginPortal() } } + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories {