diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt b/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt
index d92a552..00caa7f 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/MainActivity.kt
@@ -118,7 +118,7 @@ class MainActivity : AppCompatActivity(), ConnectivityReceiver.ConnectivityRecei
toggle.syncState()
tvAbout.text = Html.fromHtml("""
-
© 2019 — Kurozero | v${Api.version} (${Api.versionCode})
+
© 2020 — Kurozero | v${Api.version} (${Api.versionCode})
Made possible with nekos.moe
""".trimIndent(), Html.FROM_HTML_MODE_LEGACY)
tvAbout.movementMethod = LinkMovementMethod.getInstance()
@@ -177,6 +177,7 @@ class MainActivity : AppCompatActivity(), ConnectivityReceiver.ConnectivityRecei
Fresco.initialize(this, config)
GlobalScope.launch {
+ @Suppress("BlockingMethodInNonBlockingContext")
Thread.sleep(5_000)
init = false
}
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt b/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt
index 1b209e1..035e6f0 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/ProfileActivity.kt
@@ -15,8 +15,8 @@ class ProfileActivity : AppCompatActivity() {
tvLikes.text = user!!.likesReceived.toString()
tvFavorites.text = user!!.favoritesReceived.toString()
tvJoined.text = timestamp(user!!.createdAt)
- tvPosted.text = "${user!!.uploads} ${if (user!!.uploads == 1) "image" else "images"}"
- tvGiven.text = "Has given ${user!!.likes.size} likes and ${user!!.favorites.size} favorites"
+ tvPosted.text = getString(R.string.posted2, user!!.uploads, if (user!!.uploads == 1) "image" else "images")
+ tvGiven.text = getString(R.string.given, user!!.likes.size, user!!.favorites.size)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt
index 7f40141..bb28d26 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosGridRecyclerAdapter.kt
@@ -5,7 +5,6 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import xyz.kurozero.nekosmoe.R
import xyz.kurozero.nekosmoe.model.Neko
-import xyz.kurozero.nekosmoe.model.Nekos
class NekosGridRecyclerAdapter : RecyclerView.Adapter() {
private var listOfNekos = listOf()
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt
index a0b0b42..41f5f7a 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/adapter/NekosViewHolder.kt
@@ -121,12 +121,12 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
user?.likes?.add(neko.id)
sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply()
Snackbar.make(view, "Liked", Snackbar.LENGTH_SHORT).show()
- GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = "Unlike" }
+ GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = view.context.getString(R.string.unlike) }
} else {
user?.likes?.remove(neko.id)
sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply()
Snackbar.make(view, "Unliked", Snackbar.LENGTH_SHORT).show()
- GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = "Like" }
+ GlobalScope.launch(Dispatchers.Main) { view.btnLikeNeko.text = view.context.getString(R.string.like) }
}
}
response.close()
@@ -171,12 +171,12 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
user?.favorites?.add(neko.id)
sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply()
Snackbar.make(view, "Favorited", Snackbar.LENGTH_SHORT).show()
- GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = "Unfavorite" }
+ GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = view.context.getString(R.string.unfav) }
} else {
user?.favorites?.remove(neko.id)
sharedPreferences.edit().putString("user", Api.gson.toJson(user!!)).apply()
Snackbar.make(view, "Unfavorited", Snackbar.LENGTH_SHORT).show()
- GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = "Favorite" }
+ GlobalScope.launch(Dispatchers.Main) { view.btnFavNeko.text = view.context.getString(R.string.fav) }
}
}
response.close()
@@ -193,8 +193,8 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
nekoDialog.dismiss()
}
- view.btnShareNeko.onClick {
- if (!connected || !isConnected(itemView.context)) return@onClick
+ view.btnShareNeko.onClick shareNeko@ {
+ if (!connected || !isConnected(itemView.context)) return@shareNeko
picasso.load(neko.getImageUrl()).into {
onFailed { e, _ ->
@@ -236,8 +236,8 @@ class NekosViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
}
- view.btnSaveNeko.onClick {
- if (!connected || ! isConnected(view.context)) return@onClick
+ view.btnSaveNeko.onClick saveNeko@ {
+ if (!connected || ! isConnected(view.context)) return@saveNeko
if (!hasPermissions(view.context, permissions)) {
ActivityCompat.requestPermissions(view.context as MainActivity, permissions, 999)
@@ -260,7 +260,7 @@ private fun downloadAndSave(neko: Neko, view: View) {
val fos: OutputStream
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
- val resolver = view.context.contentResolver;
+ val resolver = view.context.contentResolver
val values = ContentValues()
values.put(MediaStore.MediaColumns.DISPLAY_NAME, neko.id)
values.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt
index 35da7ec..31b4229 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/ConnectivityReceiver.kt
@@ -15,6 +15,7 @@ class ConnectivityReceiver : BroadcastReceiver() {
}
}
+ @Suppress("DEPRECATION")
private fun isConnectedOrConnecting(context: Context): Boolean {
val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connMgr.activeNetworkInfo
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt
index 92e1ac6..db5d4ad 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/EndlessRecyclerViewScrollListener.kt
@@ -5,8 +5,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.StaggeredGridLayoutManager
-
-abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener {
+abstract class EndlessRecyclerViewScrollListener(layoutManager: GridLayoutManager) :
+ RecyclerView.OnScrollListener() {
// The minimum amount of items to have below your current scroll position
// before loading more.
private var visibleThreshold = 5
@@ -19,23 +19,14 @@ abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener
// Sets the starting page index
private val startingPageIndex = 0
- private var mLayoutManager: RecyclerView.LayoutManager
-
- constructor(layoutManager: LinearLayoutManager) {
- this.mLayoutManager = layoutManager
- }
-
- constructor(layoutManager: GridLayoutManager) {
- this.mLayoutManager = layoutManager
- visibleThreshold *= layoutManager.spanCount
- }
+ private var mLayoutManager: RecyclerView.LayoutManager = layoutManager
- constructor(layoutManager: StaggeredGridLayoutManager) {
- this.mLayoutManager = layoutManager
+ init {
visibleThreshold *= layoutManager.spanCount
}
- fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int {
+ @Suppress("unused")
+ private fun getLastVisibleItem(lastVisibleItemPositions: IntArray): Int {
var maxSize = 0
for (i in lastVisibleItemPositions.indices) {
if (i == 0) {
@@ -113,6 +104,7 @@ abstract class EndlessRecyclerViewScrollListener : RecyclerView.OnScrollListener
this.loading = true
}
+ @Suppress("unused")
fun setLoading(state: Boolean) = run { loading = state }
// Defines the process for actually loading more data based on page
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt b/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt
index b2fc090..5c65c16 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/helper/Utils.kt
@@ -1,16 +1,7 @@
package xyz.kurozero.nekosmoe.helper
-
-import android.annotation.SuppressLint
-import android.content.ContentUris
import android.content.Context
import android.content.pm.PackageManager
-import android.database.Cursor
-import android.net.Uri
-import android.os.Build
-import android.os.Environment
-import android.provider.DocumentsContract
-import android.provider.MediaStore
import android.graphics.Typeface
import android.net.ConnectivityManager
import android.text.format.DateUtils
@@ -18,100 +9,6 @@ import androidx.core.app.ActivityCompat
import java.text.SimpleDateFormat
import java.util.*
-object FilePickUtils {
- private fun getPathDeprecated(ctx: Context, uri: Uri?): String? {
- if (uri == null) {
- return null
- }
- val projection = arrayOf(MediaStore.Images.Media.DATA)
- val cursor = ctx.contentResolver.query(uri, projection, null, null, null)
- if (cursor != null) {
- val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
- cursor.moveToFirst()
- val returnVal = cursor.getString(columnIndex)
- cursor.close()
- return returnVal
- }
- return uri.path
- }
-
- @SuppressLint("ObsoleteSdkInt")
- fun getSmartFilePath(ctx: Context, uri: Uri): String? {
- if (Build.VERSION.SDK_INT < 19) {
- return getPathDeprecated(ctx, uri)
- }
- return getPath(ctx, uri)
- }
-
- private fun getPath(context: Context, uri: Uri): String? {
- if (DocumentsContract.isDocumentUri(context, uri)) {
- if (isExternalStorageDocument(uri)) {
- val docId = DocumentsContract.getDocumentId(uri)
- val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
- val type = split[0]
-
- if ("primary".equals(type, ignoreCase = true)) {
- return Environment.getExternalStorageDirectory().toString() + "/" + split[1]
- }
- } else if (isDownloadsDocument(uri)) {
- val id = DocumentsContract.getDocumentId(uri)
- val contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), java.lang.Long.valueOf(id)!!)
- return getDataColumn(context, contentUri, null, null)
- } else if (isMediaDocument(uri)) {
- val docId = DocumentsContract.getDocumentId(uri)
- val split = docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
- val type = split[0]
-
- var contentUri: Uri? = null
- when (type) {
- "image" -> contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
- "video" -> contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
- "audio" -> contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
- }
-
- val selection = "_id=?"
- val selectionArgs = arrayOf(split[1])
-
- return contentUri?.let { getDataColumn(context, it, selection, selectionArgs) }
- }
- } else if ("content".equals(uri.scheme, ignoreCase = true)) {
- return getDataColumn(context, uri, null, null)
- } else if ("file".equals(uri.scheme, ignoreCase = true)) {
- return uri.path
- }
- return null
- }
-
- private fun getDataColumn(context: Context, uri: Uri, selection: String?, selectionArgs: Array?): String? {
- var cursor: Cursor? = null
- val column = "_data"
- val projection = arrayOf(column)
-
- try {
- cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
- if (cursor != null && cursor.moveToFirst()) {
- val columnIndex = cursor.getColumnIndexOrThrow(column)
- return cursor.getString(columnIndex)
- }
- } finally {
- cursor?.close()
- }
- return null
- }
-
- private fun isExternalStorageDocument(uri: Uri): Boolean {
- return "com.android.externalstorage.documents" == uri.authority
- }
-
- private fun isDownloadsDocument(uri: Uri): Boolean {
- return "com.android.providers.downloads.documents" == uri.authority
- }
-
- private fun isMediaDocument(uri: Uri): Boolean {
- return "com.android.providers.media.documents" == uri.authority
- }
-}
-
object FontsOverride {
fun setDefaultFont(context: Context, staticTypefaceFieldName: String, fontAssetName: String) {
val regular = Typeface.createFromAsset(context.assets, fontAssetName)
@@ -134,7 +31,7 @@ object FontsOverride {
fun timestamp(timeCreated: String): String {
val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH)
- val timeCreatedDate = dateFormat.parse(timeCreated)
+ val timeCreatedDate = dateFormat.parse(timeCreated)!!
return DateUtils.getRelativeTimeSpanString(timeCreatedDate.time, System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS) as String
}
@@ -149,6 +46,7 @@ fun hasPermissions(context: Context?, permissions: Array): Boolean {
return true
}
+@Suppress("DEPRECATION")
fun isConnected(context: Context): Boolean {
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val activeNetwork = cm.activeNetworkInfo
diff --git a/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt b/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt
index bf91f40..796f554 100644
--- a/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt
+++ b/app/src/main/java/xyz/kurozero/nekosmoe/model/NekoModel.kt
@@ -1,3 +1,5 @@
+@file:Suppress("unused")
+
package xyz.kurozero.nekosmoe.model
data class Nekos(
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0d170de..ed19e69 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -51,4 +51,9 @@
/post/…
Nekos.moe
Profile
+ Unlike
+ Like
+ Unfavorite
+ Favorite
+ %1$d %2$s