diff --git a/data/src/main/java/one/nem/kidshift/data/ChildData.java b/data/src/main/java/one/nem/kidshift/data/ChildData.java index d16cc55..530b0b9 100644 --- a/data/src/main/java/one/nem/kidshift/data/ChildData.java +++ b/data/src/main/java/one/nem/kidshift/data/ChildData.java @@ -31,7 +31,7 @@ public interface ChildData { * 子ユーザー情報更新 * @param child 子ユーザー情報 */ - void updateChild(ChildModel child); + CompletableFuture updateChild(ChildModel child); /** * 子ユーザー追加 @@ -43,7 +43,7 @@ public interface ChildData { * 子ユーザー削除 * @param childId 子ID */ - void removeChild(String childId); + CompletableFuture removeChild(String childId); /** * 子ユーザーログインコード発行 diff --git a/data/src/main/java/one/nem/kidshift/data/impl/ChildDataImpl.java b/data/src/main/java/one/nem/kidshift/data/impl/ChildDataImpl.java index 54e14a6..0f97cf9 100644 --- a/data/src/main/java/one/nem/kidshift/data/impl/ChildDataImpl.java +++ b/data/src/main/java/one/nem/kidshift/data/impl/ChildDataImpl.java @@ -94,8 +94,22 @@ public class ChildDataImpl implements ChildData { } @Override - public void updateChild(ChildModel child) { - + public CompletableFuture updateChild(ChildModel child) { + return CompletableFuture.supplyAsync(() -> { + Call call = kidShiftApiService.updateChild(ChildModelConverter.childModelToChildAddRequest(child), child.getId()); + try { + Response response = call.execute(); + if (response.isSuccessful()) { + assert response.body() != null; + logger.info("子供更新成功(childId: " + response.body().getId() + ")"); + return ChildModelConverter.childResponseToChildModel(response.body()); + } else { + throw new RuntimeException("HTTP Status: " + response.code()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + }); } @Override @@ -118,8 +132,21 @@ public class ChildDataImpl implements ChildData { } @Override - public void removeChild(String childId) { - + public CompletableFuture removeChild(String childId) { + return CompletableFuture.supplyAsync(() -> { + Call call = kidShiftApiService.removeChild(childId); + try { + Response response = call.execute(); + if (response.isSuccessful()) { + logger.info("子供削除成功(childId: " + childId + ")"); + return null; + } else { + throw new RuntimeException("HTTP Status: " + response.code()); + } + } catch (Exception e) { + throw new RuntimeException(e); + } + }); } @Override diff --git a/data/src/main/java/one/nem/kidshift/data/retrofit/KidShiftApiService.java b/data/src/main/java/one/nem/kidshift/data/retrofit/KidShiftApiService.java index 81c9ee2..405f8b4 100644 --- a/data/src/main/java/one/nem/kidshift/data/retrofit/KidShiftApiService.java +++ b/data/src/main/java/one/nem/kidshift/data/retrofit/KidShiftApiService.java @@ -126,6 +126,25 @@ public interface KidShiftApiService { @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) Call addChild(@Body ChildAddRequest request); + /** + * 子供更新 + * @param request ChildAddRequest + * @param id 子供ID + * @return ChildResponse + */ + @PUT("/parent/child/{id}") + @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) + Call updateChild(@Body ChildAddRequest request, @Path("id") String id); + + /** + * 子供削除 + * @param id 子供ID + * @return Void + */ + @DELETE("/parent/child/{id}") + @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) + Call removeChild(@Path("id") String id); + /** * 子供ログインコード発行 * @param id 子供ID diff --git a/feature/child/src/main/java/one/nem/kidshift/feature/child/ChildManageMainActivity.java b/feature/child/src/main/java/one/nem/kidshift/feature/child/ChildManageMainActivity.java index a38b433..9bd9723 100644 --- a/feature/child/src/main/java/one/nem/kidshift/feature/child/ChildManageMainActivity.java +++ b/feature/child/src/main/java/one/nem/kidshift/feature/child/ChildManageMainActivity.java @@ -2,7 +2,10 @@ package one.nem.kidshift.feature.child; import android.annotation.SuppressLint; import android.os.Bundle; +import android.print.PrintAttributes; import android.view.View; +import android.widget.EditText; +import android.widget.FrameLayout; import android.widget.TextView; import android.widget.Toast; @@ -43,13 +46,6 @@ public class ChildManageMainActivity extends AppCompatActivity { ChildListAdapter childListAdapter; - /* MEMO - - ToolBarの設定 - - タイトル - - 戻るボタン - - 追加ボタン - */ - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -68,13 +64,13 @@ public class ChildManageMainActivity extends AppCompatActivity { // タイトル toolbar.setTitle("子供アカウント管理"); // 閉じる - toolbar.setNavigationIcon(one.nem.kidshift.shared.R.drawable.check_24px); // TODO: アイコン修正 + toolbar.setNavigationIcon(one.nem.kidshift.shared.R.drawable.close_24px); toolbar.setNavigationOnClickListener(v -> finish()); // 追加ボタン toolbar.inflateMenu(R.menu.child_manage_main_toolbar_item); toolbar.setOnMenuItemClickListener(item -> { if (item.getItemId() == R.id.add_child_account) { - Toast.makeText(this, "Add button clicked", Toast.LENGTH_SHORT).show(); + showAddChildDialog(); return true; } return false; @@ -85,8 +81,7 @@ public class ChildManageMainActivity extends AppCompatActivity { childListAdapter.setButtonEventCallback(new ChildListAdapter.ButtonEventCallback() { @Override public void onEditButtonClick(ChildModel childModel) { - Toast.makeText(ChildManageMainActivity.this, "Edit button clicked", Toast.LENGTH_SHORT).show(); - // TODO: 実装 + showEditChildDialog(childModel); } @Override @@ -116,6 +111,65 @@ public class ChildManageMainActivity extends AppCompatActivity { .show(); } + private void showAddChildDialog() { + // EditTextを作成 + EditText childNameEditText = new EditText(this); + childNameEditText.setHint("子供の名前"); + // FrameLayoutに入れる + FrameLayout container = new FrameLayout(this); + container.addView(childNameEditText); + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) childNameEditText.getLayoutParams(); + params.setMargins(32, 16, 32, 16); + childNameEditText.setLayoutParams(params); + + new MaterialAlertDialogBuilder(this) + .setTitle("子供アカウント追加") + .setView(container) + .setPositiveButton("追加", (dialog, which) -> { + String childName = Objects.requireNonNull(childNameEditText.getText()).toString(); + if (childName.isEmpty()) { + Toast.makeText(this, "名前を入力してください", Toast.LENGTH_SHORT).show(); + } + childData.addChild(new ChildModel(childName)) + .thenRun(this::updateListDirectly); + }) + .setNegativeButton("キャンセル", (dialog, which) -> dialog.dismiss()) + .show(); + } + + private void showEditChildDialog(ChildModel childModel) { + // EditTextを作成 + EditText childNameEditText = new EditText(this); + childNameEditText.setHint("子供の名前"); + childNameEditText.setText(childModel.getName()); + // FrameLayoutに入れる + FrameLayout container = new FrameLayout(this); + container.addView(childNameEditText); + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) childNameEditText.getLayoutParams(); + params.setMargins(32, 16, 32, 16); + childNameEditText.setLayoutParams(params); + + new MaterialAlertDialogBuilder(this) + .setTitle("子供アカウント編集") + .setView(container) + .setPositiveButton("保存", (dialog, which) -> { + String childName = Objects.requireNonNull(childNameEditText.getText()).toString(); + if (childName.isEmpty()) { + Toast.makeText(this, "名前を入力してください", Toast.LENGTH_SHORT).show(); + } + childModel.setName(childName); + childData.updateChild(childModel) + .thenRun(this::updateListDirectly); + }) + .setNegativeButton("キャンセル", (dialog, which) -> dialog.dismiss()) + // 削除ボタン + .setNeutralButton("削除", (dialog, which) -> { // TODO: 確認ダイアログを表示する + childData.removeChild(childModel.getId()) + .thenRun(this::updateListDirectly); + }) + .show(); + } + @SuppressLint("NotifyDataSetChanged") private void updateList() { childData.getChildList(new ChildModelCallback() { @@ -137,4 +191,11 @@ public class ChildManageMainActivity extends AppCompatActivity { runOnUiThread(() -> childListAdapter.notifyDataSetChanged()); }); } + + @SuppressLint("NotifyDataSetChanged") + private void updateListDirectly() { + childData.getChildListDirect().thenAccept(childListAdapter::setChildList).thenRun(() -> { + runOnUiThread(() -> childListAdapter.notifyDataSetChanged()); + }); + } } \ No newline at end of file diff --git a/shared/src/main/res/drawable/close_24px.xml b/shared/src/main/res/drawable/close_24px.xml new file mode 100644 index 0000000..d2d26fb --- /dev/null +++ b/shared/src/main/res/drawable/close_24px.xml @@ -0,0 +1,10 @@ + + +