Merge pull request 'feature/child_mode_2' (#158) from feature/child_mode_2 into main
Reviewed-on: #158
This commit is contained in:
commit
b433c8e7ed
|
@ -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));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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 {
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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>
|
|
@ -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" />
|
|
@ -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>
|
|
@ -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>
|
|
|
@ -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>
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user