add asset by url menu, ui and save logic
This commit is contained in:
1 parent
a2bace4ede
commit
ea816ca981
8 files changed
+246
-4
No files matched your search
@@ -93,6 +93,9 @@
|
|||||||
<activity
|
<activity
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
android:name=".ui.UserAssetActivity" />
|
android:name=".ui.UserAssetActivity" />
|
||||||
|
<activity
|
||||||
|
android:exported="false"
|
||||||
|
android:name=".ui.UserAssetUrlActivity" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:exported="false"
|
android:exported="false"
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.v2ray.ang.dto
|
||||||
|
|
||||||
|
data class AssetUrlItem(
|
||||||
|
var remarks: String = "",
|
||||||
|
var url: String = "",
|
||||||
|
val addedTime: Long = System.currentTimeMillis(),
|
||||||
|
var lastUpdated: Long = -1
|
||||||
|
)
|
||||||
@@ -8,4 +8,5 @@ data class SubscriptionItem(
|
|||||||
var lastUpdated: Long = -1,
|
var lastUpdated: Long = -1,
|
||||||
var autoUpdate: Boolean = false,
|
var autoUpdate: Boolean = false,
|
||||||
val updateInterval: Int? = null,
|
val updateInterval: Int? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -66,6 +66,11 @@ class UserAssetActivity : BaseActivity() {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
R.id.add_url -> {
|
||||||
|
val intent = Intent(this, UserAssetUrlActivity::class.java)
|
||||||
|
startActivity(intent)
|
||||||
|
true
|
||||||
|
}
|
||||||
R.id.download_file -> {
|
R.id.download_file -> {
|
||||||
downloadGeoFiles()
|
downloadGeoFiles()
|
||||||
true
|
true
|
||||||
|
|||||||
@@ -0,0 +1,128 @@
|
|||||||
|
package com.v2ray.ang.ui
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.TextUtils
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.tencent.mmkv.MMKV
|
||||||
|
import com.v2ray.ang.R
|
||||||
|
import com.v2ray.ang.databinding.ActivityUserAssetUrlBinding
|
||||||
|
import com.v2ray.ang.dto.AssetUrlItem
|
||||||
|
import com.v2ray.ang.extension.toast
|
||||||
|
import com.v2ray.ang.util.MmkvManager
|
||||||
|
import com.v2ray.ang.util.Utils
|
||||||
|
|
||||||
|
class UserAssetUrlActivity : BaseActivity() {
|
||||||
|
private lateinit var binding: ActivityUserAssetUrlBinding
|
||||||
|
|
||||||
|
var del_config: MenuItem? = null
|
||||||
|
var save_config: MenuItem? = null
|
||||||
|
|
||||||
|
private val assetStorage by lazy { MMKV.mmkvWithID(MmkvManager.ID_ASSET, MMKV.MULTI_PROCESS_MODE) }
|
||||||
|
private val editAssetId by lazy { intent.getStringExtra("assetUrlId").orEmpty() }
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
binding = ActivityUserAssetUrlBinding.inflate(layoutInflater)
|
||||||
|
val view = binding.root
|
||||||
|
setContentView(view)
|
||||||
|
title = getString(R.string.title_user_asset_add_url)
|
||||||
|
|
||||||
|
val json = assetStorage?.decodeString(editAssetId)
|
||||||
|
if (!json.isNullOrBlank()) {
|
||||||
|
bindingAsset(Gson().fromJson(json, AssetUrlItem::class.java))
|
||||||
|
} else {
|
||||||
|
clearAsset()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bingding seleced asset config
|
||||||
|
*/
|
||||||
|
private fun bindingAsset(assetItem: AssetUrlItem): Boolean {
|
||||||
|
binding.etRemarks.text = Utils.getEditable(assetItem.remarks)
|
||||||
|
binding.etUrl.text = Utils.getEditable(assetItem.url)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clear or init asset config
|
||||||
|
*/
|
||||||
|
private fun clearAsset(): Boolean {
|
||||||
|
binding.etRemarks.text = null
|
||||||
|
binding.etUrl.text = null
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* save asset config
|
||||||
|
*/
|
||||||
|
private fun saveServer(): Boolean {
|
||||||
|
val assetItem: AssetUrlItem
|
||||||
|
val json = assetStorage?.decodeString(editAssetId)
|
||||||
|
var assetId = editAssetId
|
||||||
|
if (!json.isNullOrBlank()) {
|
||||||
|
assetItem = Gson().fromJson(json, AssetUrlItem::class.java)
|
||||||
|
} else {
|
||||||
|
assetId = Utils.getUuid()
|
||||||
|
assetItem = AssetUrlItem()
|
||||||
|
}
|
||||||
|
|
||||||
|
assetItem.remarks = binding.etRemarks.text.toString()
|
||||||
|
assetItem.url = binding.etUrl.text.toString()
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(assetItem.remarks)) {
|
||||||
|
toast(R.string.sub_setting_remarks)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if (TextUtils.isEmpty(assetItem.url)) {
|
||||||
|
toast(R.string.title_url)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
assetStorage?.encode(assetId, Gson().toJson(assetItem))
|
||||||
|
toast(R.string.toast_success)
|
||||||
|
finish()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* save server config
|
||||||
|
*/
|
||||||
|
private fun deleteServer(): Boolean {
|
||||||
|
if (editAssetId.isNotEmpty()) {
|
||||||
|
AlertDialog.Builder(this).setMessage(R.string.del_config_comfirm)
|
||||||
|
.setPositiveButton(android.R.string.ok) { _, _ ->
|
||||||
|
MmkvManager.removeSubscription(editAssetId)
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
menuInflater.inflate(R.menu.action_server, menu)
|
||||||
|
del_config = menu.findItem(R.id.del_config)
|
||||||
|
save_config = menu.findItem(R.id.save_config)
|
||||||
|
|
||||||
|
if (editAssetId.isEmpty()) {
|
||||||
|
del_config?.isVisible = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.onCreateOptionsMenu(menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
|
||||||
|
R.id.del_config -> {
|
||||||
|
deleteServer()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
R.id.save_config -> {
|
||||||
|
saveServer()
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else -> super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ object MmkvManager {
|
|||||||
const val ID_SERVER_RAW = "SERVER_RAW"
|
const val ID_SERVER_RAW = "SERVER_RAW"
|
||||||
const val ID_SERVER_AFF = "SERVER_AFF"
|
const val ID_SERVER_AFF = "SERVER_AFF"
|
||||||
const val ID_SUB = "SUB"
|
const val ID_SUB = "SUB"
|
||||||
|
const val ID_ASSET = "ASSET"
|
||||||
const val ID_SETTING = "SETTING"
|
const val ID_SETTING = "SETTING"
|
||||||
const val KEY_SELECTED_SERVER = "SELECTED_SERVER"
|
const val KEY_SELECTED_SERVER = "SELECTED_SERVER"
|
||||||
const val KEY_ANG_CONFIGS = "ANG_CONFIGS"
|
const val KEY_ANG_CONFIGS = "ANG_CONFIGS"
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context=".ui.UserAssetUrlActivity">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:padding="@dimen/layout_margin_top_height">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/menu_item_add_asset"
|
||||||
|
android:textAppearance="@style/TextAppearance.AppCompat.Subhead" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/layout_margin_top_height"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sub_setting_remarks" />
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/et_remarks"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="@dimen/edit_height"
|
||||||
|
android:inputType="text" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="@dimen/layout_margin_top_height"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/title_url" />
|
||||||
|
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/et_url"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="10dp"
|
||||||
|
android:gravity="top"
|
||||||
|
android:inputType="textMultiLine"
|
||||||
|
android:maxLines="10"
|
||||||
|
android:minLines="5"
|
||||||
|
android:scrollbars="vertical" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="@dimen/layout_margin_top_height"
|
||||||
|
android:layout_marginTop="@dimen/layout_margin_top_height"
|
||||||
|
android:orientation="vertical" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
@@ -2,10 +2,20 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<item
|
<item
|
||||||
android:id="@+id/add_file"
|
|
||||||
android:icon="@drawable/ic_add_24dp"
|
android:icon="@drawable/ic_add_24dp"
|
||||||
android:title="@string/menu_item_add_file"
|
android:title="@string/menu_item_add_asset"
|
||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" >
|
||||||
|
<menu>
|
||||||
|
<item
|
||||||
|
android:id="@+id/add_file"
|
||||||
|
android:title="@string/menu_item_add_file"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
<item
|
||||||
|
android:id="@+id/add_url"
|
||||||
|
android:title="@string/menu_item_add_url"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
<item
|
<item
|
||||||
android:id="@+id/download_file"
|
android:id="@+id/download_file"
|
||||||
android:icon="@drawable/ic_cloud_download_24dp"
|
android:icon="@drawable/ic_cloud_download_24dp"
|
||||||
|
|||||||
Reference in new issue
Block a user