refactor: streamline main UI by removing redundant menu options and recycler item actions

This commit is contained in:
zarazaex69
2026-04-04 00:43:26 +03:00
parent b1e622f9da
commit b9126d2372
10 changed files with 77 additions and 263 deletions
@@ -617,18 +617,10 @@ object AngConfigManager {
* @return The generated description.
*/
fun generateDescription(profile: ProfileItem): String {
// Hide xxx:xxx:***/xxx.xxx.xxx.***
val server = profile.server
val port = profile.serverPort
if (server.isNullOrBlank() && port.isNullOrBlank()) return ""
val addrPart = server?.let {
if (it.contains(":"))
it.split(":").take(2).joinToString(":", postfix = ":***")
else
it.split('.').dropLast(1).joinToString(".", postfix = ".***")
} ?: ""
return "$addrPart : ${port ?: ""}"
return "$server : ${port ?: ""}"
}
}
@@ -82,6 +82,8 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
binding.drawerLayout.addDrawerListener(toggle)
toggle.syncState()
binding.navView.setNavigationItemSelectedListener(this)
findViewById<android.widget.TextView>(R.id.tv_forked)?.movementMethod = android.text.method.LinkMovementMethod.getInstance()
findViewById<android.widget.TextView>(R.id.tv_developed)?.movementMethod = android.text.method.LinkMovementMethod.getInstance()
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (binding.drawerLayout.isDrawerOpen(GravityCompat.START)) {
@@ -120,10 +122,10 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
val firstServer = mainViewModel.serversCache.firstOrNull()
if (firstServer != null) {
MmkvManager.setSelectServer(firstServer.guid)
toast("ЛАЙТ: Подключаемся к быстрейшему серверу")
toast("Подключаемся к быстрейшему серверу")
startV2RayWithPermission()
} else {
toast("ЛАЙТ: Серверы не найдены!")
toast("Серверы не найдены!")
}
}
}
@@ -176,7 +178,7 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
V2RayServiceManager.stopVService(this)
}
toast("ЛАЙТ: Выполняется замер задержки. Ожидаем завершения...")
toast("Выполняется замер задержки. Ожидаем завершения...")
isLiteTesting = true
mainViewModel.testAllRealPing()
}
@@ -255,58 +257,17 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.export_all -> {
exportAll()
true
}
R.id.ping_all -> {
toast(getString(R.string.connection_test_testing_count, mainViewModel.serversCache.count()))
mainViewModel.testAllTcping()
true
}
R.id.real_ping_all -> {
toast(getString(R.string.connection_test_testing_count, mainViewModel.serversCache.count()))
mainViewModel.testAllRealPing()
true
}
R.id.service_restart -> {
restartV2Ray()
true
}
R.id.del_all_config -> {
delAllConfig()
true
}
R.id.del_duplicate_config -> {
delDuplicateConfig()
true
}
R.id.del_invalid_config -> {
delInvalidConfig()
true
}
R.id.sort_by_test_results -> {
sortByTestResults()
true
}
R.id.sub_update -> {
importConfigViaSub()
true
}
R.id.locate_selected_config -> {
locateSelectedServer()
true
}
else -> super.onOptionsItemSelected(item)
}
@@ -589,10 +550,8 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
override fun onNavigationItemSelected(item: MenuItem): Boolean {
// Handle navigation view item clicks here.
when (item.itemId) {
R.id.sub_setting -> requestActivityLauncher.launch(Intent(this, SubSettingActivity::class.java))
R.id.per_app_proxy_settings -> requestActivityLauncher.launch(Intent(this, PerAppProxyActivity::class.java))
R.id.settings -> requestActivityLauncher.launch(Intent(this, SettingsActivity::class.java))
R.id.backup_restore -> requestActivityLauncher.launch(Intent(this, BackupActivity::class.java))
}
binding.drawerLayout.closeDrawer(GravityCompat.START)
@@ -58,7 +58,6 @@ class MainRecyclerAdapter(
//Name address
holder.itemMainBinding.tvName.text = profile.remarks
holder.itemMainBinding.tvStatistics.text = getAddress(profile)
holder.itemMainBinding.tvType.text = profile.configType.name
//TestResult
val aff = MmkvManager.decodeServerAffiliationInfo(guid)
@@ -81,34 +80,6 @@ class MainRecyclerAdapter(
holder.itemMainBinding.tvSubscription.text = subRemarks
holder.itemMainBinding.layoutSubscription.visibility = if (subRemarks.isEmpty()) View.GONE else View.VISIBLE
//layout
if (doubleColumnDisplay) {
holder.itemMainBinding.layoutShare.visibility = View.GONE
holder.itemMainBinding.layoutEdit.visibility = View.GONE
holder.itemMainBinding.layoutRemove.visibility = View.GONE
holder.itemMainBinding.layoutMore.visibility = View.VISIBLE
holder.itemMainBinding.layoutMore.setOnClickListener {
adapterListener?.onShare(guid, profile, position, true)
}
} else {
holder.itemMainBinding.layoutShare.visibility = View.VISIBLE
holder.itemMainBinding.layoutEdit.visibility = View.VISIBLE
holder.itemMainBinding.layoutRemove.visibility = View.VISIBLE
holder.itemMainBinding.layoutMore.visibility = View.GONE
holder.itemMainBinding.layoutShare.setOnClickListener {
adapterListener?.onShare(guid, profile, position, false)
}
holder.itemMainBinding.layoutEdit.setOnClickListener {
adapterListener?.onEdit(guid, position, profile)
}
holder.itemMainBinding.layoutRemove.setOnClickListener {
adapterListener?.onRemove(guid, position)
}
}
holder.itemMainBinding.infoContainer.setOnClickListener {
adapterListener?.onSelectServer(guid)
}
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M7,2v11h3v9l7,-12h-4l4,-8z"/>
</vector>
@@ -90,59 +90,80 @@
</LinearLayout>
</LinearLayout>
<FrameLayout
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginBottom="-16dp"
android:layout_marginEnd="@dimen/padding_spacing_dp16">
android:layout_marginEnd="@dimen/padding_spacing_dp16"
android:layout_marginBottom="@dimen/view_height_dp36"
android:gravity="center_horizontal"
android:orientation="vertical">
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/btn_summary_lite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:src="@drawable/ic_lite_bolt"
app:tint="@color/colorWhite"
app:backgroundTint="@color/color_fab_inactive" />
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginBottom="@dimen/view_height_dp36"
android:clickable="true"
android:contentDescription="@string/tasker_start_service"
android:focusable="true"
android:nextFocusLeft="@+id/layout_test"
android:src="@drawable/ic_play_24dp"
app:tint="@color/colorWhite"
app:useCompatPadding="true"
app:layout_anchorGravity="bottom|right|end" />
</FrameLayout>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginBottom="110dp"
android:layout_marginEnd="16dp">
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/btn_summary_lite"
android:layout_width="56dp"
android:layout_height="56dp"
android:padding="0dp"
android:text="L"
android:textAlignment="center"
android:textColor="@color/colorWhite"
app:backgroundTint="@color/color_fab_inactive" />
</FrameLayout>
app:useCompatPadding="true" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
</RelativeLayout>
</LinearLayout>
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/nav_header"
app:menu="@menu/menu_drawer">
android:background="?android:attr/windowBackground"
android:orientation="vertical">
</com.google.android.material.navigation.NavigationView>
<com.google.android.material.navigation.NavigationView
android:id="@+id/nav_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:headerLayout="@layout/nav_header"
app:menu="@menu/menu_drawer" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/tv_forked"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/drawer_forked_text"
android:textColorLink="?attr/colorAccent"
android:linksClickable="true"
android:textIsSelectable="true" />
<TextView
android:id="@+id/tv_developed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/drawer_developed_text"
android:textColorLink="?attr/colorAccent"
android:linksClickable="true"
android:textIsSelectable="true" />
</LinearLayout>
</LinearLayout>
</androidx.drawerlayout.widget.DrawerLayout>
@@ -99,89 +99,7 @@
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/layout_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/title_configuration_share"
android:focusable="true"
android:gravity="center"
android:nextFocusLeft="@+id/info_container"
android:orientation="vertical"
android:padding="@dimen/padding_spacing_dp8">
<ImageView
android:layout_width="wrap_content"
android:layout_height="@dimen/image_size_dp24"
app:srcCompat="@drawable/ic_share_24dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/menu_item_edit_config"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/padding_spacing_dp8">
<ImageView
android:layout_width="@dimen/image_size_dp24"
android:layout_height="@dimen/image_size_dp24"
app:srcCompat="@drawable/ic_edit_24dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout_remove"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/menu_item_del_config"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/padding_spacing_dp8">
<ImageView
android:layout_width="@dimen/image_size_dp24"
android:layout_height="@dimen/image_size_dp24"
app:srcCompat="@drawable/ic_delete_24dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:contentDescription="@string/notification_action_more"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/padding_spacing_dp8">
<ImageView
android:layout_width="@dimen/image_size_dp24"
android:layout_height="@dimen/image_size_dp24"
app:srcCompat="@drawable/ic_more_vert_24dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -193,16 +111,10 @@
android:paddingTop="@dimen/padding_spacing_dp8"
android:paddingEnd="@dimen/padding_spacing_dp8">
<TextView
android:id="@+id/tv_type"
<Space
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:lines="1"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
android:textColor="@color/colorConfigType"
android:textSize="11sp"
tools:text="VLESS" />
android:layout_weight="1" />
<TextView
android:id="@+id/tv_test_result"
@@ -4,10 +4,6 @@
tools:showIn="navigation_view">
<group android:id="@+id/group_main">
<item
android:id="@+id/sub_setting"
android:icon="@drawable/ic_subscriptions_24dp"
android:title="@string/title_sub_setting" />
<item
android:id="@+id/per_app_proxy_settings"
android:icon="@drawable/ic_per_apps_24dp"
@@ -18,18 +14,4 @@
android:icon="@drawable/ic_settings_24dp"
android:title="@string/title_settings" />
</group>
<group android:id="@+id/group_id2">
<item
android:id="@+id/backup_restore"
android:icon="@drawable/ic_restore_24dp"
android:title="@string/title_configuration_backup_restore" />
<!-- place holder for version text at the bottom -->
<item
android:id="@+id/placeholder"
android:enabled="false"
android:title="forked from v2RayNG" />
</group>
</menu>
+2 -38
View File
@@ -7,45 +7,9 @@
android:title="Проверить задержку профилей"
app:showAsAction="always" />
<item
android:id="@+id/service_restart"
android:title="@string/title_service_restart"
app:showAsAction="never" />
<item
android:id="@+id/del_all_config"
android:icon="@drawable/ic_delete_24dp"
android:title="@string/title_del_all_config"
app:showAsAction="never" />
<item
android:id="@+id/del_duplicate_config"
android:icon="@drawable/ic_delete_24dp"
android:title="@string/title_del_duplicate_config"
app:showAsAction="never" />
<item
android:id="@+id/del_invalid_config"
android:icon="@drawable/ic_delete_24dp"
android:title="@string/title_del_invalid_config"
app:showAsAction="never" />
<item
android:id="@+id/export_all"
android:icon="@drawable/ic_share_24dp"
android:title="@string/title_export_all"
app:showAsAction="never" />
<item
android:id="@+id/ping_all"
android:title="@string/title_ping_all_server"
app:showAsAction="never" />
<item
android:id="@+id/sort_by_test_results"
android:title="@string/title_sort_by_test_results"
app:showAsAction="never" />
<item
android:id="@+id/locate_selected_config"
android:title="@string/title_locate_selected_config"
app:showAsAction="never" />
<item
android:id="@+id/sub_update"
android:icon="@drawable/ic_check_update_24dp"
android:title="@string/title_sub_update"
app:showAsAction="never" />
app:showAsAction="always" />
</menu>
@@ -6,6 +6,8 @@
<string name="navigation_drawer_open">Открыть панель навигации</string>
<string name="navigation_drawer_close">Закрыть панель навигации</string>
<string name="migration_success">Успешный перенос данных!</string>
<string name="drawer_forked_text"><![CDATA[forked from <a href="https://github.com/2dust/v2rayng">V2RayNG</a>]]></string>
<string name="drawer_developed_text"><![CDATA[developed by developers from <a href="https://t.me/openlibrecommunity">openlibrecommunity</a>]]></string>
<string name="action_stop_service">Остановить службу</string>
<string name="migration_fail">Перенос данных не выполнен!</string>
<string name="pull_down_to_refresh">Потяните вниз для обновления!</string>
@@ -21,7 +23,7 @@
<string name="toast_services_failure">Сбой при запуске служб</string>
<!--ServerActivity-->
<string name="title_server">OlcNG by zarazaex</string>
<string name="title_server">Olcng</string>
<string name="menu_item_add_config">Добавить профиль</string>
<string name="menu_item_save_config">Сохранить профиль</string>
<string name="menu_item_edit_config">Изменить профиль</string>
@@ -7,6 +7,8 @@
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="migration_success">Data migration success!</string>
<string name="drawer_forked_text"><![CDATA[forked from <a href="https://github.com/2dust/v2rayng">V2RayNG</a>]]></string>
<string name="drawer_developed_text"><![CDATA[developed by developers from <a href="https://t.me/openlibrecommunity">openlibrecommunity</a>]]></string>
<string name="action_stop_service">Stop service</string>
<string name="migration_fail">Data migration failed!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>