diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 23a89bb..e9969a1 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,10 +4,10 @@
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 860da66..f340c7e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,32 @@
-
+
+
+
+
+
+
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index e497da9..0000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/README.md b/README.md
index 300487c..68b7813 100644
--- a/README.md
+++ b/README.md
@@ -21,11 +21,14 @@
# 2. 新版(2.0+)
1. 官方在某段时间关闭`H5`后(现已重新打开),从`2.0`版本开始,本应用进行了全新升级。
2. 新版使用`Material Design`配合官方`APP`的`API`。
+3. 本应用默认使用海外线路。
### 功能
-1. 浏览主页、分类、排行,查看漫画并阅读。
-2. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。
-3. 阅读下载的漫画。
+1. 浏览主页、分类、排行、我的下载、标签、作者。
+2. 查看、搜索漫画并直接阅读。
+3. 下载漫画。但是由于不可抗力,下载速度较慢且容易出错,这绝对不是优化的原因,绝对不是。
+4. 阅读下载的漫画。
+5. 检查更新。
### 未实现功能
未在上表列出的官方`APP`的其他功能。
diff --git a/app/build.gradle b/app/build.gradle
index 1b2bc1b..4faed20 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -22,14 +22,14 @@ android {
v2SigningEnabled true
}*/
}
- compileSdkVersion 30
+ compileSdkVersion 31
defaultConfig {
applicationId 'top.fumiama.copymanga'
minSdkVersion 23
- targetSdkVersion 30
- versionCode 18
- versionName '2.0.beta7'
+ targetSdkVersion 31
+ versionCode 19
+ versionName '2.0.beta8'
resConfigs "zh", "zh-rCN"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -60,7 +60,7 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
- jvmTarget = '1.8'
+ jvmTarget = '11'
}
bundle{
density{
@@ -75,18 +75,18 @@ android {
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.2'
- implementation 'androidx.appcompat:appcompat:1.2.0'
+ implementation 'androidx.core:core-ktx:1.7.0'
+ implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'com.google.android.material:material:1.3.0'
- implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
+ implementation 'com.google.android.material:material:1.5.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
testImplementation 'junit:junit:4.13.2'
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
- androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.afollestad.material-dialogs:input:3.3.0'
implementation 'com.github.yalantis:ucrop:2.2.6'
implementation 'com.to.aboomy:pager2banner:1.0.1'
@@ -96,6 +96,7 @@ dependencies {
implementation 'com.github.vovaksenov99:OverscrollableScrollView:1.0'
implementation 'com.liaoinstan.springview:library:1.7.0'
implementation 'com.github.zawadz88.materialpopupmenu:material-popup-menu:4.0.1'
+ implementation 'com.lapism:search:2.4.1@aar'
}
andResGuard {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ea186c3..3dab9ac 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -26,7 +26,8 @@
+ android:theme="@style/AppTheme.NoActionBar"
+ android:exported="true">
@@ -39,7 +40,7 @@
android:theme="@style/AppTheme.NoActionBar"/>
,
grantResults: IntArray
) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
1 -> {
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) pickPicture()
@@ -272,5 +276,6 @@ class MainActivity : AppCompatActivity() {
companion object{
var mainWeakReference: WeakReference? = null
+ var ime: InputMethodManager? = null
}
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/json/IndexStructure.java b/app/src/main/java/top/fumiama/copymanga/json/IndexStructure.java
index 2d3efee..65f820d 100644
--- a/app/src/main/java/top/fumiama/copymanga/json/IndexStructure.java
+++ b/app/src/main/java/top/fumiama/copymanga/json/IndexStructure.java
@@ -14,6 +14,7 @@ public class IndexStructure extends ReturnBase {
public FinishComics finishComics;
public static class Banners{
+ public int type;
public String cover;
public String brief;
public String out_uuid;
diff --git a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
index 46359e1..607bbc3 100644
--- a/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
+++ b/app/src/main/java/top/fumiama/copymanga/tools/http/DownloadTools.kt
@@ -42,7 +42,7 @@ object DownloadTools {
refer?.let { setRequestProperty("referer", it) }
setRequestProperty("source", "copyApp")
setRequestProperty("webp", "1")
- setRequestProperty("region", "1")
+ setRequestProperty("region", "0")
setRequestProperty("platform", "3")
ua?.let { setRequestProperty("User-agent", it) }
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
index 17ec674..6cc8d8a 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeFragment.kt
@@ -1,18 +1,35 @@
package top.fumiama.copymanga.ui.home
+import android.annotation.SuppressLint
+import android.app.AlertDialog
import android.os.Bundle
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
+import android.widget.ArrayAdapter
+import android.widget.ImageButton
+import androidx.appcompat.view.ContextThemeWrapper
import androidx.navigation.Navigation
+import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.model.GlideUrl
+import com.google.gson.Gson
+import com.lapism.search.internal.SearchLayout
+import kotlinx.android.synthetic.main.card_book_plain.view.*
import kotlinx.android.synthetic.main.fragment_home.*
+import kotlinx.android.synthetic.main.line_text_info.view.*
+import kotlinx.android.synthetic.main.line_word.view.*
import kotlinx.android.synthetic.main.viewpage_horizonal.view.*
-import top.fumiama.dmzj.copymanga.R
+import top.fumiama.copymanga.MainActivity.Companion.ime
import top.fumiama.copymanga.MainActivity.Companion.mainWeakReference
+import top.fumiama.copymanga.json.BookListStructure
import top.fumiama.copymanga.template.general.NoBackRefreshFragment
+import top.fumiama.copymanga.template.http.AutoDownloadThread
import top.fumiama.copymanga.tools.api.CMApi
+import top.fumiama.dmzj.copymanga.R
import java.lang.Thread.sleep
import java.lang.ref.WeakReference
@@ -32,6 +49,78 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
homeHandler.obtainMessage(-1, true).sendToTarget()
while(mainWeakReference?.get()?.isDrawerClosed != true) sleep(233)
//homeHandler.sendEmptyMessage(6) //removeAllViews
+ fhs.apply {
+ val recyclerView = findViewById(R.id.search_recycler_view)
+ setAdapterLayoutManager(LinearLayoutManager(context))
+ val adapter = ListViewHolder(recyclerView).RecyclerViewAdapter()
+ setAdapter(adapter)
+ navigationIconSupport = SearchLayout.NavigationIconSupport.SEARCH
+ setMicIconImageResource(R.drawable.ic_setting_search)
+ val micView = findViewById(R.id.search_image_view_mic)
+ setClearFocusOnBackPressed(true)
+ setOnNavigationClickListener(object : SearchLayout.OnNavigationClickListener {
+ override fun onNavigationClick(hasFocus: Boolean) {
+ if (hasFocus()) {
+ clearFocus()
+ }
+ else requestFocus()
+ }
+ })
+ setTextHint(android.R.string.search_go)
+ setOnQueryTextListener(object : SearchLayout.OnQueryTextListener {
+ var lastChangeTime = 0L
+ override fun onQueryTextChange(newText: CharSequence): Boolean {
+ postDelayed({
+ val diff = System.currentTimeMillis() - lastChangeTime
+ if(diff > 500) {
+ if (newText.isNotEmpty()) adapter.refresh(newText)
+ }
+ }, 1024)
+ lastChangeTime = System.currentTimeMillis()
+ return true
+ }
+
+ override fun onQueryTextSubmit(query: CharSequence): Boolean {
+ /*if(query.isNotEmpty()) {
+ val key = query.toString()
+ Toast.makeText(context, key, Toast.LENGTH_SHORT).show()
+ }*/
+ return true
+ }
+ })
+ setOnMicClickListener(object : SearchLayout.OnMicClickListener {
+ val types = arrayOf("", "name", "author", "local")
+ var i = 0
+ override fun onMicClick() {
+ val typenames = resources.getStringArray(R.array.search_types)
+ AlertDialog.Builder(ContextThemeWrapper(context, R.style.AlertDialogTheme))
+ .setTitle(R.string.set_search_types)
+ .setIcon(R.mipmap.ic_launcher)
+ .setSingleChoiceItems(ArrayAdapter(context, R.layout.line_choice_list, typenames), i){ d, p ->
+ adapter.type = types[p]
+ i = p
+ d.cancel()
+ }.show()
+ }
+ })
+
+ setOnFocusChangeListener(object : SearchLayout.OnFocusChangeListener {
+ override fun onFocusChange(hasFocus: Boolean) {
+ navigationIconSupport = if (hasFocus) SearchLayout.NavigationIconSupport.ARROW
+ else {
+ micView.postDelayed({ micView.visibility = View.VISIBLE }, 233)
+ SearchLayout.NavigationIconSupport.SEARCH
+ }
+ }
+ })
+
+ fhns.setOnTouchListener { _, e ->
+ if (e.action == MotionEvent.ACTION_UP && mSearchEditText?.text?.isNotEmpty() == true) {
+ ime?.hideSoftInputFromWindow(mainWeakReference?.get()?.window?.decorView?.windowToken, 0)
+ }
+ false
+ }
+ }
homeHandler.fhib = null
sleep(600)
homeHandler.startLoad()
@@ -75,4 +164,53 @@ class HomeFragment : NoBackRefreshFragment(R.layout.fragment_home) {
override fun getItemCount(): Int = homeHandler.index?.results?.banners?.size?:0
}
}
+
+ inner class ListViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ inner class RecyclerViewAdapter :
+ RecyclerView.Adapter() {
+ private var results: BookListStructure? = null
+ var type = ""
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListViewHolder {
+ return ListViewHolder(
+ LayoutInflater.from(parent.context)
+ .inflate(R.layout.line_word, parent, false)
+ )
+ }
+
+ @SuppressLint("ClickableViewAccessibility", "SetTextI18n")
+ override fun onBindViewHolder(holder: ListViewHolder, position: Int) {
+ Log.d("MyMain", "Bind open at $position")
+ results?.results?.list?.get(position)?.apply {
+ holder.itemView.tn.text = name
+ holder.itemView.ta.text = author.let {
+ var t = ""
+ it.forEach { ts ->
+ t += ts.name + " "
+ }
+ return@let t
+ }
+ holder.itemView.tb.text = popular.toString()
+ context?.let {
+ Glide.with(it).load(GlideUrl(cover, CMApi.myGlideHeaders)).into(holder.itemView.imic)
+ }
+ holder.itemView.lwc.setOnClickListener {
+ val bundle = Bundle()
+ bundle.putString("path", path_word)
+ rootView?.let { r -> Navigation.findNavController(r).navigate(R.id.action_nav_home_to_nav_book, bundle) }
+ }
+ }
+ }
+
+ override fun getItemCount() = results?.results?.list?.size?:0
+
+ fun refresh(query: CharSequence) {
+ mainWeakReference?.get()?.apply {
+ AutoDownloadThread(String.format(getString(R.string.searchApiUrl), 0, query, type)) {
+ results = Gson().fromJson(it?.decodeToString(), BookListStructure::class.java)
+ runOnUiThread { notifyDataSetChanged() }
+ }.start()
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
index b01458a..35daf08 100644
--- a/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
+++ b/app/src/main/java/top/fumiama/copymanga/ui/home/HomeHandler.kt
@@ -81,6 +81,13 @@ class HomeHandler(that: WeakReference) : AutoDownloadHandler(
override fun setGsonItem(gsonObj: Any) {
super.setGsonItem(gsonObj)
index = gsonObj as IndexStructure
+ var banners = arrayOf()
+ index?.results?.banners?.forEach {
+ if(it.type == 1) {
+ banners += it
+ }
+ }
+ index?.results?.banners = banners
}
override fun onError() {
super.onError()
diff --git a/app/src/main/java/top/fumiama/copymanga/update/ByteArrayQueue.kt b/app/src/main/java/top/fumiama/copymanga/update/ByteArrayQueue.kt
new file mode 100644
index 0000000..199d91c
--- /dev/null
+++ b/app/src/main/java/top/fumiama/copymanga/update/ByteArrayQueue.kt
@@ -0,0 +1,27 @@
+package top.fumiama.copymanga.update
+//Fumiama 20210601
+//ByteArrayQueue.kt
+//FIFO队列
+class ByteArrayQueue {
+ private var elements = byteArrayOf()
+ val size get() = elements.size
+ fun append(items: ByteArray) {
+ elements += items
+ }
+ fun pop(num: Int = 1): ByteArray? {
+ return if(num <= elements.size) {
+ val re = elements.copyOfRange(0, num)
+ elements = elements.copyOfRange(num, elements.size)
+ re
+ } else null
+ }
+ fun clear() {
+ elements = byteArrayOf()
+ }
+ fun popAll(): ByteArray {
+ val re = elements
+ clear()
+ return re
+ }
+ operator fun plusAssign(items: ByteArray) = append(items)
+}
\ No newline at end of file
diff --git a/app/src/main/java/top/fumiama/copymanga/update/Client.kt b/app/src/main/java/top/fumiama/copymanga/update/Client.kt
index f393c2b..74e93d6 100644
--- a/app/src/main/java/top/fumiama/copymanga/update/Client.kt
+++ b/app/src/main/java/top/fumiama/copymanga/update/Client.kt
@@ -1,9 +1,9 @@
package top.fumiama.copymanga.update
-
+//Fumiama 20210601
+//Client.kt
import android.util.Log
-import java.io.IOException
-import java.io.InputStream
-import java.io.OutputStream
+import java.io.*
+import java.lang.Thread.sleep
import java.net.Socket
class Client(private val ip: String, private val port: Int) {
@@ -26,7 +26,7 @@ class Client(private val ip: String, private val port: Int) {
sc = Socket(ip, port) //通过socket连接服务器
din = sc?.getInputStream() //获取输入流并转换为StreamReader,约定编码格式
dout = sc?.getOutputStream() //获取输出流
- sc?.soTimeout = 2333 //设置连接超时限制
+ sc?.soTimeout = 10000 //设置连接超时限制
return if (isConnect) {
Log.d("MyC", "connect server successful")
true
@@ -44,13 +44,15 @@ class Client(private val ip: String, private val port: Int) {
* 发送数据至服务器
* @param message 要发送至服务器的字符串
*/
- fun sendMessage(message: CharSequence?): Boolean {
+ fun sendMessage(message: String?): Boolean = sendMessage(message?.toByteArray())
+
+ fun sendMessage(message: ByteArray?): Boolean {
try {
if (isConnect) {
- if (message != null) { //判断输出流或者消息是否为空,为空的话会产生nullpoint错误
- dout?.write(message.toString().toByteArray())
+ if (message != null) { //判断输出流或者消息是否为空,为空的话会产生null pointer错误
+ dout?.write(message)
dout?.flush()
- Log.d("MyC", "Send msg: $message")
+ Log.d("MyC", "Send msg: ${message.decodeToString()}")
return true
} else Log.d("MyC", "The message to be sent is empty")
Log.d("MyC", "send message succeed")
@@ -62,74 +64,51 @@ class Client(private val ip: String, private val port: Int) {
return false
}
- var buffer = byteArrayOf()
+ fun read(): Char? = din?.read()?.toChar()
- fun receiveRawMessage(totalSize: Int = -1, bufferSize: Int = 1048576, setProgress: Boolean = false) : ByteArray {
- if(totalSize == buffer.size) {
- val re = buffer
- buffer = byteArrayOf()
- return re
- } else {
- var re = byteArrayOf()
+ private var buffer = ByteArrayQueue()
+ private val receiveBuffer = ByteArray(65536)
+
+ fun receiveRawMessage(totalSize: Int, setProgress: Boolean = false) : ByteArray {
+ if(totalSize == buffer.size) return buffer.popAll()
+ else {
try {
if (isConnect) {
Log.d("MyC", "开始接收服务端信息")
- val inMessage = ByteArray(bufferSize) //设置接受缓冲,避免接受数据过长占用过多内存
- var a: Int
- do {
- a = din?.read(inMessage)?:0 //a存储返回消息的长度
- if(a > 0) {
- re += inMessage.copyOf(a)
- Log.d("MyC", "reply length:$a")
- if(totalSize < 0 && a < bufferSize) break
- else if(setProgress && totalSize > 0) progress?.notify(100 * re.size / totalSize)
- } else break
- } while (totalSize > re.size)
+ while(totalSize > buffer.size) {
+ val count = din?.read(receiveBuffer)?:0
+ if(count > 0) {
+ buffer += receiveBuffer.copyOfRange(0, count)
+ Log.d("MyC", "reply length:$count")
+ if(setProgress && totalSize > 0) progress?.notify(100 * buffer.size / totalSize)
+ } else sleep(10)
+ }
} else Log.d("MyC", "no connect to receive message")
} catch (e: IOException) {
Log.d("MyC", "receive message failed")
e.printStackTrace()
}
- if(totalSize > 0 && re.size > totalSize) {
- Log.d("MyC", "Reduce re size from ${re.size} to $totalSize")
- buffer += re.copyOfRange(totalSize, re.size)
- re = re.copyOf(totalSize)
- } else if(totalSize > 0 && buffer.isNotEmpty()) {
- Log.d("MyC", "Increase re size.")
- buffer += re
- if(buffer.size > totalSize) {
- re = buffer.copyOf(totalSize)
- buffer = buffer.copyOfRange(totalSize, buffer.size)
- } else {
- re = buffer
- buffer = byteArrayOf()
- }
- } else if(totalSize < 0 && buffer.isNotEmpty()) {
- re = buffer
- buffer = byteArrayOf()
- Log.d("MyC", "clear buffer")
- }
- return re
+ return if(totalSize > 0) buffer.pop(totalSize)?:byteArrayOf() else buffer.popAll()
}
}
- //fun receiveMessage() = receiveRawMessage().decodeToString()
+ fun receiveMessage(totalSize: Int) = receiveRawMessage(totalSize).decodeToString()
/**
* 关闭连接
*/
fun closeConnect() = try {
- din?.close()
- dout?.close()
- sc?.close()
- sc = null
- din = null
- dout = null
- true
- } catch (e: IOException) {
- e.printStackTrace()
- false
- }
+ din?.close()
+ dout?.close()
+ sc?.close()
+ sc = null
+ din = null
+ dout = null
+ true
+ } catch (e: IOException) {
+ e.printStackTrace()
+ false
+ }
var progress: Progress? = null
diff --git a/app/src/main/res/drawable-anydpi/ic_like.xml b/app/src/main/res/drawable-anydpi/ic_like.xml
new file mode 100644
index 0000000..87c647d
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_like.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-anydpi/ic_like_filled.xml b/app/src/main/res/drawable-anydpi/ic_like_filled.xml
new file mode 100644
index 0000000..a4344c9
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_like_filled.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable-anydpi/ic_setting_search.xml b/app/src/main/res/drawable-anydpi/ic_setting_search.xml
new file mode 100644
index 0000000..ee24892
--- /dev/null
+++ b/app/src/main/res/drawable-anydpi/ic_setting_search.xml
@@ -0,0 +1,10 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml
index 06dd6f3..38fef41 100644
--- a/app/src/main/res/layout/activity_login.xml
+++ b/app/src/main/res/layout/activity_login.xml
@@ -79,7 +79,7 @@
android:layout_marginTop="4dp"
android:fontFamily="@font/calibri"
android:gravity="center"
- android:text="This is the third-party app for ranobe reading"
+ android:text="This is the third-party app for manga reading"
android:textColor="#9affffff"
android:textSize="10sp" />
diff --git a/app/src/main/res/layout/card_book_plain.xml b/app/src/main/res/layout/card_book_plain.xml
new file mode 100644
index 0000000..4281170
--- /dev/null
+++ b/app/src/main/res/layout/card_book_plain.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml
index 54341a2..7f2bfa6 100644
--- a/app/src/main/res/layout/fragment_home.xml
+++ b/app/src/main/res/layout/fragment_home.xml
@@ -6,29 +6,50 @@
android:layout_height="match_parent"
tools:context="top.fumiama.copymanga.ui.home.HomeFragment">
-
+ android:layout_height="match_parent"
+ android:fillViewport="true">
-
+ android:layout_height="wrap_content"
+ android:orientation="vertical">
-
-
-
+ app:layout_behavior="com.lapism.search.widget.SearchBehavior">
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/line_choice_list.xml b/app/src/main/res/layout/line_choice_list.xml
new file mode 100644
index 0000000..ad2c910
--- /dev/null
+++ b/app/src/main/res/layout/line_choice_list.xml
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/app/src/main/res/layout/line_word.xml b/app/src/main/res/layout/line_word.xml
new file mode 100644
index 0000000..dd38fbc
--- /dev/null
+++ b/app/src/main/res/layout/line_word.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 86d88d0..c231853 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -11,4 +11,5 @@
#BFEA88
#ffffff
#F6837A
+ #E1E1E1
\ No newline at end of file
diff --git a/app/src/main/res/values/search_types.xml b/app/src/main/res/values/search_types.xml
new file mode 100644
index 0000000..2dd33d6
--- /dev/null
+++ b/app/src/main/res/values/search_types.xml
@@ -0,0 +1,9 @@
+
+
+
+ - 全部
+ - 名称
+ - 作者
+ - 汉化组
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 50fc2e7..4a13cc5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -7,7 +7,7 @@
主页
分类
排行
- ©2021源文雨@CoolApk\n本应用为拷贝漫画的第三方客户端,数据均来源于网络,作者不对其中所呈现的任何内容负责。
+ ©2022源文雨@CoolApk\n本应用为拷贝漫画的第三方客户端,数据均来源于网络,作者不对其中所呈现的任何内容负责。
浏览历史
我的订阅
我的下载
@@ -17,6 +17,7 @@
漫画下载
专题系列
检查更新
+ 设置搜索类别
illust: Hiten(490219)
请设定提示文字内容
@@ -33,6 +34,7 @@
"https://api.copymanga.com"
https://nnv3api.dmzj1.com/novel/recentUpdate/%1$d.json
https://api.copymanga.com/api/v3/ranks?limit=21&offset=%1$d&date_type=%2$s&platform=3
+ https://api.copymanga.com/api/v3/search/comic?limit=21&offset=%1$d&q=%2$s&q_type=%3$s&platform=3
https://api.copymanga.com/api/v3/h5/filterIndex/comic/tags?platform=3
https://api.copymanga.com/api/v3/comics?limit=21&offset=%1$d&ordering=%2$s&theme=%3$s&platform=3
https://api.copymanga.com/api/v3/comic2/%1$s?platform=3
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 68fa182..67cb286 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -21,4 +21,6 @@
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index cca0720..8334b16 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,14 +1,15 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
- ext.kotlin_version = '1.5.0'
+ ext.kotlin_version = '1.5.31'
repositories {
google()
jcenter()
mavenCentral()
maven { url 'https://maven.google.com' }
+ maven { url "https://jitpack.io" }
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.2.1'
+ classpath 'com.android.tools.build:gradle:7.0.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 14fc473..0195666 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip