Merge pull request 'feature/child_mode' (#155) from feature/child_mode into main

Reviewed-on: #155
This commit is contained in:
Fujimatsu 2024-07-08 17:01:42 +00:00
commit db09196303
5 changed files with 129 additions and 28 deletions

View File

@ -3,6 +3,9 @@ package one.nem.kidshift;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
@ -12,8 +15,30 @@ import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint;
import one.nem.kidshift.data.ChildData;
import one.nem.kidshift.data.UserSettings;
import one.nem.kidshift.data.retrofit.KidShiftApiService;
import one.nem.kidshift.data.retrofit.model.child.auth.ChildAuthRequest;
import one.nem.kidshift.data.retrofit.model.child.auth.ChildAuthResponse;
import one.nem.kidshift.utils.KSLogger;
import one.nem.kidshift.utils.factory.KSLoggerFactory;
import retrofit2.Call;
@AndroidEntryPoint
public class ChildLoginActivity extends AppCompatActivity {
@Inject
UserSettings userSettings;
@Inject
KSLoggerFactory loggerFactory;
@Inject
KidShiftApiService kidShiftApiService;
private KSLogger logger;
private EditText loginCode1, loginCode2, loginCode3, loginCode4, loginCode5, loginCode6, loginCode7, loginCode8;
@ -28,6 +53,8 @@ public class ChildLoginActivity extends AppCompatActivity {
return insets;
});
logger = loggerFactory.create("ChildLoginActivity");
// コードのフォーカスを自動で移動する
loginCode1 = findViewById(R.id.loginCode_1);
loginCode2 = findViewById(R.id.loginCode_2);
@ -38,18 +65,34 @@ public class ChildLoginActivity extends AppCompatActivity {
loginCode7 = findViewById(R.id.loginCode_7);
loginCode8 = findViewById(R.id.loginCode_8);
loginCode1.addTextChangedListener(new LoginCodeTextWatcher(loginCode1, loginCode2));
loginCode2.addTextChangedListener(new LoginCodeTextWatcher(loginCode2, loginCode3));
loginCode3.addTextChangedListener(new LoginCodeTextWatcher(loginCode3, loginCode4));
loginCode4.addTextChangedListener(new LoginCodeTextWatcher(loginCode4, loginCode5));
loginCode5.addTextChangedListener(new LoginCodeTextWatcher(loginCode5, loginCode6));
loginCode6.addTextChangedListener(new LoginCodeTextWatcher(loginCode6, loginCode7));
loginCode7.addTextChangedListener(new LoginCodeTextWatcher(loginCode7, loginCode8));
loginCode8.addTextChangedListener(new LoginCodeTextWatcher(loginCode8, null));
loginCode1.addTextChangedListener(new LoginCodeTextWatcher(loginCode1, loginCode2, null));
loginCode2.addTextChangedListener(new LoginCodeTextWatcher(loginCode2, loginCode3, loginCode1));
loginCode3.addTextChangedListener(new LoginCodeTextWatcher(loginCode3, loginCode4, loginCode2));
loginCode4.addTextChangedListener(new LoginCodeTextWatcher(loginCode4, loginCode5, loginCode3));
loginCode5.addTextChangedListener(new LoginCodeTextWatcher(loginCode5, loginCode6, loginCode4));
loginCode6.addTextChangedListener(new LoginCodeTextWatcher(loginCode6, loginCode7, loginCode5));
loginCode7.addTextChangedListener(new LoginCodeTextWatcher(loginCode7, loginCode8, loginCode6));
loginCode8.addTextChangedListener(new LoginCodeTextWatcher(loginCode8, null, loginCode7));
// ログインボタンを押したときの処理
findViewById(R.id.childLoginButton).setOnClickListener(v -> {
Toast.makeText(this, "ログインコード: " + getLoginCode(), Toast.LENGTH_SHORT).show();
logger.debug("ログインボタンが押されました");
Call<ChildAuthResponse> call = kidShiftApiService.childLogin(new ChildAuthRequest(getLoginCode()));
try {
ChildAuthResponse childAuthResponse = call.execute().body();
if (childAuthResponse == null || childAuthResponse.getAccessToken() == null) {
// エラー処理
logger.error("ChildAuthResponseがnullまたはAccessTokenがnullです");
return;
}
UserSettings.AppCommonSetting appCommonSetting = userSettings.getAppCommonSetting();
appCommonSetting.setLoggedIn(true);
appCommonSetting.setAccessToken(childAuthResponse.getAccessToken());
appCommonSetting.setChildMode(true);
} catch (Exception e) {
logger.error("リクエストに失敗しました");
Toast.makeText(this, "ログインに失敗しました", Toast.LENGTH_SHORT).show();
}
});
}
@ -64,13 +107,15 @@ public class ChildLoginActivity extends AppCompatActivity {
loginCode8.getText().toString();
}
private static class LoginCodeTextWatcher implements TextWatcher {
private static class LoginCodeTextWatcher implements TextWatcher, View.OnKeyListener {
private EditText currentView;
private final EditText nextView;
private final EditText previousView;
LoginCodeTextWatcher(EditText currentView, EditText nextView) {
LoginCodeTextWatcher(EditText currentView, EditText nextView, EditText previousView) {
this.currentView = currentView;
this.nextView = nextView;
this.previousView = previousView;
}
@Override
@ -85,5 +130,17 @@ public class ChildLoginActivity extends AppCompatActivity {
nextView.requestFocus();
}
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
// if (keyCode == KeyEvent.KEYCODE_DEL && event.getAction() == KeyEvent.ACTION_DOWN) { // TODO: バックスペースの処理
// EditText currentView = (EditText) v;
// if (currentView.getText().length() == 0 && previousView != null) {
// previousView.requestFocus();
// }
// }
// return false;
return true;
}
}
}

View File

@ -41,49 +41,49 @@
<EditText
android:id="@+id/loginCode_1"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_2"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_3"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_4"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<TextView
@ -92,55 +92,55 @@
android:layout_weight="0"
android:gravity="center"
android:text="-"
android:textSize="18sp"
android:textSize="34sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_5"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_6"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_7"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
<EditText
android:id="@+id/loginCode_8"
android:layout_width="0dp"
android:layout_height="40dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:inputType="number"
android:maxWidth="48dp"
android:maxLength="1"
android:textSize="18sp"
android:textSize="24sp"
tools:ignore="Autofill,LabelFor" />
</LinearLayout>

View File

@ -5,6 +5,8 @@ import one.nem.kidshift.data.retrofit.model.child.ChildAddRequest;
import one.nem.kidshift.data.retrofit.model.child.ChildListResponse;
import one.nem.kidshift.data.retrofit.model.child.ChildLoginCodeResponse;
import one.nem.kidshift.data.retrofit.model.child.ChildResponse;
import one.nem.kidshift.data.retrofit.model.child.auth.ChildAuthRequest;
import one.nem.kidshift.data.retrofit.model.child.auth.ChildAuthResponse;
import one.nem.kidshift.data.retrofit.model.parent.ParentInfoResponse;
import one.nem.kidshift.data.retrofit.model.parent.auth.ParentAuthRequest;
import one.nem.kidshift.data.retrofit.model.parent.auth.ParentAuthResponse;
@ -43,6 +45,14 @@ public interface KidShiftApiService {
@POST("/parent/auth/register")
Call<ParentAuthResponse> parentRegister(@Body ParentAuthRequest request);
/**
* 子供ログイン処理
* @param request ChildAuthRequest
* @return ChildAuthResponse
*/
@POST("/child/auth/login")
Call<ChildAuthResponse> childLogin(@Body ChildAuthRequest request);
/**
* 保護者アカウント情報取得処理
* @return ParentInfoResponse

View File

@ -0,0 +1,17 @@
package one.nem.kidshift.data.retrofit.model.child.auth;
public class ChildAuthRequest {
private String loginCode;
public ChildAuthRequest(String loginCode) {
this.loginCode = loginCode;
}
public String getLoginCode() {
return loginCode;
}
public void setLoginCode(String loginCode) {
this.loginCode = loginCode;
}
}

View File

@ -0,0 +1,17 @@
package one.nem.kidshift.data.retrofit.model.child.auth;
public class ChildAuthResponse {
private String accessToken;
public ChildAuthResponse(String accessToken) {
this.accessToken = accessToken;
}
public String getAccessToken() {
return accessToken;
}
public void setAccessToken(String accessToken) {
this.accessToken = accessToken;
}
}