| @@ -74,6 +74,8 @@ dependencies { | |||||
| implementation files('libs/wenote.jar') | implementation files('libs/wenote.jar') | ||||
| implementation 'com.github.bumptech.glide:glide:4.11.0' | implementation 'com.github.bumptech.glide:glide:4.11.0' | ||||
| implementation 'com.lzy.net:okgo:3.0.4' | implementation 'com.lzy.net:okgo:3.0.4' | ||||
| implementation 'com.blankj:utilcodex:1.30.5' | |||||
| implementation 'com.google.code.gson:gson:2.8.6' | |||||
| annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' | annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' | ||||
| @@ -19,3 +19,74 @@ | |||||
| # If you keep the line number information, uncomment this to | # If you keep the line number information, uncomment this to | ||||
| # hide the original source file name. | # hide the original source file name. | ||||
| #-renamesourcefileattribute SourceFile | #-renamesourcefileattribute SourceFile | ||||
| -flattenpackagehierarchy | |||||
| -allowaccessmodification | |||||
| -keepattributes Exceptions,InnerClasses,Signature,SourceFile,LineNumberTable | |||||
| -dontskipnonpubliclibraryclassmembers | |||||
| -ignorewarnings | |||||
| #kotlin | |||||
| -keep class kotlin.Metadata { *; } | |||||
| -dontwarn kotlin.** | |||||
| -keepclassmembers class **$WhenMappings { | |||||
| <fields>; | |||||
| } | |||||
| -keepclassmembers class kotlin.Metadata { | |||||
| public <methods>; | |||||
| } | |||||
| -assumenosideeffects class kotlin.jvm.internal.Intrinsics { | |||||
| static void checkParameterIsNotNull(java.lang.Object, java.lang.String); | |||||
| } | |||||
| -keepclasseswithmembernames class * { | |||||
| native <methods>; | |||||
| } | |||||
| -keepclassmembers class * extends android.app.Activity { | |||||
| public void *(android.view.View); | |||||
| } | |||||
| -keepclassmembers class * implements android.os.Parcelable { | |||||
| public static final android.os.Parcelable$Creator *; | |||||
| } | |||||
| -keep class **.R$* {*;} | |||||
| -keepclassmembers enum * { *;} | |||||
| #Gson | |||||
| -keepclassmembers public class com.google.gson.** | |||||
| -keepclassmembers public class com.google.gson.** {public private protected *;} | |||||
| -keepclassmembers public class com.project.mocha_patient.login.SignResponseData { private *; } | |||||
| -keepclassmembers class sun.misc.Unsafe { *; } | |||||
| -keep @interface com.google.gson.annotations.SerializedName | |||||
| -keepclassmembers class * { | |||||
| @com.google.gson.annotations.SerializedName <fields>; | |||||
| } | |||||
| #bean | |||||
| -keep class com.yzx.webebook.model.** { *; } | |||||
| -keep class com.yzx.webebook.model.Note { *; } | |||||
| -keep class com.yzx.webebook.model.UploadBean { *; } | |||||
| -keep class com.yzx.webebook.model.UploadContent { *; } | |||||
| -keep class **$Properties {*;} | |||||
| #Glide | |||||
| -keep public class * implements com.bumptech.glide.module.GlideModule | |||||
| -keep public class * extends com.bumptech.glide.module.AppGlideModule | |||||
| -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { | |||||
| **[] $VALUES; | |||||
| public *; | |||||
| } | |||||
| # for DexGuard only | |||||
| #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule | |||||
| -dontwarn com.bumptech.glide.** | |||||
| # ProGuard configurations for Bugtags | |||||
| -keepattributes LineNumberTable,SourceFile | |||||
| -dontwarn com.bugtags.library.** | |||||
| -dontwarn io.bugtags.** | |||||
| -dontwarn org.apache.http.** | |||||
| -dontwarn android.net.http.AndroidHttpClient | |||||
| @@ -21,6 +21,7 @@ | |||||
| android:roundIcon="@mipmap/ic_launcher_round" | android:roundIcon="@mipmap/ic_launcher_round" | ||||
| android:supportsRtl="true" | android:supportsRtl="true" | ||||
| android:theme="@style/AppTheme"> | android:theme="@style/AppTheme"> | ||||
| <activity android:name=".activity.NoteActivity"></activity> | |||||
| <activity | <activity | ||||
| android:name=".activity.WebActivity" | android:name=".activity.WebActivity" | ||||
| android:configChanges="orientation|keyboard" | android:configChanges="orientation|keyboard" | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.yzx.webebook | package com.yzx.webebook | ||||
| import android.app.Application | import android.app.Application | ||||
| import com.blankj.utilcode.util.Utils | |||||
| import com.lzy.okgo.OkGo | import com.lzy.okgo.OkGo | ||||
| class App: Application() { | class App: Application() { | ||||
| @@ -8,5 +9,6 @@ class App: Application() { | |||||
| override fun onCreate() { | override fun onCreate() { | ||||
| super.onCreate() | super.onCreate() | ||||
| OkGo.getInstance().init(this) | OkGo.getInstance().init(this) | ||||
| Utils.init(this) | |||||
| } | } | ||||
| } | } | ||||
| @@ -3,8 +3,10 @@ package com.yzx.webebook | |||||
| 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.text.TextUtils | |||||
| import com.bumptech.glide.Glide | import com.bumptech.glide.Glide | ||||
| import com.yzx.webebook.activity.BookActivity | import com.yzx.webebook.activity.BookActivity | ||||
| import com.yzx.webebook.activity.NoteActivity | |||||
| import com.yzx.webebook.activity.WebActivity | import com.yzx.webebook.activity.WebActivity | ||||
| import com.yzx.webebook.activity.base.BaseActivity | import com.yzx.webebook.activity.base.BaseActivity | ||||
| import com.yzx.webebook.presenter.base.BasePresenter | import com.yzx.webebook.presenter.base.BasePresenter | ||||
| @@ -36,10 +38,20 @@ class MainActivity : BaseActivity<BasePresenter<*>>() { | |||||
| WebActivity.active(this, editText.text.toString()) | WebActivity.active(this, editText.text.toString()) | ||||
| } | } | ||||
| btn4.setOnClickListener { | btn4.setOnClickListener { | ||||
| BookActivity.active(this,"教育云空间","f04be754f6cb3f6168f582403a514c39","filec","",1,1) | |||||
| BookActivity.active( | |||||
| this, | |||||
| "教育云空间", | |||||
| "f04be754f6cb3f6168f582403a514c39", | |||||
| "filec", | |||||
| "", | |||||
| 1, | |||||
| 1 | |||||
| ) | |||||
| } | } | ||||
| btn5.setOnClickListener { | btn5.setOnClickListener { | ||||
| BookActivity.active(this,"教育云空间(无图)","","","",2,2) | |||||
| // BookActivity.active(this,"教育云空间(无图)","","","",2,2) | |||||
| val json ="" | |||||
| NoteActivity.active(this, "测试笔记写字", json) | |||||
| } | } | ||||
| /*OkGo.post<String>("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") | /*OkGo.post<String>("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") | ||||
| @@ -75,16 +87,25 @@ class MainActivity : BaseActivity<BasePresenter<*>>() { | |||||
| override fun initPresenter(): BasePresenter<*>? = null | override fun initPresenter(): BasePresenter<*>? = null | ||||
| @SuppressLint("SetTextI18n") | @SuppressLint("SetTextI18n") | ||||
| override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { | |||||
| override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { | |||||
| super.onActivityResult(requestCode, resultCode, data) | super.onActivityResult(requestCode, resultCode, data) | ||||
| if(requestCode==BookActivity.REQ_CODE&&resultCode== Activity.RESULT_OK){ | |||||
| if (requestCode == BookActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { | |||||
| val mKey = data?.getStringExtra("key") | val mKey = data?.getStringExtra("key") | ||||
| val mIdentity = data?.getStringExtra("identity") | val mIdentity = data?.getStringExtra("identity") | ||||
| val url = "https://$mIdentity.oa.qbjjyyun.net/edufile/imageView?uniqueKey=$mKey" | |||||
| Glide.with(this) | |||||
| .load(url) | |||||
| .into(testImageView) | |||||
| if(!TextUtils.isEmpty(mKey)&&!TextUtils.isEmpty(mIdentity)){ | |||||
| val url = "https://$mIdentity.oa.qbjjyyun.net/edufile/imageView?uniqueKey=$mKey" | |||||
| Glide.with(this) | |||||
| .load(url) | |||||
| .into(testImageView) | |||||
| } | |||||
| val json = data?.getStringExtra("note_info")?:"" | |||||
| backInfo.text = json | |||||
| } | |||||
| if (requestCode == NoteActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { | |||||
| val json = data?.getStringExtra("note_info")?:"" | |||||
| backInfo.text = json | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,646 @@ | |||||
| package com.yzx.webebook.activity | |||||
| import android.Manifest | |||||
| import android.annotation.SuppressLint | |||||
| import android.app.Activity | |||||
| import android.content.BroadcastReceiver | |||||
| import android.content.Context | |||||
| import android.content.Intent | |||||
| import android.content.IntentFilter | |||||
| import android.content.pm.ActivityInfo | |||||
| import android.content.pm.PackageManager | |||||
| import android.graphics.Bitmap | |||||
| import android.graphics.Rect | |||||
| import android.graphics.drawable.Drawable | |||||
| import android.os.Handler | |||||
| import android.os.Message | |||||
| import android.text.TextUtils | |||||
| import android.util.Log | |||||
| import android.view.KeyEvent | |||||
| import android.view.View | |||||
| import android.widget.Toast | |||||
| import com.blankj.utilcode.util.FileUtils | |||||
| import com.blankj.utilcode.util.GsonUtils | |||||
| import com.blankj.utilcode.util.ImageUtils | |||||
| import com.bumptech.glide.Glide | |||||
| import com.bumptech.glide.load.engine.DiskCacheStrategy | |||||
| import com.bumptech.glide.request.target.CustomTarget | |||||
| import com.bumptech.glide.request.target.Target | |||||
| import com.bumptech.glide.request.transition.Transition | |||||
| import com.google.gson.Gson | |||||
| import com.lzy.okgo.OkGo | |||||
| import com.lzy.okgo.callback.StringCallback | |||||
| import com.lzy.okgo.model.Response | |||||
| import com.wetao.note.NotePageInfo | |||||
| import com.wetao.note.WeNoteView | |||||
| import com.wetao.note.WePoint | |||||
| import com.yzx.webebook.R | |||||
| import com.yzx.webebook.activity.base.BaseActivity | |||||
| import com.yzx.webebook.model.Note | |||||
| import com.yzx.webebook.presenter.base.BasePresenter | |||||
| import kotlinx.android.synthetic.main.activity_note.* | |||||
| import org.jetbrains.anko.startActivityForResult | |||||
| import org.jetbrains.anko.toast | |||||
| import org.json.JSONArray | |||||
| import org.json.JSONObject | |||||
| import java.io.File | |||||
| import java.util.* | |||||
| import kotlin.system.exitProcess | |||||
| /** | |||||
| * 笔记页面 | |||||
| */ | |||||
| class NoteActivity : BaseActivity<BasePresenter<*>>() { | |||||
| private val mBGDrawableList = intArrayOf( | |||||
| R.drawable.background0, | |||||
| R.drawable.background1, | |||||
| R.drawable.background2, | |||||
| R.drawable.background3, | |||||
| R.drawable.background4, | |||||
| R.drawable.background5, | |||||
| R.drawable.background6, | |||||
| R.drawable.background7, | |||||
| R.drawable.background8, | |||||
| R.drawable.background9, | |||||
| R.drawable.background10 | |||||
| ) | |||||
| private var mBgId = 0 | |||||
| private var mWePointList = mutableListOf<WePoint>() | |||||
| private var mHandler = Handler() | |||||
| private var mScreenH = 0 | |||||
| private var mScreenW = 0 | |||||
| private val MSG_SAVE_END = 2001 | |||||
| private var mNotePageInfo: NotePageInfo? = null | |||||
| private var notList = mutableListOf<Note>() | |||||
| private var currKey = "" | |||||
| private var currIndex = 0 | |||||
| val TAG = "NoteActivity" | |||||
| companion object { | |||||
| const val NOTE_FOLDER_DIR = "/mnt/sdcard/ebook/" | |||||
| const val REQ_CODE = 0x98 | |||||
| fun active(act: Activity, title: String, noteInfo: String) { | |||||
| act.startActivityForResult<NoteActivity>( | |||||
| REQ_CODE, | |||||
| "note_info" to noteInfo, | |||||
| "title" to title | |||||
| ) | |||||
| } | |||||
| } | |||||
| override val inflateId: Int | |||||
| get() = R.layout.activity_note | |||||
| override fun initView() { | |||||
| checkPermission() | |||||
| requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT | |||||
| mScreenH = resources.displayMetrics.heightPixels | |||||
| mScreenW = resources.displayMetrics.widthPixels | |||||
| //背景 | |||||
| new_init.setOnClickListener { | |||||
| note_view.setEnable(false) | |||||
| mBgId++ | |||||
| if (mBgId >= mBGDrawableList.size) { | |||||
| mBgId = 0 | |||||
| } | |||||
| note_view.updateBackground(mBGDrawableList[mBgId]) | |||||
| val note = notList[currIndex] | |||||
| note.BGid = mBgId | |||||
| } | |||||
| //清除 | |||||
| new_clear.setOnClickListener { | |||||
| note_view.clear(); | |||||
| } | |||||
| //笔 | |||||
| pen.setOnClickListener { | |||||
| if (note_view.isEraserEnable) { | |||||
| note_view.isEraserEnable = false | |||||
| pen.setCompoundDrawablesWithIntrinsicBounds( | |||||
| 0, | |||||
| R.mipmap.ic_book_pen_select, | |||||
| 0, | |||||
| 0 | |||||
| ) | |||||
| new_eraser.setCompoundDrawablesWithIntrinsicBounds( | |||||
| 0, | |||||
| R.mipmap.ic_book_rubber, | |||||
| 0, | |||||
| 0 | |||||
| ) | |||||
| } | |||||
| } | |||||
| //橡皮 | |||||
| new_eraser.setOnClickListener { | |||||
| if (!note_view.isEraserEnable) { | |||||
| note_view.isEraserEnable = true | |||||
| pen.setCompoundDrawablesWithIntrinsicBounds(0, R.mipmap.ic_book_pen, 0, 0) | |||||
| new_eraser.setCompoundDrawablesWithIntrinsicBounds( | |||||
| 0, | |||||
| R.mipmap.ic_book_rubber_select, | |||||
| 0, | |||||
| 0 | |||||
| ) | |||||
| } | |||||
| } | |||||
| //加纸 | |||||
| new_add.setOnClickListener { | |||||
| notList.add(Note()) | |||||
| tv_page_index.text = "${currIndex + 1}/${notList.size}" | |||||
| indexBox.visibility = if (notList.size > 1) { | |||||
| View.VISIBLE | |||||
| } else { | |||||
| View.GONE | |||||
| } | |||||
| } | |||||
| //title | |||||
| btnBack.setOnClickListener { onBackPressed() } | |||||
| titleTv.text = intent.getStringExtra("title") | |||||
| //初始化笔记 | |||||
| mWePointList.clear() | |||||
| //屏幕初始化 | |||||
| val filter = IntentFilter() | |||||
| filter.addAction(SCREEN_ON) | |||||
| filter.addAction(SCREEN_OFF) | |||||
| if (mReceiver != null) { | |||||
| registerReceiver(mReceiver, filter) | |||||
| } | |||||
| btnPre.setOnClickListener { | |||||
| if (currIndex - 1 >= 0) { | |||||
| ImageUtils.save( | |||||
| note_view.currentNoteBitmap, | |||||
| "${NOTE_FOLDER_DIR}/${currKey}.png", | |||||
| Bitmap.CompressFormat.PNG | |||||
| ) | |||||
| loadImage(currIndex - 1) | |||||
| } | |||||
| } | |||||
| btnNext.setOnClickListener { | |||||
| if (currIndex + 1 < notList.size) { | |||||
| ImageUtils.save( | |||||
| note_view.currentNoteBitmap, | |||||
| "${NOTE_FOLDER_DIR}/${currKey}.png", | |||||
| Bitmap.CompressFormat.PNG | |||||
| ) | |||||
| loadImage(currIndex + 1) | |||||
| } | |||||
| } | |||||
| saveBtn.setOnClickListener { | |||||
| saveTip.visibility = View.VISIBLE | |||||
| saveTip.text = "保存中..." | |||||
| ImageUtils.save( | |||||
| note_view.currentNoteBitmap, | |||||
| "${NOTE_FOLDER_DIR}/${currKey}.png", | |||||
| Bitmap.CompressFormat.PNG | |||||
| ) | |||||
| save(0) | |||||
| } | |||||
| } | |||||
| @SuppressLint("SetTextI18n") | |||||
| override fun initData() { | |||||
| val json = intent.getStringExtra("note_info") | |||||
| notList.clear() | |||||
| if (!TextUtils.isEmpty(json)) { | |||||
| val jsonArray = JSONArray(json) | |||||
| if (jsonArray.length() > 0) { | |||||
| for (index in 0 until jsonArray.length()) { | |||||
| val jsonObj: JSONObject? = jsonArray?.opt(index) as JSONObject | |||||
| val identity = jsonObj?.getString("identity"); | |||||
| val key = jsonObj?.getString("key") | |||||
| val bgId = jsonObj?.getInt("BGid") | |||||
| val note = Note() | |||||
| note.BGid = bgId ?: 0 | |||||
| note.identity = identity ?: "" | |||||
| note.key = key ?: "" | |||||
| notList.add(note) | |||||
| } | |||||
| } else { | |||||
| notList.add(Note()) | |||||
| } | |||||
| } else { | |||||
| notList.add(Note()) | |||||
| } | |||||
| Log.d(TAG, "初始化开始note_view") | |||||
| note_view.post { | |||||
| Log.d(TAG, "初始化开始note_view.post") | |||||
| mHandler.post(mRunnable) | |||||
| } | |||||
| tv_page_index.text = "1/${notList.size}" | |||||
| indexBox.visibility = if (notList.size > 1) { | |||||
| View.VISIBLE | |||||
| } else { | |||||
| View.GONE | |||||
| } | |||||
| } | |||||
| private fun loadImage(index: Int = 0) { | |||||
| val note = notList[index] | |||||
| val identity = note.identity | |||||
| val key = note.key | |||||
| val bgId = note.BGid | |||||
| if (TextUtils.isEmpty(key)) { | |||||
| note.key = Date().time.toString() | |||||
| note_view.showExistPage( | |||||
| "", | |||||
| mBGDrawableList[0] | |||||
| ) | |||||
| currKey = note.key | |||||
| currIndex = index | |||||
| mBgId = bgId | |||||
| tv_page_index.text = "${index + 1}/${notList.size}" | |||||
| return | |||||
| } | |||||
| val path = "${NOTE_FOLDER_DIR}/${key}.png" | |||||
| if (FileUtils.isFileExists(path)) { | |||||
| if (mNotePageInfo == null) { | |||||
| return | |||||
| } | |||||
| mBgId = bgId ?: 0 | |||||
| note_view.showExistPage( | |||||
| path, | |||||
| mBGDrawableList[mBgId] | |||||
| ) | |||||
| currKey = key | |||||
| currIndex = index | |||||
| tv_page_index.text = "${index + 1}/${notList.size}" | |||||
| } else { | |||||
| if (!TextUtils.isEmpty(key) && !TextUtils.isEmpty(identity)) { | |||||
| saveTip.visibility = View.VISIBLE | |||||
| saveTip.text = "加载中..." | |||||
| val url = "https://${identity}.oa.qbjjyyun.net/edufile/imageView?uniqueKey=${key}" | |||||
| val customTarget: CustomTarget<Drawable> = object : CustomTarget<Drawable>() { | |||||
| override fun onLoadCleared(placeholder: Drawable?) {} | |||||
| override fun onLoadFailed(errorDrawable: Drawable?) { | |||||
| toast("文档加载失败!") | |||||
| saveTip.visibility = View.GONE | |||||
| } | |||||
| override fun onResourceReady( | |||||
| resource: Drawable, | |||||
| transition: Transition<in Drawable>? | |||||
| ) { | |||||
| val bmp = ImageUtils.drawable2Bitmap(resource) | |||||
| ImageUtils.save(bmp, path, Bitmap.CompressFormat.PNG) | |||||
| if (FileUtils.isFileExists(path)) { | |||||
| if (mNotePageInfo == null) { | |||||
| return | |||||
| } | |||||
| mBgId = bgId ?: 0 | |||||
| note_view.showExistPage( | |||||
| path, | |||||
| mBGDrawableList[mBgId] | |||||
| ) | |||||
| currKey = key | |||||
| currIndex = index | |||||
| tv_page_index.text = "${index + 1}/${notList.size}" | |||||
| } | |||||
| saveTip.visibility = View.GONE | |||||
| } | |||||
| } | |||||
| Glide.with(this) | |||||
| .load(url) | |||||
| .diskCacheStrategy(DiskCacheStrategy.ALL) | |||||
| .override( | |||||
| Target.SIZE_ORIGINAL, | |||||
| Target.SIZE_ORIGINAL | |||||
| ) | |||||
| .into(customTarget) | |||||
| } else { | |||||
| note.key = Date().time.toString() | |||||
| note_view.showExistPage( | |||||
| "", | |||||
| mBGDrawableList[0] | |||||
| ) | |||||
| currKey = note.key | |||||
| currIndex = index | |||||
| mBgId = bgId ?: 0 | |||||
| tv_page_index.text = "${index + 1}/${notList.size}" | |||||
| } | |||||
| } | |||||
| } | |||||
| private fun save(index: Int) { | |||||
| val item = notList[index] | |||||
| val path = "${NOTE_FOLDER_DIR}/${item.key}.png" | |||||
| if (!TextUtils.isEmpty(item.key)) { | |||||
| if (FileUtils.isFileExists(path)) { //存在就上传 | |||||
| OkGo.post<String>("https://fileupload.oa.qbjjyyun.net/edufile/fileUpload") | |||||
| .tag(this) | |||||
| .params("token", "0fc58a8df03c46d3f85b1047c4693cf6") | |||||
| .params("user", Date().time) | |||||
| .params("file", File(path)) | |||||
| .execute(object : StringCallback() { | |||||
| override fun onSuccess(response: Response<String>) { | |||||
| try { | |||||
| val json = response.body() | |||||
| Log.d("onSuccess", response.body()) | |||||
| val jsonObject = JSONObject(json) | |||||
| val content = jsonObject.optString("content") | |||||
| Log.d("onSuccess,content", content) | |||||
| val contentObject = JSONObject(content) | |||||
| val key = contentObject.optString("key") | |||||
| val identity = contentObject.optString("identity") | |||||
| Log.d("onSuccess,identity", identity) | |||||
| Log.d("onSuccess,key", key) | |||||
| item.key = key | |||||
| item.identity = identity | |||||
| FileUtils.copy(path, "${NOTE_FOLDER_DIR}/${key}.png") | |||||
| if (index == notList.size - 1) { | |||||
| saveTip.visibility = View.GONE | |||||
| toast("保存成功!") | |||||
| backToH5() | |||||
| } else { | |||||
| save(index + 1) | |||||
| } | |||||
| } catch (e: Exception) { | |||||
| } | |||||
| } | |||||
| override fun onError(response: Response<String>) { | |||||
| super.onError(response) | |||||
| toast("保存失败!") | |||||
| } | |||||
| override fun onFinish() { | |||||
| super.onFinish() | |||||
| saveTip.visibility = View.GONE | |||||
| } | |||||
| }) | |||||
| } else { | |||||
| if (index == notList.size - 1) { | |||||
| saveTip.visibility = View.GONE | |||||
| toast("保存成功!") | |||||
| backToH5() | |||||
| } else { | |||||
| save(index + 1) | |||||
| } | |||||
| } | |||||
| } else { | |||||
| if (index == notList.size - 1) { | |||||
| saveTip.visibility = View.GONE | |||||
| toast("保存成功!") | |||||
| backToH5() | |||||
| } else { | |||||
| save(index + 1) | |||||
| } | |||||
| } | |||||
| } | |||||
| private fun backToH5() { | |||||
| val intent = Intent() | |||||
| Log.d(TAG + "--------1------->", copyList().toString()) | |||||
| Log.d(TAG + "---------2------>", Gson().toJson(copyList())) | |||||
| Log.d(TAG + "---------3------>", GsonUtils.toJson(notList)) | |||||
| intent.putExtra("note_info", GsonUtils.toJson(copyList())) | |||||
| setResult(Activity.RESULT_OK, intent) | |||||
| onBackPressed() | |||||
| } | |||||
| private fun copyList(): MutableList<Note> { | |||||
| val list = mutableListOf<Note>() | |||||
| notList.forEach { | |||||
| if(!TextUtils.isEmpty(it.key)&&!TextUtils.isEmpty(it.identity)){ | |||||
| val item = Note() | |||||
| item.key = it.key | |||||
| item.identity = it.identity | |||||
| item.BGid = it.BGid | |||||
| list.add(item) | |||||
| } | |||||
| } | |||||
| return list | |||||
| } | |||||
| data class CopyNote(val key: String, val identity: String, val BGid: Int) | |||||
| override fun initPresenter(): BasePresenter<*>? = null | |||||
| private fun checkPermission() { | |||||
| var isGranted = true | |||||
| if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { | |||||
| //如果没有写sd卡权限 | |||||
| isGranted = false | |||||
| } | |||||
| if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { | |||||
| isGranted = false | |||||
| } | |||||
| Log.i("cbs", "isGranted == $isGranted") | |||||
| if (!isGranted) { | |||||
| requestPermissions( | |||||
| arrayOf( | |||||
| Manifest.permission.ACCESS_COARSE_LOCATION, | |||||
| Manifest.permission.ACCESS_FINE_LOCATION, | |||||
| Manifest.permission.READ_EXTERNAL_STORAGE, | |||||
| Manifest.permission.WRITE_EXTERNAL_STORAGE | |||||
| ), | |||||
| 102 | |||||
| ) | |||||
| } | |||||
| } | |||||
| override fun onResume() { | |||||
| note_view.setEnable(true) | |||||
| note_view.setSleepMode(true) | |||||
| super.onResume() | |||||
| } | |||||
| override fun onPause() { | |||||
| note_view.setEnable(false) | |||||
| super.onPause() | |||||
| } | |||||
| override fun onDestroy() { | |||||
| //mView.exitView(); | |||||
| mHandler.removeCallbacks(mRunnable) | |||||
| note_view.exitNative() | |||||
| if (mReceiver != null) { | |||||
| unregisterReceiver(mReceiver) | |||||
| mReceiver = null | |||||
| } | |||||
| super.onDestroy() | |||||
| } | |||||
| override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { | |||||
| if (keyCode == KeyEvent.KEYCODE_BACK) { | |||||
| note_view.exitNative() | |||||
| if (mReceiver != null) { | |||||
| unregisterReceiver(mReceiver) | |||||
| mReceiver = null | |||||
| } | |||||
| finish() | |||||
| return true | |||||
| } | |||||
| return super.onKeyDown(keyCode, event) | |||||
| } | |||||
| val SCREEN_ON = "android.intent.action.SCREEN_ON" | |||||
| val SCREEN_OFF = "android.intent.action.SCREEN_OFF" | |||||
| private var mReceiver: BroadcastReceiver? = object : BroadcastReceiver() { | |||||
| override fun onReceive(context: Context, intent: Intent) { | |||||
| // 屏幕唤醒 | |||||
| if (SCREEN_ON == intent.action) { | |||||
| note_view.setSleepMode(true) | |||||
| } else if (SCREEN_OFF == intent.action) { | |||||
| note_view.setSleepMode(true) | |||||
| } | |||||
| } | |||||
| } | |||||
| private val mRunnable: Runnable = object : Runnable { | |||||
| override fun run() { | |||||
| Log.d(TAG, "初始化开始-------------》"); | |||||
| var count = 0 | |||||
| while (note_view.height <= 0) { | |||||
| try { | |||||
| Thread.sleep(50) | |||||
| } catch (e: InterruptedException) { | |||||
| e.printStackTrace() | |||||
| } | |||||
| if (count++ > 40) { | |||||
| Log.d(TAG, "Flash test : ++++++++ removeCallbacks"); | |||||
| mHandler.removeCallbacks(this) | |||||
| exitProcess(0) | |||||
| } | |||||
| } | |||||
| //note_view.initNative(new Rect(mScreenW, mScreenH - note_view.getHeight(), 0, mScreenH), SAVE_PIC_PATH); | |||||
| Log.d( | |||||
| TAG, | |||||
| "Flash test : ++++++++ mView.getHeight() = " + note_view.height + ", count = " + count | |||||
| ); | |||||
| note_view.initNative( | |||||
| Rect( | |||||
| mScreenW, | |||||
| mScreenH - note_view.height, | |||||
| 0, | |||||
| mScreenH | |||||
| ) | |||||
| ) | |||||
| note_view.setTouchEventHander(mPointHandler) | |||||
| Log.d(TAG, "Flash test : ++++++ mRunnable() start loader notepageinfo"); | |||||
| if (mNotePageInfo == null) { | |||||
| mNotePageInfo = getNotePageInfo(NOTE_FOLDER_DIR) | |||||
| } | |||||
| if (mNotePageInfo == null) { | |||||
| Log.d(TAG, "Flash test : +++++ no note, so init a page"); | |||||
| initPage() | |||||
| } | |||||
| initNoteView() | |||||
| loadImage(0) | |||||
| Log.d(TAG, "初始化结束-------------》"); | |||||
| } | |||||
| } | |||||
| private fun initNoteView() { | |||||
| //写字板初始化 | |||||
| note_view.background = null | |||||
| note_view.penWidth = 3 | |||||
| note_view.isEraserEnable = false | |||||
| note_view.eraserWidth = 20 | |||||
| } | |||||
| override fun finish() { | |||||
| note_view.exitNative() | |||||
| if (mReceiver != null) { | |||||
| unregisterReceiver(mReceiver) | |||||
| mReceiver = null | |||||
| } | |||||
| super.finish() | |||||
| } | |||||
| override fun onBackPressed() { | |||||
| note_view.exitNative() | |||||
| if (mReceiver != null) { | |||||
| unregisterReceiver(mReceiver) | |||||
| mReceiver = null | |||||
| } | |||||
| super.onBackPressed() | |||||
| } | |||||
| private fun initPage(): Boolean { | |||||
| var file = File(NOTE_FOLDER_DIR) | |||||
| if (!file.exists()) { | |||||
| if (!FileUtils.createOrExistsDir(file)) { | |||||
| return false | |||||
| } | |||||
| } | |||||
| var notePath: String? = null | |||||
| file = File("$NOTE_FOLDER_DIR/${currKey}.png") | |||||
| if (file.exists()) { | |||||
| notePath = "$NOTE_FOLDER_DIR/${currKey}.png" | |||||
| } | |||||
| mNotePageInfo = NotePageInfo(notePath, mBgId) | |||||
| return true | |||||
| } | |||||
| private fun loadOldPage() { | |||||
| if (mNotePageInfo == null) { | |||||
| return | |||||
| } | |||||
| mBgId = mNotePageInfo?.drwId ?: 0 | |||||
| note_view.showExistPage( | |||||
| mNotePageInfo?.notePath, | |||||
| mBGDrawableList[mBgId] | |||||
| ) | |||||
| } | |||||
| //从笔记文件夹中读取当前笔记的页面信息 | |||||
| private fun getNotePageInfo(path: String): NotePageInfo? { | |||||
| var file = File(path) | |||||
| if (!file.exists()) { | |||||
| return null | |||||
| } | |||||
| file.listFiles() ?: return null | |||||
| val info = NotePageInfo(null, 0) | |||||
| val notePath = "$path/${currKey}.png" | |||||
| file = File(notePath) | |||||
| if (file.exists()) { | |||||
| info.notePath = notePath | |||||
| } | |||||
| info.drwId = 0 //Integer.parseInt(drwId); | |||||
| return info | |||||
| } | |||||
| private val mPointHandler: Handler = @SuppressLint("HandlerLeak") | |||||
| object : Handler() { | |||||
| override fun handleMessage(msg: Message) { | |||||
| val what = msg.what | |||||
| //同步获取的笔记点坐标信息msg | |||||
| if (what == WeNoteView.TOUCH_EVENT) { | |||||
| val point = msg.obj as WePoint | |||||
| mWePointList.add(point) | |||||
| } | |||||
| //保存笔记结束msg | |||||
| if (what == MSG_SAVE_END) { | |||||
| val status = msg.arg1 | |||||
| if (status > 0) { //保存成功 | |||||
| Toast.makeText(applicationContext, "保存成功!", Toast.LENGTH_SHORT).show(); | |||||
| } else { //保存失败 | |||||
| Toast.makeText(applicationContext, "保存失败!", Toast.LENGTH_SHORT) | |||||
| .show(); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -231,6 +231,11 @@ class WebActivity : BaseActivity<BasePresenter<*>>() { | |||||
| obj.put("type", data?.getIntExtra("type", 1)) | obj.put("type", data?.getIntExtra("type", 1)) | ||||
| evaluateJavascript("onImageUploadSuccess", obj.toString()) | evaluateJavascript("onImageUploadSuccess", obj.toString()) | ||||
| } | } | ||||
| if (requestCode == NoteActivity.REQ_CODE && resultCode == Activity.RESULT_OK) { | |||||
| val json = data?.getStringExtra("note_info")?:"" | |||||
| evaluateJavascript("onImageUploadSuccess", json) | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -259,6 +264,19 @@ class YzxJavascriptInterface(var ctx: Activity) { | |||||
| BookActivity.active(ctx, title, key, identity, name, index, type) | BookActivity.active(ctx, title, key, identity, name, index, type) | ||||
| } | } | ||||
| /** | |||||
| * 跳转到笔记页面 | |||||
| * @param title 展示的title | |||||
| * @param note_info 笔记得json,新的笔记 传"" ,老的笔记 传 [{"BGid":0,"identity":"fileb","key":"a92511a457cdc444bb274e5dee29c487"}] | |||||
| */ | |||||
| @JavascriptInterface | |||||
| fun notePage( | |||||
| title: String, | |||||
| note_info:String | |||||
| ) { | |||||
| NoteActivity.active(ctx, title, note_info) | |||||
| } | |||||
| /** | /** | ||||
| * 提示 | * 提示 | ||||
| */ | */ | ||||
| @@ -0,0 +1,7 @@ | |||||
| package com.yzx.webebook.model | |||||
| class Note { | |||||
| var key:String = "" | |||||
| var identity:String = "" | |||||
| var BGid:Int = 0 | |||||
| } | |||||
| @@ -0,0 +1,6 @@ | |||||
| <?xml version="1.0" encoding="utf-8"?> | |||||
| <shape xmlns:android="http://schemas.android.com/apk/res/android"> | |||||
| <solid android:color="#33000000"/> | |||||
| <stroke android:color="#000" android:width="@dimen/d_1"/> | |||||
| <corners android:radius="@dimen/d_5"/> | |||||
| </shape> | |||||
| @@ -159,6 +159,28 @@ | |||||
| android:textColor="#000" | android:textColor="#000" | ||||
| android:paddingVertical="10dp"/> | android:paddingVertical="10dp"/> | ||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_init" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="样式" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_init" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_add" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="加纸" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_add" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <Button | <Button | ||||
| android:id="@+id/delete" | android:id="@+id/delete" | ||||
| android:layout_width="0dp" | android:layout_width="0dp" | ||||
| @@ -95,4 +95,9 @@ | |||||
| android:adjustViewBounds="true" | android:adjustViewBounds="true" | ||||
| android:visibility="visible" | android:visibility="visible" | ||||
| android:scaleType="fitXY"/> | android:scaleType="fitXY"/> | ||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/backInfo" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content"/> | |||||
| </androidx.appcompat.widget.LinearLayoutCompat> | </androidx.appcompat.widget.LinearLayoutCompat> | ||||
| @@ -0,0 +1,206 @@ | |||||
| <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="#ffffffff" | |||||
| android:orientation="vertical"> | |||||
| <com.google.android.material.appbar.AppBarLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="@dimen/title_height" | |||||
| android:background="@color/white"> | |||||
| <RelativeLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent"> | |||||
| <ImageView | |||||
| android:id="@+id/btnBack" | |||||
| android:layout_width="@dimen/title_height" | |||||
| android:layout_height="@dimen/title_height" | |||||
| android:background="?attr/selectableItemBackground" | |||||
| android:scaleType="centerInside" | |||||
| android:src="@mipmap/ic_back_def" /> | |||||
| <ImageView | |||||
| android:id="@+id/btnClose" | |||||
| android:layout_width="@dimen/title_height" | |||||
| android:layout_height="@dimen/title_height" | |||||
| android:layout_toEndOf="@+id/btnBack" | |||||
| android:background="?attr/selectableItemBackground" | |||||
| android:scaleType="centerInside" | |||||
| android:src="@mipmap/ic_close" | |||||
| android:visibility="gone" /> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/titleTv" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_centerInParent="true" | |||||
| android:layout_marginStart="96dp" | |||||
| android:layout_marginEnd="96dp" | |||||
| android:gravity="center" | |||||
| android:textColor="@color/black" | |||||
| android:textStyle="bold" | |||||
| android:textSize="@dimen/title_text_size" /> | |||||
| <androidx.appcompat.widget.AppCompatButton | |||||
| android:id="@+id/saveBtn" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_alignParentEnd="true" | |||||
| android:layout_centerVertical="true" | |||||
| android:background="@drawable/btn_select" | |||||
| android:paddingHorizontal="15dp" | |||||
| android:drawableLeft="@mipmap/icon_save_btn" | |||||
| android:drawablePadding="5dp" | |||||
| android:textSize="@dimen/title_text_size" | |||||
| android:text="保存" /> | |||||
| <ProgressBar | |||||
| android:id="@+id/progressbar" | |||||
| style="?android:attr/progressBarStyleHorizontal" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="2dp" | |||||
| android:layout_alignParentBottom="true" | |||||
| android:max="100" | |||||
| android:progress="0" | |||||
| android:progressDrawable="@drawable/progress_horizontal" | |||||
| android:visibility="visible" /> | |||||
| <View | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="1px" | |||||
| android:layout_alignParentBottom="true" | |||||
| android:background="#000"/> | |||||
| </RelativeLayout> | |||||
| </com.google.android.material.appbar.AppBarLayout> | |||||
| <LinearLayout | |||||
| android:id="@+id/bottom_view" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="wrap_content" | |||||
| android:layout_alignParentTop="true" | |||||
| android:divider="@drawable/linearlayout_vertical_divider" | |||||
| android:showDividers="middle|end" | |||||
| android:orientation="horizontal"> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/pen" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="笔" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_pen_select" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_eraser" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="橡皮" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_rubber" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_clear" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="清除" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_clear" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_init" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="样式" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_init" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/new_add" | |||||
| android:layout_width="118px" | |||||
| android:layout_height="match_parent" | |||||
| android:text="加纸" | |||||
| android:textAlignment="center" | |||||
| android:drawableTop="@mipmap/ic_book_add" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:layout_width="0px" | |||||
| android:layout_weight="1" | |||||
| android:layout_height="match_parent" | |||||
| android:textAlignment="center" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:paddingVertical="10dp"/> | |||||
| <LinearLayout | |||||
| android:id="@+id/indexBox" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:layout_gravity="center"> | |||||
| <ImageView | |||||
| android:id="@+id/btnPre" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:src="@mipmap/ic_page_left" | |||||
| android:paddingHorizontal="@dimen/d_15"/> | |||||
| <androidx.appcompat.widget.AppCompatTextView | |||||
| android:id="@+id/tv_page_index" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="1/3" | |||||
| android:gravity="center" | |||||
| android:drawablePadding="5dp" | |||||
| android:textColor="#000" | |||||
| android:layout_gravity="center_vertical" | |||||
| android:paddingVertical="10dp"/> | |||||
| <ImageView | |||||
| android:id="@+id/btnNext" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="match_parent" | |||||
| android:src="@mipmap/ic_page_right" | |||||
| android:paddingHorizontal="@dimen/d_15"/> | |||||
| </LinearLayout> | |||||
| </LinearLayout> | |||||
| <TextView | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="1dp" | |||||
| android:background="#ff000000" /> | |||||
| <RelativeLayout | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent"> | |||||
| <com.wetao.note.WeNoteView | |||||
| android:id="@+id/note_view" | |||||
| android:layout_width="match_parent" | |||||
| android:layout_height="match_parent" | |||||
| android:background="#ffffffff" /> | |||||
| <TextView | |||||
| android:id="@+id/saveTip" | |||||
| android:layout_width="wrap_content" | |||||
| android:layout_height="wrap_content" | |||||
| android:text="保存中..." | |||||
| android:padding="@dimen/d_10" | |||||
| android:textColor="@color/white" | |||||
| android:background="@drawable/save_bg" | |||||
| android:layout_centerInParent="true" | |||||
| android:visibility="gone"/> | |||||
| </RelativeLayout> | |||||
| </LinearLayout> | |||||
| @@ -0,0 +1,93 @@ | |||||
| # Add project specific ProGuard rules here. | |||||
| # You can control the set of applied configuration files using the | |||||
| # proguardFiles setting in build.gradle. | |||||
| # | |||||
| # For more details, see | |||||
| # http://developer.android.com/guide/developing/tools/proguard.html | |||||
| # If your project uses WebView with JS, uncomment the following | |||||
| # and specify the fully qualified class name to the JavaScript interface | |||||
| # class: | |||||
| #-keepclassmembers class fqcn.of.javascript.interface.for.webview { | |||||
| # public *; | |||||
| #} | |||||
| # Uncomment this to preserve the line number information for | |||||
| # debugging stack traces. | |||||
| #-keepattributes SourceFile,LineNumberTable | |||||
| # If you keep the line number information, uncomment this to | |||||
| # hide the original source file name. | |||||
| #-renamesourcefileattribute SourceFile | |||||
| -flattenpackagehierarchy | |||||
| -allowaccessmodification | |||||
| -keepattributes Exceptions,InnerClasses,Signature,SourceFile,LineNumberTable | |||||
| -dontskipnonpubliclibraryclassmembers | |||||
| -ignorewarnings | |||||
| #kotlin | |||||
| -keep class kotlin.Metadata { *; } | |||||
| -dontwarn kotlin.** | |||||
| -keepclassmembers class **$WhenMappings { | |||||
| <fields>; | |||||
| } | |||||
| -keepclassmembers class kotlin.Metadata { | |||||
| public <methods>; | |||||
| } | |||||
| -assumenosideeffects class kotlin.jvm.internal.Intrinsics { | |||||
| static void checkParameterIsNotNull(java.lang.Object, java.lang.String); | |||||
| } | |||||
| -keepclasseswithmembernames class * { | |||||
| native <methods>; | |||||
| } | |||||
| -keepclassmembers class * extends android.app.Activity { | |||||
| public void *(android.view.View); | |||||
| } | |||||
| -keepclassmembers class * implements android.os.Parcelable { | |||||
| public static final android.os.Parcelable$Creator *; | |||||
| } | |||||
| -keep class **.R$* {*;} | |||||
| -keepclassmembers enum * { *;} | |||||
| #Gson | |||||
| -keepclassmembers public class com.google.gson.** | |||||
| -keepclassmembers public class com.google.gson.** {public private protected *;} | |||||
| -keepclassmembers public class com.project.mocha_patient.login.SignResponseData { private *; } | |||||
| -keepclassmembers class sun.misc.Unsafe { *; } | |||||
| -keep @interface com.google.gson.annotations.SerializedName | |||||
| -keepclassmembers class * { | |||||
| @com.google.gson.annotations.SerializedName <fields>; | |||||
| } | |||||
| #bean | |||||
| -keep class com.yzx.webebook.model.** { *; } | |||||
| -keep class com.yzx.webebook.model.Note { *; } | |||||
| -keep class com.yzx.webebook.model.ac { *; } | |||||
| -keep class com.yzx.webebook.model.UploadBean { *; } | |||||
| -keep class com.yzx.webebook.model.UploadContent { *; } | |||||
| -keep class **$Properties {*;} | |||||
| #Glide | |||||
| -keep public class * implements com.bumptech.glide.module.GlideModule | |||||
| -keep public class * extends com.bumptech.glide.module.AppGlideModule | |||||
| -keep public enum com.bumptech.glide.load.ImageHeaderParser$** { | |||||
| **[] $VALUES; | |||||
| public *; | |||||
| } | |||||
| # for DexGuard only | |||||
| #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule | |||||
| -dontwarn com.bumptech.glide.** | |||||
| # ProGuard configurations for Bugtags | |||||
| -keepattributes LineNumberTable,SourceFile | |||||
| -dontwarn com.bugtags.library.** | |||||
| -dontwarn io.bugtags.** | |||||
| -dontwarn org.apache.http.** | |||||
| -dontwarn android.net.http.AndroidHttpClient | |||||