11package com.rabimi.javaskinchanger
22
3- import com.rabimi.javaskinchanger.render.Skin3DApp
43import android.app.Activity
54import android.content.Intent
65import android.content.res.ColorStateList
@@ -11,8 +10,6 @@ import android.provider.MediaStore
1110import android.view.View
1211import android.widget.*
1312import androidx.appcompat.app.AlertDialog
14- import com.badlogic.gdx.backends.android.AndroidApplication
15- import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration
1613import com.google.android.material.switchmaterial.SwitchMaterial
1714import kotlinx.coroutines.*
1815import org.json.JSONObject
@@ -21,7 +18,7 @@ import java.io.DataOutputStream
2118import java.net.HttpURLConnection
2219import java.net.URL
2320
24- class MainActivity : AndroidApplication () {
21+ class MainActivity : Activity () {
2522
2623 companion object { private const val TAG = " SkinDebug" }
2724
@@ -33,11 +30,11 @@ class MainActivity : AndroidApplication() {
3330 private lateinit var switchModel: SwitchMaterial
3431 private lateinit var lblModel: TextView
3532 private lateinit var progressBar: ProgressBar
33+ private lateinit var skinView: ImageView
3634
37- private lateinit var skinApp: Skin3DApp
3835 private val REQUEST_SKIN_PICK = 1001
3936 private var currentSkinBitmap: Bitmap ? = null
40- private val scope = CoroutineScope (SupervisorJob () + Dispatchers .Main ) // UI を使うことが多いので Main をベースにする
37+ private val scope = CoroutineScope (SupervisorJob () + Dispatchers .Main )
4138
4239 private val colorSelect = 0xFF4FC3F7 .toInt()
4340 private val colorUploadTarget = 0xFF4CAF50 .toInt()
@@ -55,12 +52,7 @@ class MainActivity : AndroidApplication() {
5552 switchModel = findViewById(R .id.switchModel)
5653 lblModel = findViewById(R .id.lblModel)
5754 progressBar = findViewById(R .id.progressBar)
58-
59- val container = findViewById<FrameLayout >(R .id.skinContainer)
60- skinApp = Skin3DApp ()
61- val config = AndroidApplicationConfiguration ()
62- val gdxView = initializeForView(skinApp, config)
63- container.addView(gdxView, FrameLayout .LayoutParams (FrameLayout .LayoutParams .MATCH_PARENT , FrameLayout .LayoutParams .MATCH_PARENT ))
55+ skinView = findViewById(R .id.imgSkin) // ← ここを ImageView に修正
6456
6557 setupUI()
6658 checkLogin()
@@ -75,8 +67,7 @@ class MainActivity : AndroidApplication() {
7567
7668 switchModel.setOnCheckedChangeListener { _, isChecked ->
7769 lblModel.text = if (isChecked) " モデル: Alex" else " モデル: Steve"
78- skinApp.setModelType(if (isChecked) " slim" else " classic" )
79- currentSkinBitmap?.let { skinApp.updateSkin(it) }
70+ currentSkinBitmap?.let { skinView.setImageBitmap(it) }
8071 }
8172
8273 btnSelect.setOnClickListener { selectSkinImage() }
@@ -104,25 +95,22 @@ class MainActivity : AndroidApplication() {
10495 }
10596
10697 private fun loadAccountSkinOrTest () {
107- // すでに選ばれているスキンがあればそれを優先
10898 if (currentSkinBitmap != null ) {
109- skinApp.updateSkin (currentSkinBitmap!! )
99+ skinView.setImageBitmap (currentSkinBitmap)
110100 return
111101 }
112102
113103 val prefs = getSharedPreferences(" prefs" , MODE_PRIVATE )
114104 val mcToken = prefs.getString(" minecraft_token" , null ) ? : return
115105
116- // Coroutine 内でネットワーク IO を行う(fetchMinecraftSkin は suspend)
117106 scope.launch {
118- val skinBitmap = fetchMinecraftSkin(mcToken) // suspend safe
107+ val skinBitmap = fetchMinecraftSkin(mcToken)
119108 val bmp = skinBitmap ? : Bitmap .createBitmap(64 , 64 , Bitmap .Config .ARGB_8888 ).apply { eraseColor(0xFFFF0000 .toInt()) }
120109 currentSkinBitmap = bmp
121- skinApp.updateSkin (bmp)
110+ skinView.setImageBitmap (bmp)
122111 }
123112 }
124113
125- // suspend にして IO スレッドで安全に動くようにする
126114 private suspend fun fetchMinecraftSkin (token : String ): Bitmap ? = withContext(Dispatchers .IO ) {
127115 try {
128116 val url = URL (" https://api.minecraftservices.com/minecraft/profile" )
@@ -134,9 +122,8 @@ class MainActivity : AndroidApplication() {
134122 val resp = conn.inputStream.bufferedReader().use { it.readText() }
135123 val json = JSONObject (resp)
136124
137- // JSON の構造が変わる可能性があるので安全に取り出す
138- val skins = json.optJSONArray(" skins" )
139- if (skins == null || skins.length() == 0 ) return @withContext null
125+ val skins = json.optJSONArray(" skins" ) ? : return @withContext null
126+ if (skins.length() == 0 ) return @withContext null
140127 val skinUrl = skins.getJSONObject(0 ).optString(" url" , null ) ? : return @withContext null
141128
142129 val skinConn = URL (skinUrl).openConnection() as HttpURLConnection
@@ -164,7 +151,7 @@ class MainActivity : AndroidApplication() {
164151 val orig = MediaStore .Images .Media .getBitmap(contentResolver, uri)
165152 val bmp = Bitmap .createScaledBitmap(orig.copy(Bitmap .Config .ARGB_8888 , true ), 64 , 64 , true )
166153 currentSkinBitmap = bmp
167- skinApp.updateSkin (bmp)
154+ skinView.setImageBitmap (bmp)
168155
169156 btnUpload.visibility = View .VISIBLE
170157 btnUpload.backgroundTintList = ColorStateList .valueOf(colorUploadTarget)
@@ -192,25 +179,18 @@ class MainActivity : AndroidApplication() {
192179 progressBar.visibility = View .VISIBLE
193180 progressBar.progress = 0
194181
195- // uploadSkin は suspend なので coroutine 内で呼ぶ
196182 scope.launch {
197183 val success = uploadSkin(mcToken, bmp, modelType) { progress ->
198- // MainScope なので直接 UI 更新可能
199184 progressBar.progress = progress
200185 }
201186
202- // アップロード完了/失敗の処理
203187 progressBar.visibility = View .GONE
204- Toast .makeText(
205- this @MainActivity,
188+ Toast .makeText(this @MainActivity,
206189 if (success) " アップロード完了" else " アップロード失敗" ,
207- Toast .LENGTH_SHORT
208- ).show()
190+ Toast .LENGTH_SHORT ).show()
209191 }
210192 }
211193
212-
213- // suspend 化して IO で実行するようにした(進捗コールバックは保持)
214194 private suspend fun uploadSkin (token : String , bmp : Bitmap , model : String , onProgress : (Int ) -> Unit ): Boolean =
215195 withContext(Dispatchers .IO ) {
216196 try {
@@ -255,7 +235,6 @@ class MainActivity : AndroidApplication() {
255235 out .flush()
256236 out .close()
257237
258- // 応答を読みつつ終了コードを確認
259238 conn.inputStream.use { it.readBytes() }
260239 val rc = conn.responseCode
261240 rc in 200 .. 299
0 commit comments