@@ -6,11 +6,10 @@ import android.content.Intent
66import android.graphics.Bitmap
77import android.graphics.BitmapFactory
88import 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.*
1310import android.widget.ImageView
11+ import android.widget.Toast
12+ import androidx.appcompat.app.AlertDialog
1413import androidx.appcompat.app.AppCompatActivity
1514import androidx.recyclerview.widget.GridLayoutManager
1615import androidx.recyclerview.widget.RecyclerView
@@ -20,62 +19,102 @@ import java.io.FileOutputStream
2019class 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