From babfcac664dd72aaf9888a714db3e920b15b937f Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 18 Jan 2022 16:23:22 +0800 Subject: [PATCH] =?UTF-8?q?2.0.beta8=201.=20=E5=A2=9E=E5=8A=A0=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=202.=20=E5=8D=87=E7=BA=A7sdk=E3=80=81api=203.=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 5 +- .idea/misc.xml | 28 +++- .idea/runConfigurations.xml | 13 -- README.md | 9 +- app/build.gradle | 23 +-- app/src/main/AndroidManifest.xml | 5 +- .../top/fumiama/copymanga/MainActivity.kt | 7 +- .../copymanga/json/IndexStructure.java | 1 + .../copymanga/tools/http/DownloadTools.kt | 2 +- .../fumiama/copymanga/ui/home/HomeFragment.kt | 140 +++++++++++++++++- .../fumiama/copymanga/ui/home/HomeHandler.kt | 7 + .../copymanga/update/ByteArrayQueue.kt | 27 ++++ .../top/fumiama/copymanga/update/Client.kt | 99 +++++-------- app/src/main/res/drawable-anydpi/ic_like.xml | 10 ++ .../res/drawable-anydpi/ic_like_filled.xml | 10 ++ .../res/drawable-anydpi/ic_setting_search.xml | 10 ++ app/src/main/res/layout/activity_login.xml | 2 +- app/src/main/res/layout/card_book_plain.xml | 53 +++++++ app/src/main/res/layout/fragment_home.xml | 53 +++++-- app/src/main/res/layout/line_choice_list.xml | 25 ++++ app/src/main/res/layout/line_word.xml | 72 +++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/search_types.xml | 9 ++ app/src/main/res/values/strings.xml | 4 +- app/src/main/res/values/styles.xml | 2 + build.gradle | 5 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 27 files changed, 507 insertions(+), 117 deletions(-) delete mode 100644 .idea/runConfigurations.xml create mode 100644 app/src/main/java/top/fumiama/copymanga/update/ByteArrayQueue.kt create mode 100644 app/src/main/res/drawable-anydpi/ic_like.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_like_filled.xml create mode 100644 app/src/main/res/drawable-anydpi/ic_setting_search.xml create mode 100644 app/src/main/res/layout/card_book_plain.xml create mode 100644 app/src/main/res/layout/line_choice_list.xml create mode 100644 app/src/main/res/layout/line_word.xml create mode 100644 app/src/main/res/values/search_types.xml 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 @@ + +