Merge pull request 'feature/child_mode_2' (#158) from feature/child_mode_2 into main

Reviewed-on: #158
This commit is contained in:
Fujimatsu 2024-07-08 19:55:26 +00:00
commit b433c8e7ed
15 changed files with 137 additions and 48 deletions

View File

@ -1,5 +1,6 @@
package one.nem.kidshift; package one.nem.kidshift;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
@ -91,12 +92,14 @@ public class ChildLoginActivity extends AppCompatActivity {
UserSettings.AppCommonSetting appCommonSetting = userSettings.getAppCommonSetting(); UserSettings.AppCommonSetting appCommonSetting = userSettings.getAppCommonSetting();
appCommonSetting.setLoggedIn(true); appCommonSetting.setLoggedIn(true);
appCommonSetting.setAccessToken(childAuthResponse.getAccessToken()); appCommonSetting.setAccessToken(childAuthResponse.getAccessToken());
appCommonSetting.setChildId(childAuthResponse.getChildId());
appCommonSetting.setChildMode(true); appCommonSetting.setChildMode(true);
finish();
} catch (Exception e) { } catch (Exception e) {
logger.error("リクエストに失敗しました"); logger.error("リクエストに失敗しました");
Toast.makeText(this, "ログインに失敗しました", Toast.LENGTH_SHORT).show(); Toast.makeText(this, "ログインに失敗しました", Toast.LENGTH_SHORT).show();
} }
}).thenRun(() -> {
startActivity(new Intent(this, MainActivity.class));
}); });
}); });
} }

View File

@ -70,6 +70,16 @@ public class MainActivity extends AppCompatActivity {
return insets; return insets;
}); });
// Check logged in
if (userSettings.getAppCommonSetting().isLoggedIn()) {
logger.info("User is logged in!");
} else {
logger.info("User is not logged in!");
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
}
Toolbar toolbar = findViewById(R.id.toolbar); Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
@ -119,22 +129,27 @@ public class MainActivity extends AppCompatActivity {
e.printStackTrace(); e.printStackTrace();
} }
// Check logged in UserSettings.AppCommonSetting appCommonSetting = userSettings.getAppCommonSetting();
if (userSettings.getAppCommonSetting().isLoggedIn()) { if (appCommonSetting.isChildMode()) {
logger.info("User is logged in!"); logger.info("Child mode is enabled!");
} else { // 保護者向けのナビゲーションを削除
logger.info("User is not logged in!"); bottomNavigationView.getMenu().removeItem(R.id.feature_common_parent_child_navigation);
bottomNavigationView.getMenu().removeItem(R.id.feature_common_parent_parent_navigation);
Intent intent = new Intent(this, LoginActivity.class); bottomNavigationView.getMenu().removeItem(R.id.feature_wallet_parent_navigation);
startActivity(intent); // startDestinationを変更
bottomNavigationView.setSelectedItemId(R.id.feature_common_child_child_navigation);
// manage_child_accountを削除
navigationView.getMenu().removeItem(R.id.manage_child_account);
} else {
logger.info("Child mode is disabled!");
bottomNavigationView.getMenu().removeItem(R.id.feature_common_child_child_navigation);
bottomNavigationView.getMenu().removeItem(R.id.feature_wallet_child_navigation);
} }
fab = findViewById(R.id.mainFab); fab = findViewById(R.id.mainFab);
fabManager.setFab(fab); fabManager.setFab(fab);
// Apply feature flag
if (!featureFlag.isEnabled("showDebugMenu"))
bottomNavigationView.getMenu().removeItem(R.id.feature_debug_navigation);
} }
/** /**

View File

@ -1,23 +1,31 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- TODO: アイコン再検討 --> <!-- TODO: アイコン再検討 -->
<!-- 保護者モード / 保護者目線 -->
<item <item
android:id="@+id/feature_parent_navigation" android:id="@+id/feature_common_parent_parent_navigation"
android:icon="@drawable/pending_24px" android:icon="@drawable/pending_24px"
android:title="Parent" /> android:title="ホーム" />
<!-- 保護者モード / 子供目線 -->
<item <item
android:id="@+id/feature_child_navigation" android:id="@+id/feature_common_parent_child_navigation"
android:icon="@drawable/child_care_24px" android:icon="@drawable/child_care_24px"
android:title="Child" /> android:title="こども" />
<!-- 子供モード / 子供目線 -->
<item <item
android:id="@+id/feature_debug_navigation" android:id="@+id/feature_common_child_child_navigation"
android:icon="@drawable/developer_mode_24px" android:icon="@drawable/child_care_24px"
android:title="Debug" /> android:title="ホーム" />
<item <item
android:id="@+id/feature_wallet_parent_navigation" android:id="@+id/feature_wallet_parent_navigation"
android:icon="@drawable/wallet_24px" android:icon="@drawable/wallet_24px"
android:title="Wallet" /> android:title="ウォレット" />
<item
android:id="@+id/feature_wallet_child_navigation"
android:icon="@drawable/wallet_24px"
android:title="ウォレット" />
</menu> </menu>

View File

@ -2,10 +2,13 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_nav" android:id="@+id/main_nav"
app:startDestination="@id/feature_parent_navigation"> app:startDestination="@id/feature_common_parent_parent_navigation">
<include app:graph="@navigation/feature_debug_navigation" /> <include app:graph="@navigation/feature_debug_navigation" />
<include app:graph="@navigation/feature_child_navigation" /> <include app:graph="@navigation/feature_child_navigation" />
<include app:graph="@navigation/feature_parent_navigation" /> <include app:graph="@navigation/feature_common_parent_parent_navigation" />
<include app:graph="@navigation/feature_common_parent_child_navigation" />
<include app:graph="@navigation/feature_common_child_child_navigation" />
<include app:graph="@navigation/feature_wallet_parent_navigation" /> <include app:graph="@navigation/feature_wallet_parent_navigation" />
<include app:graph="@navigation/feature_wallet_child_navigation" />
</navigation> </navigation>

View File

@ -37,6 +37,9 @@ public interface UserSettings {
boolean isChildMode(); boolean isChildMode();
void setChildMode(boolean childMode); void setChildMode(boolean childMode);
String getChildId();
void setChildId(String childId);
} }
interface SharedPrefCache { interface SharedPrefCache {

View File

@ -29,7 +29,7 @@ public class RewardDataImpl implements RewardData {
} }
@Override @Override
public CompletableFuture<Integer> getTotalReward(String childId) { public CompletableFuture<Integer> getTotalReward(String childId) { // TODO: localCacheを使う
return CompletableFuture.supplyAsync(() -> ksActions.syncHistory(childId).join().stream().mapToInt(HistoryModel::getReward).sum()); return CompletableFuture.supplyAsync(() -> ksActions.syncHistory(childId).join().stream().mapToInt(HistoryModel::getReward).sum());
} }
} }

View File

@ -77,6 +77,7 @@ public class UserSettingsImpl implements UserSettings {
boolean loggedIn; boolean loggedIn;
String accessToken; String accessToken;
boolean childMode; boolean childMode;
String childId;
AppCommonSettingImpl() { AppCommonSettingImpl() {
sharedPrefUtils = sharedPrefUtilsFactory.create("user_settings"); sharedPrefUtils = sharedPrefUtilsFactory.create("user_settings");
@ -85,10 +86,12 @@ public class UserSettingsImpl implements UserSettings {
loggedIn = appCommonSetting.isLoggedIn(); loggedIn = appCommonSetting.isLoggedIn();
accessToken = appCommonSetting.getAccessToken().isEmpty() ? "" : appCommonSetting.getAccessToken(); accessToken = appCommonSetting.getAccessToken().isEmpty() ? "" : appCommonSetting.getAccessToken();
childMode = appCommonSetting.isChildMode(); childMode = appCommonSetting.isChildMode();
childId = appCommonSetting.getChildId().isEmpty() ? "" : appCommonSetting.getChildId();
} else { } else {
loggedIn = false; loggedIn = false;
accessToken = ""; accessToken = "";
childMode = false; childMode = false;
childId = "";
} }
} }
@ -128,6 +131,17 @@ public class UserSettingsImpl implements UserSettings {
this.childMode = childMode; this.childMode = childMode;
save(); save();
} }
@Override
public String getChildId() {
return childId;
}
@Override
public void setChildId(String childId) {
this.childId = childId;
save();
}
} }
public class ApiSettingImpl implements UserSettings.ApiSetting { public class ApiSettingImpl implements UserSettings.ApiSetting {

View File

@ -123,7 +123,7 @@ public interface KidShiftApiService {
* 子供一覧取得 * 子供一覧取得
* @return ChildListResponse * @return ChildListResponse
*/ */
@GET("/parent/child") @GET("/child")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<ChildListResponse> getChildList(); Call<ChildListResponse> getChildList();
@ -132,7 +132,7 @@ public interface KidShiftApiService {
* @param request ChildAddRequest * @param request ChildAddRequest
* @return ChildResponse * @return ChildResponse
*/ */
@POST("/parent/child") @POST("/child")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<ChildResponse> addChild(@Body ChildAddRequest request); Call<ChildResponse> addChild(@Body ChildAddRequest request);
@ -142,7 +142,7 @@ public interface KidShiftApiService {
* @param id 子供ID * @param id 子供ID
* @return ChildResponse * @return ChildResponse
*/ */
@PUT("/parent/child/{id}") @PUT("/child/{id}")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<ChildResponse> updateChild(@Body ChildAddRequest request, @Path("id") String id); Call<ChildResponse> updateChild(@Body ChildAddRequest request, @Path("id") String id);
@ -151,7 +151,7 @@ public interface KidShiftApiService {
* @param id 子供ID * @param id 子供ID
* @return Void * @return Void
*/ */
@DELETE("/parent/child/{id}") @DELETE("/child/{id}")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<Void> removeChild(@Path("id") String id); Call<Void> removeChild(@Path("id") String id);
@ -160,7 +160,7 @@ public interface KidShiftApiService {
* @param id 子供ID * @param id 子供ID
* @return ChildLoginCodeResponse * @return ChildLoginCodeResponse
*/ */
@GET("/parent/child/{id}/login") @GET("/child/{id}/login")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER) @Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<ChildLoginCodeResponse> issueLoginCode(@Path("id") String id); Call<ChildLoginCodeResponse> issueLoginCode(@Path("id") String id);

View File

@ -2,9 +2,22 @@ package one.nem.kidshift.data.retrofit.model.child.auth;
public class ChildAuthResponse { public class ChildAuthResponse {
private String accessToken; private String accessToken;
private String childId;
public ChildAuthResponse(String accessToken) { public ChildAuthResponse() {
}
public ChildAuthResponse(String accessToken, String childId) {
this.accessToken = accessToken; this.accessToken = accessToken;
this.childId = childId;
}
public String getChildId() {
return childId;
}
public void setChildId(String childId) {
this.childId = childId;
} }
public String getAccessToken() { public String getAccessToken() {

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/feature_common_child_child_navigation"
app:startDestination="@id/commonHomeFragmentChildChild">
<fragment
android:id="@+id/commonHomeFragmentChildChild"
android:name="one.nem.kidshift.feature.common.CommonHomeFragment"
android:label="fragment_common_home"
tools:layout="@layout/fragment_common_home" >
<argument
android:name="isChildMode"
app:argType="boolean"
android:defaultValue="true" />
</fragment>
</navigation>

View File

@ -2,11 +2,11 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android" <navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/feature_common_navigation" android:id="@+id/feature_common_parent_child_navigation"
app:startDestination="@id/commonHomeFragment"> app:startDestination="@id/commonHomeFragmentParentChild">
<fragment <fragment
android:id="@+id/commonHomeFragment" android:id="@+id/commonHomeFragmentParentChild"
android:name="one.nem.kidshift.feature.common.CommonHomeFragment" android:name="one.nem.kidshift.feature.common.CommonHomeFragment"
android:label="fragment_common_home" android:label="fragment_common_home"
tools:layout="@layout/fragment_common_home" /> tools:layout="@layout/fragment_common_home" />

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/feature_common_parent_parent_navigation"
app:startDestination="@id/commonHomeFragmentParentParent">
<fragment
android:id="@+id/commonHomeFragmentParentParent"
android:name="one.nem.kidshift.feature.common.CommonHomeFragment"
android:label="fragment_common_home"
tools:layout="@layout/fragment_common_home" />
</navigation>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/feature_parent_navigation"
app:startDestination="@id/feature_common_navigation">
<include app:graph="@navigation/feature_common_navigation" />
</navigation>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/internal_parent_navigation">
<include app:graph="@navigation/feature_common_navigation" />
</navigation>

View File

@ -11,6 +11,7 @@ import javax.inject.Inject;
import dagger.hilt.android.AndroidEntryPoint; import dagger.hilt.android.AndroidEntryPoint;
import one.nem.kidshift.data.KSActions; import one.nem.kidshift.data.KSActions;
import one.nem.kidshift.data.RewardData; import one.nem.kidshift.data.RewardData;
import one.nem.kidshift.data.UserSettings;
import one.nem.kidshift.utils.FabManager; import one.nem.kidshift.utils.FabManager;
import one.nem.kidshift.utils.KSLogger; import one.nem.kidshift.utils.KSLogger;
import one.nem.kidshift.utils.factory.KSLoggerFactory; import one.nem.kidshift.utils.factory.KSLoggerFactory;
@ -19,7 +20,6 @@ import one.nem.kidshift.utils.factory.KSLoggerFactory;
public class WalletContentFragment extends Fragment { public class WalletContentFragment extends Fragment {
private static final String ARG_CHILD_ID = "childId"; private static final String ARG_CHILD_ID = "childId";
@Inject @Inject
KSLoggerFactory loggerFactory; KSLoggerFactory loggerFactory;
@Inject @Inject
@ -28,6 +28,9 @@ public class WalletContentFragment extends Fragment {
@Inject @Inject
FabManager fabManager; FabManager fabManager;
@Inject
UserSettings userSettings;
private KSLogger logger; private KSLogger logger;
private String childId; private String childId;
@ -45,6 +48,10 @@ public class WalletContentFragment extends Fragment {
return fragment; return fragment;
} }
public static WalletContentFragment newInstance() {
return new WalletContentFragment();
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -53,6 +60,13 @@ public class WalletContentFragment extends Fragment {
} }
logger = loggerFactory.create("WalletMainFragment"); logger = loggerFactory.create("WalletMainFragment");
logger.debug("Received parameter: " + childId); logger.debug("Received parameter: " + childId);
if (childId == null) {
// 単品で呼び出されてる = 子供モードでログインされている
childId = userSettings.getAppCommonSetting().getChildId();
if (childId == null) {
logger.error("Child ID is not set");
}
}
} }
@Override @Override