1
0
mirror of https://github.com/fumiama/copymanga.git synced 2026-06-10 10:24:29 +08:00
1. 修复详情页无下载按钮
2. 增加音量键翻页
3. 增加按钮拖动
This commit is contained in:
fumiama
2021-05-06 22:43:56 +08:00
parent 002321d281
commit e4b9fc8043
28 changed files with 343 additions and 91 deletions

2
.idea/compiler.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CompilerConfiguration"> <component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8" /> <bytecodeTargetLevel target="11" />
</component> </component>
</project> </project>

10
.idea/markdown-navigator-enh.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownEnhProjectSettings">
<AnnotatorSettings targetHasSpaces="true" linkCaseMismatch="true" wikiCaseMismatch="true" wikiLinkHasDashes="true" notUnderWikiHome="true" targetNotWikiPageExt="true" notUnderSourceWikiHome="true" targetNameHasAnchor="true" targetPathHasAnchor="true" wikiLinkHasSlash="true" wikiLinkHasSubdir="true" wikiLinkHasOnlyAnchor="true" linkTargetsWikiHasExt="true" linkTargetsWikiHasBadExt="true" notUnderSameRepo="true" targetNotUnderVcs="false" linkNeedsExt="true" linkHasBadExt="true" linkTargetNeedsExt="true" linkTargetHasBadExt="true" wikiLinkNotInWiki="true" imageTargetNotInRaw="true" repoRelativeAcrossVcsRoots="true" multipleWikiTargetsMatch="true" unresolvedLinkReference="true" linkIsIgnored="true" anchorIsIgnored="true" anchorIsUnresolved="true" anchorLineReferenceIsUnresolved="true" anchorLineReferenceFormat="true" anchorHasDuplicates="true" abbreviationDuplicates="true" abbreviationNotUsed="true" attributeIdDuplicateDefinition="true" attributeIdNotUsed="true" footnoteDuplicateDefinition="true" footnoteUnresolved="true" footnoteDuplicates="true" footnoteNotUsed="true" macroDuplicateDefinition="true" macroUnresolved="true" macroDuplicates="true" macroNotUsed="true" referenceDuplicateDefinition="true" referenceUnresolved="true" referenceDuplicates="true" referenceNotUsed="true" referenceUnresolvedNumericId="true" enumRefDuplicateDefinition="true" enumRefUnresolved="true" enumRefDuplicates="true" enumRefNotUsed="true" enumRefLinkUnresolved="true" enumRefLinkDuplicates="true" simTocUpdateNeeded="true" simTocTitleSpaceNeeded="true" />
<HtmlExportSettings updateOnSave="false" parentDir="" targetDir="" cssDir="css" scriptDir="js" plainHtml="false" imageDir="" copyLinkedImages="false" imagePathType="0" targetPathType="2" targetExt="" useTargetExt="false" noCssNoScripts="false" useElementStyleAttribute="false" linkToExportedHtml="true" exportOnSettingsChange="true" regenerateOnProjectOpen="false" linkFormatType="HTTP_ABSOLUTE" />
<LinkMapSettings>
<textMaps />
</LinkMapSettings>
</component>
</project>

62
.idea/markdown-navigator.xml generated Normal file
View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownProjectSettings">
<PreviewSettings splitEditorLayout="SPLIT" splitEditorPreview="PREVIEW" useGrayscaleRendering="false" zoomFactor="1.0" maxImageWidth="0" synchronizePreviewPosition="true" highlightPreviewType="LINE" highlightFadeOut="5" highlightOnTyping="true" synchronizeSourcePosition="true" verticallyAlignSourceAndPreviewSyncPosition="true" showSearchHighlightsInPreview="true" showSelectionInPreview="true" lastLayoutSetsDefault="false">
<PanelProvider>
<provider providerId="com.vladsch.md.nav.editor.swing.html.panel" providerName="Default - Swing" />
</PanelProvider>
</PreviewSettings>
<ParserSettings gitHubSyntaxChange="false" correctedInvalidSettings="false" emojiShortcuts="1" emojiImages="0">
<PegdownExtensions>
<option name="ATXHEADERSPACE" value="true" />
<option name="FENCED_CODE_BLOCKS" value="true" />
<option name="INTELLIJ_DUMMY_IDENTIFIER" value="true" />
<option name="RELAXEDHRULES" value="true" />
<option name="STRIKETHROUGH" value="true" />
<option name="TABLES" value="true" />
<option name="TASKLISTITEMS" value="true" />
</PegdownExtensions>
<ParserOptions>
<option name="COMMONMARK_LISTS" value="true" />
<option name="EMOJI_SHORTCUTS" value="true" />
<option name="GFM_TABLE_RENDERING" value="true" />
<option name="PRODUCTION_SPEC_PARSER" value="true" />
<option name="SIM_TOC_BLANK_LINE_SPACER" value="true" />
</ParserOptions>
</ParserSettings>
<HtmlSettings headerTopEnabled="false" headerBottomEnabled="false" bodyTopEnabled="false" bodyBottomEnabled="false" addPageHeader="false" addAnchorLinks="false" anchorLinksWrapText="false" imageUriSerials="false" addDocTypeHtml="true" noParaTags="false" defaultUrlTitle="false" migratedPlantUml="true" migratedAnchorLinks="true" plantUmlConversion="0">
<GeneratorProvider>
<provider providerId="com.vladsch.md.nav.editor.text.html.generator" providerName="Unmodified HTML Generator" />
</GeneratorProvider>
<headerTop />
<headerBottom />
<bodyTop />
<bodyBottom />
<fencedCodeConversions>
<option name="c4plantuml" value="NONE" />
<option name="ditaa" value="NONE" />
<option name="erd" value="NONE" />
<option name="graphviz" value="NONE" />
<option name="latex" value="KATEX" />
<option name="math" value="KATEX" />
<option name="mermaid" value="NONE" />
<option name="nomnoml" value="NONE" />
<option name="plantuml" value="NONE" />
<option name="puml" value="NONE" />
<option name="svgbob" value="NONE" />
<option name="umlet" value="NONE" />
<option name="vega" value="NONE" />
<option name="vegalite" value="NONE" />
<option name="wavedrom" value="NONE" />
</fencedCodeConversions>
</HtmlSettings>
<CssSettings previewScheme="UI_SCHEME" cssUri="" isCssUriEnabled="false" isCssUriSerial="true" isCssTextEnabled="false" isDynamicPageWidth="true">
<StylesheetProvider>
<provider providerId="com.vladsch.md.nav.editor.text.html.css" providerName="No Stylesheet" />
</StylesheetProvider>
<ScriptProviders />
<cssText />
<cssUriHistory />
</CssSettings>
</component>
</project>

2
.idea/misc.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

10
.idea/runConfigurations.xml generated Normal file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
</set>
</option>
</component>
</project>

1
app/.gitignore vendored
View File

@@ -1 +1,2 @@
/build /build
/release

View File

@@ -11,8 +11,8 @@ android {
applicationId "top.fumiama.copymanga" applicationId "top.fumiama.copymanga"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 30 targetSdkVersion 30
versionCode 10 versionCode 11
versionName '1.3.2' versionName '1.3.3'
resConfigs "zh", "zh-rCN" resConfigs "zh", "zh-rCN"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
@@ -42,6 +42,10 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}*/ }*/
} }
viewBinding {
enabled = true
}
} }
dependencies { dependencies {
@@ -53,11 +57,11 @@ dependencies {
implementation 'androidx.cardview:cardview:1.0.0' implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0' implementation 'androidx.viewpager2:viewpager2:1.0.0'
//implementation 'com.google.android.material:material:1.2.1' //implementation 'com.google.android.material:material:1.2.1'
testImplementation 'junit:junit:4.13.1' testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
implementation 'com.github.bumptech.glide:glide:4.11.0' implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.code.gson:gson:2.8.6'
//implementation 'com.liaoinstan.springview:library:1.7.0' //implementation 'com.liaoinstan.springview:library:1.7.0'
} }
@@ -94,8 +98,8 @@ andResGuard {
"*.gif", "*.gif",
] ]
sevenzip { sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.20' //artifact = 'com.tencent.mm:SevenZip:1.2.21'
//path = "/usr/local/bin/7za" path = "7za"
} }
/** /**

BIN
app/release/app-release.apk Normal file

Binary file not shown.

View File

@@ -0,0 +1,18 @@
{
"version": 2,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "top.fumiama.copymanga",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"versionCode": 11,
"versionName": "1.3.3",
"outputFile": "app-release.apk"
}
]
}

View File

@@ -1,8 +1,8 @@
javascript: javascript:
if (typeof (loaded) == "undefined"){ if (typeof (loaded) == "undefined"){
var loaded = true; var loaded = true;
function scanChapters(chapter){ function scanChapters(chapter) {
var chapterList = chapter.getElementsByClassName("table-all")[0].getElementsByTagName("a"); var chapterList = chapter.getElementsByClassName("tab-pane fade show active")[0].getElementsByTagName("ul")[0].getElementsByTagName("a");
var chapterArr = Array(); var chapterArr = Array();
for(var i = 0; i < chapterList.length; i++){ for(var i = 0; i < chapterList.length; i++){
chapterArr.push(JSON.constructor()); chapterArr.push(JSON.constructor());
@@ -11,7 +11,7 @@ if (typeof (loaded) == "undefined"){
} }
return chapterArr; return chapterArr;
} }
function modify(){ function modify() {
var url = location.href; var url = location.href;
if(url.indexOf("/chapter/")>0){ if(url.indexOf("/chapter/")>0){
var imglist = document.getElementsByClassName("container-fluid comicContent")[0].getElementsByTagName("li"); var imglist = document.getElementsByClassName("container-fluid comicContent")[0].getElementsByTagName("li");
@@ -22,7 +22,7 @@ if (typeof (loaded) == "undefined"){
var liststr = document.title.split(" - ")[1] + " " + location.href.substring(location.href.lastIndexOf("/")+1) + "\n" + nextChapter + "\n" + prevChapter; var liststr = document.title.split(" - ")[1] + " " + location.href.substring(location.href.lastIndexOf("/")+1) + "\n" + nextChapter + "\n" + prevChapter;
for(var i = 0; i < imglist.length; i++) liststr += "\n" + imglist[i].getElementsByTagName("img")[0].dataset.src; for(var i = 0; i < imglist.length; i++) liststr += "\n" + imglist[i].getElementsByTagName("img")[0].dataset.src;
GM.loadChapter(liststr); GM.loadChapter(liststr);
}else { } else {
var json = Array(); var json = Array();
var chapters = document.getElementsByClassName("upLoop")[0].children; var chapters = document.getElementsByClassName("upLoop")[0].children;
var newObj = null; var newObj = null;

View File

@@ -21,6 +21,7 @@ import kotlinx.android.synthetic.main.widget_titlebar.*
import top.fumiama.copymanga.R import top.fumiama.copymanga.R
import top.fumiama.copymanga.activity.MainActivity.Companion.mh import top.fumiama.copymanga.activity.MainActivity.Companion.mh
import top.fumiama.copymanga.data.ComicStructure import top.fumiama.copymanga.data.ComicStructure
import top.fumiama.copymanga.databinding.ActivityDlBinding
import top.fumiama.copymanga.handler.DlHandler import top.fumiama.copymanga.handler.DlHandler
import top.fumiama.copymanga.tool.MangaDlTools import top.fumiama.copymanga.tool.MangaDlTools
import top.fumiama.copymanga.tool.MangaDlTools.Companion.wmdlt import top.fumiama.copymanga.tool.MangaDlTools.Companion.wmdlt
@@ -30,8 +31,6 @@ import top.fumiama.copymanga.view.LazyScrollView
import java.io.File import java.io.File
import java.lang.Thread.sleep import java.lang.Thread.sleep
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.zip.ZipFile
class DlActivity : Activity() { class DlActivity : Activity() {
private var tbtncnt = 0 private var tbtncnt = 0
@@ -55,7 +54,8 @@ class DlActivity : Activity() {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dl) val binding = ActivityDlBinding.inflate(layoutInflater)
setContentView(binding.root)
mh?.saveUrlsOnly = true mh?.saveUrlsOnly = true
mangaDlTools = MangaDlTools(this) mangaDlTools = MangaDlTools(this)
handler.sendEmptyMessage(-2) //setLayouts handler.sendEmptyMessage(-2) //setLayouts

View File

@@ -2,16 +2,15 @@ package top.fumiama.copymanga.activity
import android.app.Activity import android.app.Activity
import android.app.AlertDialog import android.app.AlertDialog
import android.app.Dialog
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.util.Log
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import android.widget.Toast import android.widget.Toast
import kotlinx.android.synthetic.main.activity_dlist.* import kotlinx.android.synthetic.main.activity_dlist.*
import kotlinx.android.synthetic.main.widget_titlebar.* import kotlinx.android.synthetic.main.widget_titlebar.*
import top.fumiama.copymanga.R import top.fumiama.copymanga.R
import top.fumiama.copymanga.databinding.ActivityDlistBinding
import top.fumiama.copymanga.handler.DlLHandler import top.fumiama.copymanga.handler.DlLHandler
import java.io.File import java.io.File
import java.util.regex.Pattern import java.util.regex.Pattern
@@ -23,7 +22,8 @@ class DlListActivity:Activity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_dlist) val binding = ActivityDlistBinding.inflate(layoutInflater)
setContentView(binding.root)
ttitle.text = intent.getStringExtra("title") ttitle.text = intent.getStringExtra("title")
handler = DlLHandler(Looper.myLooper()!!, this) handler = DlLHandler(Looper.myLooper()!!, this)
handler?.obtainMessage(3, currentDir)?.sendToTarget() //call scanFile handler?.obtainMessage(3, currentDir)?.sendToTarget() //call scanFile

View File

@@ -3,13 +3,17 @@ package top.fumiama.copymanga.activity
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.Intent import android.content.Intent
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.Looper import android.os.Looper
import android.view.View import android.view.View
import android.webkit.ValueCallback
import android.webkit.WebView import android.webkit.WebView
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import top.fumiama.copymanga.R import top.fumiama.copymanga.R
import top.fumiama.copymanga.databinding.ActivityMainBinding
import top.fumiama.copymanga.handler.MainHandler import top.fumiama.copymanga.handler.MainHandler
import top.fumiama.copymanga.tool.SetDraggable
import top.fumiama.copymanga.tool.ToolsBox import top.fumiama.copymanga.tool.ToolsBox
import top.fumiama.copymanga.view.JSWebView import top.fumiama.copymanga.view.JSWebView
import top.fumiama.copymanga.web.JS import top.fumiama.copymanga.web.JS
@@ -19,11 +23,13 @@ import java.lang.ref.WeakReference
class MainActivity: Activity() { class MainActivity: Activity() {
var wh: JSWebView? = null var wh: JSWebView? = null
var toolsBox: ToolsBox? = null var uploadMessageAboveL: ValueCallback<Array<Uri>>? = null
private var toolsBox: ToolsBox? = null
@SuppressLint("JavascriptInterface") @SuppressLint("JavascriptInterface")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
wm = WeakReference(this) wm = WeakReference(this)
mh = MainHandler(Looper.myLooper()!!) mh = MainHandler(Looper.myLooper()!!)
@@ -43,6 +49,7 @@ class MainActivity: Activity() {
wh?.loadJSInterface(JSHidden()) wh?.loadJSInterface(JSHidden())
} }
} }
SetDraggable().with(this).onto(fab)
} }
override fun onBackPressed() { override fun onBackPressed() {
@@ -50,6 +57,41 @@ class MainActivity: Activity() {
else super.onBackPressed() else super.onBackPressed()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == FILE_CHOOSER_RESULT_CODE) { //处理返回的图片,并进行上传
if (uploadMessageAboveL == null) return
else {
if(resultCode == RESULT_OK) {
data?.apply {
if(uploadMessageAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, this)
}
}
}
}
}
}
private fun onActivityResultAboveL(requestCode: Int, resultCode: Int, intent: Intent) {
if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null) return
else {
if (resultCode == RESULT_OK) {
intent.clipData?.apply {
var results = arrayOf<Uri>()
for(i in 0..itemCount) {
val item = getItemAt(i)
results += item.uri
}
intent.dataString?.apply {
uploadMessageAboveL?.onReceiveValue(results)
uploadMessageAboveL = null
}
}
}
}
}
fun onFabClicked(v: View){ fun onFabClicked(v: View){
DlListActivity.currentDir = getExternalFilesDir("") DlListActivity.currentDir = getExternalFilesDir("")
startActivity( startActivity(
@@ -58,7 +100,16 @@ class MainActivity: Activity() {
) )
} }
fun openImageChooserActivity() {
//调用自己的图库
val i = Intent(Intent.ACTION_GET_CONTENT)
i.addCategory(Intent.CATEGORY_OPENABLE)
i.type = "image/*"
startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE)
}
companion object{ companion object{
const val FILE_CHOOSER_RESULT_CODE = 1
var wm: WeakReference<MainActivity>? = null var wm: WeakReference<MainActivity>? = null
var mh: MainHandler? = null var mh: MainHandler? = null
} }

View File

@@ -7,6 +7,7 @@ import android.graphics.Bitmap
import android.graphics.BitmapFactory import android.graphics.BitmapFactory
import android.os.* import android.os.*
import android.util.Log import android.util.Log
import android.view.KeyEvent
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@@ -25,6 +26,7 @@ import kotlinx.android.synthetic.main.widget_titlebar.*
import kotlinx.android.synthetic.main.widget_viewmangainfo.* import kotlinx.android.synthetic.main.widget_viewmangainfo.*
import top.fumiama.copymanga.R import top.fumiama.copymanga.R
import top.fumiama.copymanga.activity.MainActivity.Companion.wm import top.fumiama.copymanga.activity.MainActivity.Companion.wm
import top.fumiama.copymanga.databinding.ActivityViewmangaBinding
import top.fumiama.copymanga.handler.TimeThread import top.fumiama.copymanga.handler.TimeThread
import top.fumiama.copymanga.tool.PropertiesTools import top.fumiama.copymanga.tool.PropertiesTools
import top.fumiama.copymanga.tool.ToolsBox import top.fumiama.copymanga.tool.ToolsBox
@@ -35,23 +37,23 @@ import java.util.*
import java.util.zip.ZipFile import java.util.zip.ZipFile
import java.util.zip.ZipInputStream import java.util.zip.ZipInputStream
class ViewMangaActivity : Activity() { class ViewMangaActivity : Activity() {
var count = 0
lateinit var handler: Handler lateinit var handler: Handler
lateinit var tt: TimeThread lateinit var tt: TimeThread
lateinit var toolsBox: ToolsBox
var count = 0
var clicked = false var clicked = false
private var isInSeek = false
private var useFullScreen = false
var r2l = true var r2l = true
var infoDrawerDelta = 0f
private lateinit var p: PropertiesTools
private var isInSeek = false
private var currentItem = 0 private var currentItem = 0
private var notUseVP = true private var notUseVP = true
//private var q = 90
var infoDrawerDelta = 0f
lateinit var toolsBox: ToolsBox
private lateinit var p: PropertiesTools
private var mangaZip = zipFile private var mangaZip = zipFile
val dlZip2View = mangaZip != null val dlZip2View = mangaZip != null
private val volTurnPage get() = p["volturn"] == "true"
var pageNum = 1 var pageNum = 1
get() { get() {
field = getPageNumber() field = getPageNumber()
@@ -75,22 +77,18 @@ class ViewMangaActivity : Activity() {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_viewmanga) val binding = ActivityViewmangaBinding.inflate(layoutInflater)
setContentView(binding.root)
toolsBox = ToolsBox(WeakReference(this)) toolsBox = ToolsBox(WeakReference(this))
va = WeakReference(this) va = WeakReference(this)
p = PropertiesTools(File("$filesDir/settings.properties")) p = PropertiesTools(File("$filesDir/settings.properties"))
useFullScreen = p["useFullScreen"] != "true"
r2l = p["r2l"] == "true" r2l = p["r2l"] == "true"
//toolsBox = ToolsBox(WeakReference(this))
notUseVP = p["noAnimation"] == "true" notUseVP = p["noAnimation"] == "true"
handler = MyHandler(infcard, toolsBox) handler = MyHandler(infcard, toolsBox)
//if (p["quality"] == "null") p["quality"] = "90"
//else q = p["quality"].toInt()
tt = TimeThread(handler, 22) tt = TimeThread(handler, 22)
tt.canDo = true tt.canDo = true
tt.start() tt.start()
ttitle.text = titleText ttitle.text = titleText
//isearch.visibility = View.VISIBLE
Log.d("MyVM", "dlZip2View: $dlZip2View, mangaZip: $mangaZip") Log.d("MyVM", "dlZip2View: $dlZip2View, mangaZip: $mangaZip")
if(dlZip2View && mangaZip?.exists() != true) toolsBox.toastError("已经到头了~") if(dlZip2View && mangaZip?.exists() != true) toolsBox.toastError("已经到头了~")
else { else {
@@ -118,11 +116,25 @@ class ViewMangaActivity : Activity() {
override fun onWindowFocusChanged(hasFocus: Boolean) { override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus) super.onWindowFocusChanged(hasFocus)
if (useFullScreen) { window.decorView.systemUiVisibility =
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) window.setDecorFitsSystemWindows(false)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) window.setDecorFitsSystemWindows(false) }
@ExperimentalStdlibApi
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
var flag = false
if(volTurnPage) when(keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
scrollBack()
flag = true
}
KeyEvent.KEYCODE_VOLUME_DOWN -> {
scrollForward()
flag = true
}
} }
return if(flag) true else super.onKeyDown(keyCode, event)
} }
private fun getPageNumber(): Int { private fun getPageNumber(): Int {
@@ -139,18 +151,7 @@ class ViewMangaActivity : Activity() {
if (position >= count || position < 0) return null if (position >= count || position < 0) return null
else { else {
val zip = ZipFile(mangaZip) val zip = ZipFile(mangaZip)
//if (q == 100)
return BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp"))) return BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.webp")))
/*else {
val out = ByteArrayOutputStream()
try {
BitmapFactory.decodeStream(zip.getInputStream(zip.getEntry("${position}.jpg")))
} catch (e: Exception) {
e.printStackTrace()
return null
}?.compress(Bitmap.CompressFormat.JPEG, q, out)
return BitmapFactory.decodeStream(ByteArrayInputStream(out.toByteArray()))
}*/
} }
} }
@@ -175,7 +176,7 @@ class ViewMangaActivity : Activity() {
prepareInfoBar(count) prepareInfoBar(count)
if (notUseVP) loadOneImg() else prepareIdBtVH() if (notUseVP) loadOneImg() else prepareIdBtVH()
toolsBox.dp2px(67)?.let { setIdPosition(it) } toolsBox.dp2px(67)?.let { setIdPosition(it) }
prepareIdBtFullScreen() prepareIdBtVolTurn()
prepareIdBtVP() prepareIdBtVP()
prepareIdBtLR() prepareIdBtLR()
} }
@@ -220,7 +221,6 @@ class ViewMangaActivity : Activity() {
if (!isInSeek) hideObjs() if (!isInSeek) hideObjs()
updateSeekText() updateSeekText()
updateSeekProgress() updateSeekProgress()
sendProgress()
} }
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@@ -265,13 +265,11 @@ class ViewMangaActivity : Activity() {
} }
} }
private fun prepareIdBtFullScreen() { private fun prepareIdBtVolTurn() {
idtbfullscreen.isChecked = !useFullScreen idtbvolturn.isChecked = volTurnPage
idtbfullscreen.setOnClickListener { idtbvolturn.setOnClickListener {
if (idtbfullscreen.isChecked) p["useFullScreen"] = if (idtbvolturn.isChecked) p["volturn"] = "true"
"true" else p["volturn"] = "false"
else p["useFullScreen"] = "false"
Toast.makeText(this, "下次浏览生效", Toast.LENGTH_SHORT).show()
} }
} }
@@ -305,10 +303,6 @@ class ViewMangaActivity : Activity() {
pageNum++ pageNum++
} }
private fun sendProgress() {
}
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private fun updateSeekText() { private fun updateSeekText() {
inftxtprogress.text = "$pageNum/$count" inftxtprogress.text = "$pageNum/$count"

View File

@@ -7,45 +7,55 @@ import java.io.InputStream
import java.util.* import java.util.*
class PropertiesTools(private val f: File):Properties() { class PropertiesTools(private val f: File):Properties() {
private val propfile:File private var cache = hashMapOf<String, String>()
get() {
init {
if(!f.exists()) { if(!f.exists()) {
if(f.parentFile?.exists() != true) f.parentFile?.mkdirs() if(f.parentFile?.exists() != true) f.parentFile?.mkdirs()
if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true) if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true)
createNew(f) createNew(f)
}else if(f.isDirectory) { } else if(f.isDirectory) {
if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true) if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true)
f.delete() f.delete()
createNew(f) createNew(f)
} }
if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true) if(f.parentFile?.canWrite() != true) f.parentFile?.setWritable(true)
if(f.parentFile?.canRead() != true) f.parentFile?.setReadable(true) if(f.parentFile?.canRead() != true) f.parentFile?.setReadable(true)
return f
} }
private fun createNew(f: File){
private fun createNew(f: File) {
f.createNewFile() f.createNewFile()
val o = f.outputStream() val o = f.outputStream()
this.storeToXML(o, "store") this.storeToXML(o, "store")
Log.d("MyPT", "Generate new prop.") Log.d("MyPT", "Generate new prop.")
o.close() o.close()
} }
private fun loadFromXml(`in`: InputStream?): PropertiesTools { private fun loadFromXml(`in`: InputStream?): PropertiesTools {
this.loadFromXML(`in`) this.loadFromXML(`in`)
return this return this
} }
private fun setProp(key: String?, value: String?): PropertiesTools { private fun setProp(key: String?, value: String?): PropertiesTools {
this.setProperty(key, value) this.setProperty(key, value)
return this return this
} }
operator fun get(key: String): String{ operator fun get(key: String): String{
val i = propfile.inputStream() return if(cache.containsKey(key)) cache[key]?:"null"
val re = this.loadFromXml(i).getProperty(key)?:"null" else {
Log.d("MyPT", "Get $key = $re") val i = f.inputStream()
i.close() val re = this.loadFromXml(i).getProperty(key)?:"null"
return re Log.d("MyPT", "Read $key = $re")
i.close()
cache[key] = re
re
}
} }
operator fun set(key: String, value: String){
val o = propfile.outputStream() operator fun set(key: String, value: String) {
cache[key] = value
val o = f.outputStream()
this.setProp(key, value).storeToXML(o, "store") this.setProp(key, value).storeToXML(o, "store")
Log.d("MyPT", "Set $key = $value") Log.d("MyPT", "Set $key = $value")
o.close() o.close()

View File

@@ -0,0 +1,62 @@
package top.fumiama.copymanga.tool
import android.content.Context
import android.view.MotionEvent
import android.view.View
import kotlin.math.abs
class SetDraggable {
private var screenWidth = 0
private var screenHeight = 0
fun with(context: Context): SetDraggable {
val dm = context.resources.displayMetrics
screenWidth = dm.widthPixels
screenHeight = dm.heightPixels
return this
}
fun onto(target: View) {
var lastX = 0
var lastY = 0
var firstX = 0
var firstY = 0
target.setOnTouchListener { v: View, event: MotionEvent ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
lastX = event.rawX.toInt()
lastY = event.rawY.toInt()
firstX = lastX
firstY = lastY
}
MotionEvent.ACTION_MOVE -> {
val dx = event.rawX.toInt() - lastX
val dy = event.rawY.toInt() - lastY
var left = v.left + dx
var top = v.top + dy
var right = v.right + dx
var bottom = v.bottom + dy
if (left < 0) {
left = 0
right = left + v.width
}
if (right > screenWidth) {
right = screenWidth
left = right - v.width
}
if (top < 0) {
top = 0
bottom = top + v.height
}
if (bottom > screenHeight) {
bottom = screenHeight
top = bottom - v.height
}
v.layout(left, top, right, bottom)
lastX = event.rawX.toInt()
lastY = event.rawY.toInt()
}
}
abs(firstX - lastX) > 3 || abs(firstY - lastY) > 3 //移动微小则判断为点击
}
}
}

View File

@@ -1,10 +1,10 @@
package top.fumiama.copymanga.web package top.fumiama.copymanga.web
import android.webkit.JsPromptResult import android.net.Uri
import android.webkit.JsResult import android.webkit.*
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
import android.webkit.WebView
import top.fumiama.copymanga.activity.MainActivity.Companion.mh import top.fumiama.copymanga.activity.MainActivity.Companion.mh
import top.fumiama.copymanga.activity.MainActivity.Companion.wm
class WebChromeClient:WebChromeClient() { class WebChromeClient:WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) { override fun onProgressChanged(view: WebView?, newProgress: Int) {
@@ -43,4 +43,16 @@ class WebChromeClient:WebChromeClient() {
result?.confirm() result?.confirm()
return true return true
} }
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: ValueCallback<Array<Uri>>?,
fileChooserParams: FileChooserParams?
): Boolean {
wm?.get()?.apply {
uploadMessageAboveL = filePathCallback
openImageChooserActivity()
}
return true
}
} }

View File

@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<top.fumiama.copymanga.view.ChapterToggleButton xmlns:android="http://schemas.android.com/apk/res/android" <top.fumiama.copymanga.view.ChapterToggleButton
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"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:id="@+id/tbtn" android:id="@+id/tbtn"
android:layout_width="64dp" android:layout_width="64dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android" <View xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:id="@+id/divider" android:id="@+id/divider"
android:layout_height="1dp" android:layout_height="1dp"

View File

@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:id="@+id/ltbtn" android:id="@+id/ltbtn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="64dp" android:layout_height="64dp"

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:id="@+id/onecons" android:id="@+id/onecons"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:id="@+id/csdwn" android:id="@+id/csdwn"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"

View File

@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
@@ -39,7 +41,7 @@
app:layout_constraintVertical_bias="0.0" /> app:layout_constraintVertical_bias="0.0" />
<ToggleButton <ToggleButton
android:id="@+id/idtbfullscreen" android:id="@+id/idtbvolturn"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="48dp" android:layout_height="48dp"
android:layout_marginStart="8dp" android:layout_marginStart="8dp"
@@ -47,8 +49,8 @@
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp" android:layout_marginBottom="8dp"
android:background="@drawable/toggle_button" android:background="@drawable/toggle_button"
android:textOff="全屏开" android:textOff="音量翻页关"
android:textOn="全屏关" android:textOn="音量翻页开"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/idtbvh" app:layout_constraintEnd_toStartOf="@+id/idtbvh"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
@@ -64,8 +66,8 @@
android:textOff="横向" android:textOff="横向"
android:textOn="竖向" android:textOn="竖向"
app:layout_constraintEnd_toStartOf="@id/idtbvp" app:layout_constraintEnd_toStartOf="@id/idtbvp"
app:layout_constraintStart_toEndOf="@+id/idtbfullscreen" app:layout_constraintStart_toEndOf="@+id/idtbvolturn"
app:layout_constraintTop_toTopOf="@+id/idtbfullscreen" /> app:layout_constraintTop_toTopOf="@+id/idtbvolturn" />
<ToggleButton <ToggleButton
android:id="@+id/idtbvp" android:id="@+id/idtbvp"
@@ -77,7 +79,7 @@
android:textOn="动画关" android:textOn="动画关"
app:layout_constraintEnd_toStartOf="@+id/idtblr" app:layout_constraintEnd_toStartOf="@+id/idtblr"
app:layout_constraintStart_toEndOf="@id/idtbvh" app:layout_constraintStart_toEndOf="@id/idtbvh"
app:layout_constraintTop_toTopOf="@+id/idtbfullscreen" /> app:layout_constraintTop_toTopOf="@+id/idtbvolturn" />
<ToggleButton <ToggleButton
android:id="@+id/idtblr" android:id="@+id/idtblr"
@@ -89,7 +91,7 @@
android:textOn="←后 前→" android:textOn="←后 前→"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/idtbvp" app:layout_constraintStart_toEndOf="@+id/idtbvp"
app:layout_constraintTop_toTopOf="@+id/idtbfullscreen" /> app:layout_constraintTop_toTopOf="@+id/idtbvolturn" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -2,6 +2,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:tools="http://schemas.android.com/tools"
tools:viewBindingIgnore="true"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">

View File

@@ -1,6 +1,6 @@
<resources> <resources>
<string name="app_name">拷贝漫画</string> <string name="app_name">拷贝漫画</string>
<string name="web_home">https://copymanga.net</string> <string name="web_home">https://www.copymanga.com/h5/init</string>
<string name="web_home_www">https://www.copymanga.net</string> <string name="web_home_www">https://www.copymanga.net</string>
<string name="web_comic_detail_pc">https://www.copymanga.net/comic</string> <string name="web_comic_detail_pc">https://www.copymanga.net/comic</string>

View File

@@ -1,14 +1,14 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules. // Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript { buildscript {
ext.kotlin_version = '1.4.21' ext.kotlin_version = '1.5.0'
repositories { repositories {
google() google()
jcenter() jcenter()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:4.1.2' classpath 'com.android.tools.build:gradle:4.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.20' classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.21'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files