Skip to content

Commit c975b4d

Browse files
authored
SkinLibraryActivity.kt の更新
1 parent 562584a commit c975b4d

File tree

1 file changed

+78
-39
lines changed

1 file changed

+78
-39
lines changed

app/src/main/java/com/rabimi/javaskinchanger/SkinLibraryActivity.kt

Lines changed: 78 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@ import android.content.Intent
66
import android.graphics.Bitmap
77
import android.graphics.BitmapFactory
88
import android.os.Bundle
9-
import android.view.LayoutInflater
10-
import android.view.View
11-
import android.view.ViewGroup
12-
import android.widget.ImageButton
9+
import android.view.*
1310
import android.widget.ImageView
11+
import android.widget.Toast
12+
import androidx.appcompat.app.AlertDialog
1413
import androidx.appcompat.app.AppCompatActivity
1514
import androidx.recyclerview.widget.GridLayoutManager
1615
import androidx.recyclerview.widget.RecyclerView
@@ -20,62 +19,102 @@ import java.io.FileOutputStream
2019
class SkinLibraryActivity : AppCompatActivity() {
2120

2221
companion object {
23-
const val RESULT_SKIN_BITMAP = "result_skin_bitmap"
24-
const val EXTRA_CURRENT_SKIN = "extra_current_skin"
22+
const val EXTRA_SELECTED_SKIN_PATH = "selected_skin_path"
2523
}
2624

2725
private lateinit var recyclerView: RecyclerView
2826
private lateinit var adapter: SkinAdapter
29-
private lateinit var btnAddCurrent: ImageButton
30-
private val skinFiles = mutableListOf<File>()
27+
private lateinit var addButton: ImageView
28+
29+
private val skins = mutableListOf<File>()
3130

3231
override fun onCreate(savedInstanceState: Bundle?) {
3332
super.onCreate(savedInstanceState)
3433
setContentView(R.layout.activity_library)
3534

36-
recyclerView = findViewById(R.id.recyclerViewSkins)
37-
recyclerView.layoutManager = GridLayoutManager(this, 4)
38-
39-
btnAddCurrent = findViewById(R.id.btnAddCurrentSkin)
35+
recyclerView = findViewById(R.id.recyclerView)
36+
addButton = findViewById(R.id.btnAddSkin)
4037

41-
loadLibrary()
42-
adapter = SkinAdapter(skinFiles.map { it.absolutePath }) { path ->
43-
val bmp = BitmapFactory.decodeFile(path)
44-
val resized = Bitmap.createScaledBitmap(bmp, 64, 64, true)
45-
val intent = Intent().apply {
46-
putExtra(RESULT_SKIN_BITMAP, bmpToByteArray(resized))
47-
}
48-
setResult(Activity.RESULT_OK, intent)
49-
finish()
50-
}
38+
recyclerView.layoutManager = GridLayoutManager(this, 4)
39+
adapter = SkinAdapter()
5140
recyclerView.adapter = adapter
5241

53-
btnAddCurrent.setOnClickListener {
54-
val bytes = intent.getByteArrayExtra(EXTRA_CURRENT_SKIN) ?: return@setOnClickListener
55-
val bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
42+
loadSkins()
43+
44+
// ライブラリに追加
45+
addButton.setOnClickListener {
46+
val bmp = intent.getParcelableExtra<Bitmap>("currentSkin") ?: return@setOnClickListener
5647
saveSkinToLibrary(bmp)
5748
}
5849
}
5950

60-
private fun loadLibrary() {
61-
val dir = getDir("skin_library", Context.MODE_PRIVATE)
62-
skinFiles.clear()
63-
skinFiles.addAll(dir.listFiles()?.toList() ?: emptyList())
51+
private fun loadSkins() {
52+
skins.clear()
53+
val dir = getSkinsDir()
54+
if (!dir.exists()) dir.mkdirs()
55+
dir.listFiles()?.let { skins.addAll(it) }
56+
adapter.notifyDataSetChanged()
6457
}
6558

59+
private fun getSkinsDir(): File = File(filesDir, "skin_library")
60+
6661
private fun saveSkinToLibrary(bitmap: Bitmap) {
67-
val dir = getDir("skin_library", Context.MODE_PRIVATE)
68-
val file = File(dir, "skin_${System.currentTimeMillis()}.png")
69-
FileOutputStream(file).use { out ->
70-
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
62+
val dir = getSkinsDir()
63+
val filename = "skin_${System.currentTimeMillis()}.png"
64+
val file = File(dir, filename)
65+
try {
66+
FileOutputStream(file).use { out ->
67+
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)
68+
}
69+
Toast.makeText(this, "スキン追加しました", Toast.LENGTH_SHORT).show()
70+
loadSkins()
71+
} catch (e: Exception) {
72+
e.printStackTrace()
73+
Toast.makeText(this, "追加に失敗しました", Toast.LENGTH_SHORT).show()
7174
}
72-
skinFiles.add(file)
73-
adapter.updateData(skinFiles.map { it.absolutePath })
7475
}
7576

76-
private fun bmpToByteArray(bitmap: Bitmap): ByteArray {
77-
val baos = java.io.ByteArrayOutputStream()
78-
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos)
79-
return baos.toByteArray()
77+
inner class SkinAdapter : RecyclerView.Adapter<SkinAdapter.SkinViewHolder>() {
78+
79+
inner class SkinViewHolder(view: View) : RecyclerView.ViewHolder(view) {
80+
val imgSkin: ImageView = view.findViewById(R.id.imgSkinItem)
81+
}
82+
83+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SkinViewHolder {
84+
val view = layoutInflater.inflate(R.layout.item_skin, parent, false)
85+
return SkinViewHolder(view)
86+
}
87+
88+
override fun onBindViewHolder(holder: SkinViewHolder, position: Int) {
89+
val file = skins[position]
90+
val bmp = BitmapFactory.decodeFile(file.absolutePath)
91+
holder.imgSkin.setImageBitmap(bmp)
92+
93+
// 選択
94+
holder.imgSkin.setOnClickListener {
95+
val data = Intent().apply {
96+
putExtra(EXTRA_SELECTED_SKIN_PATH, file.absolutePath)
97+
}
98+
setResult(Activity.RESULT_OK, data)
99+
finish()
100+
}
101+
102+
// 削除
103+
holder.imgSkin.setOnLongClickListener {
104+
AlertDialog.Builder(this@SkinLibraryActivity)
105+
.setTitle("削除確認")
106+
.setMessage("このスキンを削除しますか?")
107+
.setPositiveButton("削除") { _, _ ->
108+
file.delete()
109+
loadSkins()
110+
Toast.makeText(this@SkinLibraryActivity, "削除しました", Toast.LENGTH_SHORT).show()
111+
}
112+
.setNegativeButton("キャンセル", null)
113+
.show()
114+
true
115+
}
116+
}
117+
118+
override fun getItemCount(): Int = skins.size
80119
}
81120
}

0 commit comments

Comments
 (0)