diff --git a/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java b/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java index d44c9f4..84ddf44 100644 --- a/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java +++ b/app/src/main/java/com/example/tampopo_client/viewmodels/UserViewModel.java @@ -1,5 +1,7 @@ package com.example.tampopo_client.viewmodels; +import android.util.Log; + import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.ViewModel; @@ -135,7 +137,9 @@ if (response.isSuccessful()) { System.out.println(response.code()); - return response.body(); + String iconUrl = response.body(); + icon.postValue(iconUrl); + return iconUrl; } else { System.out.println(response.code()); return null; @@ -159,6 +163,26 @@ // }); } + //アイコン(非同期) + public void getIconAsync(String id) { + Call call = userResource.getIcon(id); + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + String iconUrl = response.body(); + icon.postValue(iconUrl); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Log.e("UserViewModel", "Error"); + } + }); + } + + public void updateIcon(String id, String newIcon, String token) { Call call = userResource.updateIcon(id, newIcon, token); call.enqueue(new Callback() { @@ -264,5 +288,8 @@ } + + //viewModelのところでを呼び出すがフレンド系は西村さんの方で管理する + } diff --git a/app/src/main/java/com/example/tampopo_client/views/ProfileActivity.java b/app/src/main/java/com/example/tampopo_client/views/ProfileActivity.java index 368d583..b94a61b 100644 --- a/app/src/main/java/com/example/tampopo_client/views/ProfileActivity.java +++ b/app/src/main/java/com/example/tampopo_client/views/ProfileActivity.java @@ -1,27 +1,69 @@ package com.example.tampopo_client.views; + import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import com.bumptech.glide.Glide; import com.example.tampopo_client.R; import com.example.tampopo_client.Tampopo; import com.example.tampopo_client.viewmodels.UserViewModel; +import com.google.android.material.imageview.ShapeableImageView; + +import java.io.BufferedInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.security.AccessController; +import java.util.Base64; public class ProfileActivity extends AppCompatActivity { private UserViewModel userViewModel; + Tampopo app; + private String changeIconUrl; + private boolean iconFlag; + ShapeableImageView iconView; + private ActivityResultLauncher launcher = registerForActivityResult(new ActivityResultContracts.OpenDocument(), new ActivityResultCallback() { + @Override + public void onActivityResult(Uri uri) { + if(uri == null)return; + ShapeableImageView changeIconButton = findViewById(R.id.changeIcon); + changeIconButton.setImageURI(uri); + try { + InputStream inputStream = getApplicationContext().getContentResolver().openInputStream(uri); + Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream)); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream); + byte[] byteArray = stream.toByteArray(); + changeIconUrl = Base64.getEncoder().encodeToString(byteArray); + iconFlag = true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -36,10 +78,16 @@ // ViewModel初期化 userViewModel = new ViewModelProvider(this).get(UserViewModel.class); + app = (Tampopo) getApplication(); + String uid = app.getUserId(); + + ShapeableImageView iconView = findViewById(R.id.myicon); + ShapeableImageView changeIconView = findViewById(R.id.changeIcon); + //プロフィール編集画面から設定画面への遷移 - ImageButton buttonReturn = (ImageButton)findViewById(R.id.buttonReturn); + ImageButton buttonReturn = (ImageButton) findViewById(R.id.buttonReturn); buttonReturn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent = new Intent(ProfileActivity.this, SettingActivity.class); @@ -47,7 +95,16 @@ } }); - //もともとのidとニックネームを表示 + + //もともとのidとニックネームとアイコンを表示 + userViewModel.getIconAsync(uid); + userViewModel.getIcon().observe(this, new Observer() { + @Override + public void onChanged(String iconUrl) { + Glide.with(ProfileActivity.this).load(iconUrl).into(iconView); + } + }); + EditText nicknameInput = (EditText) findViewById(R.id.nicknamebutton); nicknameInput.setText(((Tampopo) ProfileActivity.this.getApplication()).getNickname()); @@ -57,12 +114,22 @@ //IDを変更できないようにする useridInput.setEnabled(false); + //アイコンを押したときの変更 + iconView.setOnClickListener(new View.OnClickListener(){ + public void onClick(View v) { + launcher.launch(new String[] {"image/*"}); + } - //決定ボタンを押したときにidとニックネームを保存 + }); + + //決定ボタン Button dicisionbutton = findViewById(R.id.dicisionbutton); + //決定ボタンを押したときにidとニックネームとアイコンを保存 dicisionbutton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { + + EditText usernicknameInput = findViewById(R.id.nicknamebutton); String usernickname = usernicknameInput.getText().toString(); @@ -70,11 +137,16 @@ String userid = useridInput.getText().toString(); // Application(Tampopo)に保存 - Tampopo app = (Tampopo) getApplication(); + app.setNickname(usernickname); app.setUserId(userid); - userViewModel.updateName(app.getUserId(),usernickname, app.getToken()); + userViewModel.updateName(app.getUserId(), usernickname, app.getToken()); + if(iconFlag){ + Bitmap iconBitmap = ((BitmapDrawable) changeIconView.getDrawable()).getBitmap(); + userViewModel.updateIcon(app.getUserId(),changeIconUrl,app.getToken()); + app.setIcon(changeIconUrl); + } // 設定画面に戻る Intent intent = new Intent(ProfileActivity.this, SettingActivity.class); @@ -99,6 +171,4 @@ } - - } diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 4e5056c..fc779ad 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -7,6 +7,26 @@ android:layout_height="match_parent" tools:context=".views.ProfileActivity"> + +