一些修改

This commit is contained in:
NerLink
2021-05-17 19:28:10 +08:00
parent 0aa2fe5633
commit 9fe6783c8b
22 changed files with 326 additions and 50 deletions
+2
View File
@@ -33,6 +33,8 @@ android {
}
dependencies {
implementation('com.google.android.material:material:1.3.0')
implementation "androidx.drawerlayout:drawerlayout:1.1.1"
implementation 'com.github.chrisbanes:PhotoView:2.3.0'
api 'com.google.android:flexbox:1.0.0'
implementation ('androidx.swiperefreshlayout:swiperefreshlayout:1.1.0')
+6 -5
View File
@@ -6,7 +6,6 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
@@ -14,11 +13,13 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.LspView">
<activity android:name=".PicActivity"
android:configChanges="uiMode"
></activity>
<activity android:name=".MainActivity">
<activity android:name=".login.LoginActivity">
</activity>
<activity
android:name=".pic.PicActivity"
android:configChanges="uiMode" />
<activity android:name=".main.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -0,0 +1,73 @@
package com.lsp.view.login
import android.app.AlertDialog
import android.app.Dialog
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.util.Log
import android.widget.EditText
import android.widget.TextView
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.lsp.view.R
import com.lsp.view.main.MainActivity
import okhttp3.*
import java.io.File
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.util.ArrayList
import java.util.concurrent.TimeUnit
import kotlin.concurrent.thread
class LoginActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
val login = findViewById<FloatingActionButton>(R.id.login)
AlertDialog.Builder(this).apply {
setMessage("目前阶段登录没有任何实质的用处,仅会保存你输入的用户名用于搜索你的收藏夹,而通过登录获取到的Cookie在将来可能会有实质的用处,Cookie将不会保存,如你不需要使用收藏夹,请直接点击登录按钮。")
setTitle("关于登录")
setPositiveButton("确定"){it,_->
it.dismiss()
}
}.create().show()
login.setOnClickListener {
val username = findViewById<EditText>(R.id.username)
val password = findViewById<EditText>(R.id.password)
val sPassword = "choujin-steiner--${password.text.toString()}--"
val hash1Password = StrToHash1.shaEncrypt(sPassword)
thread {
conn(username.text.toString(),hash1Password)
}
val intent = Intent(this,MainActivity::class.java)
startActivity(intent)
}
}
fun conn(username:String,hash1: String):String{
val cookies = ArrayList<Cookie>()
val client = OkHttpClient.Builder()
.connectTimeout(60,TimeUnit.SECONDS)
.cookieJar(object : CookieJar{
override fun saveFromResponse(url: HttpUrl, cookies: MutableList<Cookie>) {
}
override fun loadForRequest(url: HttpUrl): MutableList<Cookie> {
return cookies
}
})
.build()
val request = Request.Builder()
.url("https://yande.re/?username=$username&password=$hash1")
.build()
return client.newCall(request).execute().body()!!.string()
}
}
@@ -0,0 +1,35 @@
package com.lsp.view.login;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class StrToHash1 {
public static String shaEncrypt(String strSrc){
MessageDigest md = null;
String strDes = null;
byte[] bt = strSrc.getBytes();
try {
md = MessageDigest.getInstance("SHA-1");
md.update(bt);
strDes = bytes2Hex(md.digest());
} catch (NoSuchAlgorithmException e) {
return null;
}
return strDes;
}
private static String bytes2Hex(byte[] bts){
StringBuilder des = new StringBuilder();
String tmp = null;
for (int i =0;i<bts.length;i++){
tmp = Integer.toHexString(bts[i] & 0xFF);
if (tmp.length()==1){
des.append("0");
}
des.append(tmp);
}
return des.toString();
}
}
@@ -1,22 +1,31 @@
package com.lsp.view
package com.lsp.view.main
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.GridLayoutManager
import com.google.android.material.navigation.NavigationView
import com.google.android.material.snackbar.Snackbar
import com.lsp.view.bean.Post
import com.hentai.yandeview.Retrofit.PostService
import com.hentai.yandeview.Retrofit.ServiceCreator
import com.lsp.view.adapter.PostAdapter
import com.lsp.view.R
import com.lsp.view.login.LoginActivity
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
@@ -29,7 +38,7 @@ class MainActivity : AppCompatActivity() {
private lateinit var searchBar:LinearLayout
private var shortAnnotationDuration:Int = 0
private var nowPage = 1
private lateinit var adapter:PostAdapter
private lateinit var adapter: PostAdapter
private var isLoading = false
private var nowPosition by Delegates.notNull<Int>()
@@ -56,6 +65,10 @@ class MainActivity : AppCompatActivity() {
val close = findViewById<View>(R.id.close)
val editCard = findViewById<com.google.android.material.card.MaterialCardView>(R.id.editCard)
supportActionBar?.let {
it.setDisplayHomeAsUpEnabled(true)
it.setHomeAsUpIndicator(R.drawable.ic_baseline_menu_24)
}
searchBar = findViewById<LinearLayout>(R.id.search_bar)
shortAnnotationDuration = resources.getInteger(android.R.integer.config_shortAnimTime)
@@ -84,6 +97,23 @@ class MainActivity : AppCompatActivity() {
nowPage = 1
loadPost(this, null, searchTag,nowPage.toString())
}
//登录
/**
val headerView = LayoutInflater.from(this).inflate(R.layout.nav_header,null)
val name = headerView.findViewById<TextView>(R.id.name)
name.setOnClickListener {
val intent = Intent(this,LoginActivity::class.java)
startActivity(intent)
}*/
//侧边栏
val nav = findViewById<NavigationView>(R.id.nav)
nav.setCheckedItem(R.id.photo)
nav.setNavigationItemSelectedListener {
true
}
}
@@ -108,6 +138,14 @@ class MainActivity : AppCompatActivity() {
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
val drawerLayout = findViewById<DrawerLayout>(R.id.drawerLayout)
when(item.itemId){
android.R.id.home -> drawerLayout.openDrawer(GravityCompat.START)
}
return true
}
private fun hideIm(){
val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
@@ -138,7 +176,7 @@ class MainActivity : AppCompatActivity() {
val fbtn = findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(
R.id.fbtn
)
Snackbar.make(fbtn,"请检查网络连接",Snackbar.LENGTH_SHORT).show()
Snackbar.make(fbtn,"请检查网络连接",Snackbar.LENGTH_LONG).show()
}
override fun onResponse(call: Call<List<Post>>, response: Response<List<Post>>) {
@@ -174,7 +212,7 @@ class MainActivity : AppCompatActivity() {
adapter = PostAdapter(context, postList)
recyclerView.adapter = adapter
}
adapter.setLoadMoreListener(object :PostAdapter.OnLoadMoreListener{
adapter.setLoadMoreListener(object : PostAdapter.OnLoadMoreListener{
override fun loadMore(position: Int) {
nowPage++
swipeRefreshLayout.isRefreshing = true
@@ -1,4 +1,4 @@
package com.lsp.view.adapter
package com.lsp.view.main
import android.content.Context
import android.content.Intent
@@ -9,8 +9,10 @@ import android.view.ViewGroup
import android.widget.ImageView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.load.model.LazyHeaders
import com.lsp.view.bean.Post
import com.lsp.view.PicActivity
import com.lsp.view.pic.PicActivity
import com.lsp.view.R
class PostAdapter(val context:Context, private val postList: List<Post>) :RecyclerView.Adapter<PostAdapter.ViewHolder>(){
@@ -26,7 +28,7 @@ class PostAdapter(val context:Context, private val postList: List<Post>) :Recycl
val position = viewHolder.adapterPosition
Log.e("position",position.toString())
Log.e("url",postList[position].sample_url)
val intent = Intent(context,PicActivity::class.java)
val intent = Intent(context, PicActivity::class.java)
intent.putExtra("id",postList[position].id)
intent.putExtra("sample_url",postList[position].sample_url)
intent.putExtra("file_url",postList[position].file_url)
@@ -40,7 +42,7 @@ class PostAdapter(val context:Context, private val postList: List<Post>) :Recycl
return viewHolder
}
private lateinit var mLoadMoreListener:OnLoadMoreListener
private lateinit var mLoadMoreListener: OnLoadMoreListener
interface OnLoadMoreListener{
fun loadMore(position: Int)
@@ -53,7 +55,8 @@ class PostAdapter(val context:Context, private val postList: List<Post>) :Recycl
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val post = postList[position]
Glide.with(context).load(post.preview_url).into(holder.picImage)
val glideUrl = GlideUrl(post.preview_url, LazyHeaders.Builder().addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36").build())
Glide.with(context).load(glideUrl).into(holder.picImage)
if (position==postList.size-1&&postList.size>6){
//到达底部
mLoadMoreListener.loadMore(position)
@@ -1,4 +1,4 @@
package com.lsp.view.adapter
package com.lsp.view.pic
import android.view.LayoutInflater
import android.view.View
@@ -1,4 +1,4 @@
package com.lsp.view.adapter
package com.lsp.view.pic
import android.view.LayoutInflater
import android.view.View
@@ -1,38 +1,37 @@
package com.lsp.view
package com.lsp.view.pic
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.content.Intent
import android.content.pm.PackageManager
import android.content.res.Configuration
import android.graphics.drawable.Drawable
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.os.Looper
import android.util.Log
import android.util.TypedValue
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import com.bumptech.glide.Glide
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.load.model.GlideUrl
import com.bumptech.glide.load.model.LazyHeaders
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.github.chrisbanes.photoview.PhotoView
import com.google.android.flexbox.*
import com.google.android.material.snackbar.Snackbar
import com.lsp.view.adapter.AuthorAdapter
import com.lsp.view.adapter.IdAdapter
import com.lsp.view.adapter.SizeAdapter
import com.lsp.view.adapter.TagAdapter
import com.lsp.view.R
import com.lsp.view.bean.Author
import com.lsp.view.bean.ID
import com.lsp.view.bean.Size
import com.lsp.view.bean.Tags
import com.lsp.view.main.MainActivity
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.*
@@ -83,8 +82,10 @@ class PicActivity : AppCompatActivity() {
sharedPreferences.putBoolean("FirstRun",false)
val FileD = File("${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake")
FileD.mkdirs()
}
val id = intent.getStringExtra("id")
if (id!=null){
loadTags<ID>(id)
@@ -94,10 +95,11 @@ class PicActivity : AppCompatActivity() {
loadPic(it)
}
val file_url = intent.getStringExtra("file_url")
val file_ext = intent.getStringExtra("file_ext")
val fbtn = findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(R.id.fbtn)
val fbtn = findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(
R.id.fbtn
)
val path = "${Environment.getExternalStorageDirectory()}/${Environment.DIRECTORY_PICTURES}/LspMake/" +
"${time}.$file_ext"
@@ -171,7 +173,9 @@ class PicActivity : AppCompatActivity() {
) {
val file_ext = intent.getStringExtra("file_ext")
val file_url = intent.getStringExtra("file_url")
val fbtn = findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(R.id.fbtn)
val fbtn = findViewById<com.google.android.material.floatingactionbutton.FloatingActionButton>(
R.id.fbtn
)
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when(requestCode){
@@ -242,8 +246,9 @@ class PicActivity : AppCompatActivity() {
}
private fun loadPic(url:String){
val glideUrl = GlideUrl(url, LazyHeaders.Builder().addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36").build())
Glide.with(this).load(url).listener(object :RequestListener<Drawable?>{
Glide.with(this).load(glideUrl).listener(object :RequestListener<Drawable?>{
override fun onLoadFailed(
e: GlideException?,
model: Any?,
@@ -251,7 +256,17 @@ class PicActivity : AppCompatActivity() {
isFirstResource: Boolean
): Boolean {
val pb = findViewById<ProgressBar>(R.id.pb)
Snackbar.make(pb,"加载错误",Snackbar.LENGTH_SHORT).show()
Log.e("erroe",e.toString())
Snackbar.make(pb,"加载错误",Snackbar.LENGTH_LONG).setAction("查看Log"){
AlertDialog.Builder(this@PicActivity).apply {
setTitle("Log")
setMessage(e.toString())
setNegativeButton("确定",null)
create()
show()
}
}.show()
pb.visibility = View.INVISIBLE
return false
}
@@ -299,9 +314,9 @@ class PicActivity : AppCompatActivity() {
tagList.add(Tags(tag))
}
val adapter = TagAdapter(tagList)
adapter.setOnItemClickListener(object :TagAdapter.OnItemClickListener{
adapter.setOnItemClickListener(object : TagAdapter.OnItemClickListener{
override fun onItemClick(view: View, position: Int) {
val intent = Intent(this@PicActivity,MainActivity::class.java)
val intent = Intent(this@PicActivity, MainActivity::class.java)
intent.putExtra("searchTag",tagList[position].tag)
startActivity(intent)
}
@@ -1,4 +1,4 @@
package com.lsp.view.adapter
package com.lsp.view.pic
import android.util.Log
import android.view.LayoutInflater
@@ -1,4 +1,4 @@
package com.lsp.view.adapter
package com.lsp.view.pic
import android.view.LayoutInflater
import android.view.View
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M21,19V5c0,-1.1 -0.9,-2 -2,-2H5c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h14c1.1,0 2,-0.9 2,-2zM8.5,13.5l2.5,3.01L14.5,12l4.5,6H5l3.5,-4.5z"/>
</vector>
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M17.63,5.84C17.27,5.33 16.67,5 16,5L5,5.01C3.9,5.01 3,5.9 3,7v10c0,1.1 0.9,1.99 2,1.99L16,19c0.67,0 1.27,-0.33 1.63,-0.84L22,12l-4.37,-6.16z"/>
</vector>
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M11,7L9.6,8.4l2.6,2.6H2v2h10.2l-2.6,2.6L11,17l5,-5L11,7zM20,19h-8v2h8c1.1,0 2,-0.9 2,-2V5c0,-1.1 -0.9,-2 -2,-2h-8v2h8V19z"/>
</vector>
@@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M3,18h18v-2L3,16v2zM3,13h18v-2L3,11v2zM3,6v2h18L21,6L3,6z"/>
</vector>
@@ -0,0 +1,5 @@
<vector android:height="40dp" android:tint="#FFFFFF"
android:viewportHeight="20" android:viewportWidth="20"
android:width="40dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M10,6L8.59,7.41 13.17,12l-4.58,4.59L10,18l6,-6z"/>
</vector>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context=".login.LoginActivity">
<TextView
android:layout_marginTop="160dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="44sp"
android:id="@+id/title"
android:text="Login"/>
<EditText
android:hint="账号..."
android:layout_marginTop="20dp"
android:layout_gravity="center"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:id="@+id/username"/>
<EditText
android:hint="密码..."
android:inputType="textPassword"
android:layout_gravity="center"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:id="@+id/password"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:layout_width="60dp"
android:layout_height="60dp"
android:id="@+id/login"
android:background="@color/primary"
android:src="@drawable/ic_baseline_navigate_next_24"
android:layout_marginTop="30dp"
android:layout_gravity="center"
android:elevation="8dp"/>
</LinearLayout>
+22 -9
View File
@@ -1,10 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<androidx.drawerlayout.widget.DrawerLayout
android:id="@+id/drawerLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
tools:context=".main.MainActivity">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".main.MainActivity">
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -77,8 +84,6 @@
android:paddingStart="10dp"
android:textSize="20sp"
android:layout_width="match_parent"
android:textColor="#000"
android:background="@drawable/edit_bg"
android:layout_height="?attr/actionBarSize"
android:id="@+id/search"/>
<View
@@ -95,9 +100,17 @@
android:layout_weight="1"/>
</LinearLayout>
</RelativeLayout>
<com.google.android.material.navigation.NavigationView
android:layout_width="240dp"
android:layout_height="match_parent"
android:id="@+id/nav"
android:layout_gravity="start"
app:menu="@menu/nav_menu"
app:headerLayout="@layout/nav_header"
android:fitsSystemWindows="true"/>
<!-- TODO 侧边连:登录 收藏 Tag列表-->
</androidx.drawerlayout.widget.DrawerLayout>
+1 -1
View File
@@ -8,7 +8,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PicActivity">
tools:context=".pic.PicActivity">
<com.google.android.material.appbar.AppBarLayout
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/nav_header"
android:layout_width="match_parent"
android:layout_height="180dp">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:text="Null"
android:layout_marginEnd="30dp"
android:textSize="32sp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="#000"/>
</FrameLayout>
+10 -7
View File
@@ -2,13 +2,16 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/yande"
android:icon="@drawable/ic_launcher_foreground"
android:title="Yande.re"/>
android:id="@+id/photo"
android:icon="@drawable/ic_baseline_insert_photo_24"
android:title="Photo"/>
<item
android:id="@+id/ko"
android:icon="@drawable/ic_launcher_foreground"
android:title="Yande.re"/>
android:id="@+id/fav"
android:icon="@drawable/ic_baseline_favorite_24"
android:title="Favorite"/>
<item
android:id="@+id/taglist"
android:icon="@drawable/ic_baseline_label_24"
android:title="Tags"/>
</group>
</menu>