feature/fetch_userinfo #85

Merged
Fujimatsu merged 35 commits from feature/fetch_userinfo into main 2024-06-24 01:36:45 +00:00
13 changed files with 287 additions and 30 deletions

View File

@ -67,4 +67,11 @@ public class MainActivity extends AppCompatActivity {
startActivity(intent);
}
}
/**
* 起動時にバックグラウンドで行う各種更新処理とか
*/
private void startup() {
}
}

View File

@ -0,0 +1,17 @@
package one.nem.kidshift.data;
/**
* データの同期など, ユーザーからの操作に基づかない処理を行う
*/
public interface KSActions {
void syncTasks();
void syncChildList();
/**
* 親ユーザー情報同期
*/
void syncParent();
}

View File

@ -1,15 +1,17 @@
package one.nem.kidshift.data;
import java.util.concurrent.CompletableFuture;
import one.nem.kidshift.model.ParentModel;
public interface ParentData {
/**
* 親ユーザー情報取得
* @param parentId 親ID
* @return ParentModel 親ユーザー情報
* @return 親ユーザー情報
*/
ParentModel getParent(String parentId);
CompletableFuture<ParentModel> getParent();
/**
* 親ユーザー情報更新

View File

@ -0,0 +1,31 @@
package one.nem.kidshift.data.impl;
import javax.inject.Inject;
import one.nem.kidshift.data.KSActions;
import one.nem.kidshift.data.UserSettings;
public class KSActionsImpl implements KSActions {
private UserSettings userSettings;
@Inject
public KSActionsImpl(UserSettings userSettings) {
this.userSettings = userSettings;
}
@Override
public void syncTasks() {
}
@Override
public void syncChildList() {
}
@Override
public void syncParent() {
}
}

View File

@ -1,23 +0,0 @@
package one.nem.kidshift.data.impl;
import javax.inject.Inject;
import one.nem.kidshift.data.ParentData;
import one.nem.kidshift.model.ParentModel;
public class ParentDataDummyImpl implements ParentData {
@Inject
public ParentDataDummyImpl() {
}
@Override
public ParentModel getParent(String parentId) {
return new ParentModel("ID", "Parent Name", "homeGroupId", "hoge@example.com");
}
@Override
public void updateParent(ParentModel parent) {
}
}

View File

@ -0,0 +1,55 @@
package one.nem.kidshift.data.impl;
import android.util.Log;
import java.io.IOException;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject;
import one.nem.kidshift.data.ParentData;
import one.nem.kidshift.data.UserSettings;
import one.nem.kidshift.data.retrofit.KidShiftApiService;
import one.nem.kidshift.data.retrofit.model.parent.ParentInfoResponse;
import one.nem.kidshift.model.ParentModel;
import retrofit2.Call;
import retrofit2.Response;
public class ParentDataImpl implements ParentData {
private KidShiftApiService kidshiftApiService;
private UserSettings userSettings;
@Inject
public ParentDataImpl(KidShiftApiService kidshiftApiService, UserSettings userSettings) {
this.kidshiftApiService = kidshiftApiService;
this.userSettings = userSettings;
}
@Override
public CompletableFuture<ParentModel> getParent() {
return CompletableFuture.supplyAsync(() -> {
Response<ParentInfoResponse> parentInfoResponse;
Call<ParentInfoResponse> response = kidshiftApiService.getParentInfo();
try {
parentInfoResponse = response.execute();
ParentInfoResponse responseBody = parentInfoResponse.body();
ParentModel parent = new ParentModel();
assert parentInfoResponse != null;
parent.setInternalId(responseBody.getId());
parent.setEmail(responseBody.getEmail());
parent.setDisplayName(responseBody.getEmail()); // Workaround
// TODO: 他のプロパティも処理する
return parent;
} catch (IOException e) {
throw new RuntimeException(e);
}
});
}
@Override
public void updateParent(ParentModel parent) {
}
}

View File

@ -5,12 +5,12 @@ import dagger.Module;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.FragmentComponent;
import one.nem.kidshift.data.ParentData;
import one.nem.kidshift.data.impl.ParentDataDummyImpl;
import one.nem.kidshift.data.impl.ParentDataImpl;
@Module
@InstallIn(FragmentComponent.class)
abstract public class ParentDataDummyModule {
public abstract class ParentDataModule {
@Binds
public abstract ParentData bindParentData(ParentDataDummyImpl parentDataDummyImpl);
public abstract ParentData bindParentData(ParentDataImpl parentDataImpl);
}

View File

@ -1,9 +1,14 @@
package one.nem.kidshift.data.retrofit;
import one.nem.kidshift.data.retrofit.interceptor.AuthorizationInterceptor;
import one.nem.kidshift.data.retrofit.model.parent.ParentInfoResponse;
import one.nem.kidshift.data.retrofit.model.parent.auth.ParentLoginRequest;
import one.nem.kidshift.data.retrofit.model.parent.auth.ParentLoginResponse;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.POST;
public interface KidShiftApiService {
@ -11,4 +16,8 @@ public interface KidShiftApiService {
@POST("/parent/auth/login")
Call<ParentLoginResponse> parentLogin(@Body ParentLoginRequest request);
@GET("/parent/account")
@Headers(AuthorizationInterceptor.HEADER_PLACEHOLDER)
Call<ParentInfoResponse> getParentInfo();
}

View File

@ -0,0 +1,60 @@
package one.nem.kidshift.data.retrofit;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.components.SingletonComponent;
import okhttp3.OkHttpClient;
import one.nem.kidshift.data.UserSettings;
import one.nem.kidshift.data.retrofit.interceptor.AuthorizationInterceptor;
import one.nem.kidshift.utils.KSLogger;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
@Module
@InstallIn(SingletonComponent.class)
public class KidShiftApiServiceModule {
@Inject
KSLogger logger;
@Provides
@Singleton
public AuthorizationInterceptor provideAuthorizationInterceptor(UserSettings userSettings, KSLogger logger) {
return new AuthorizationInterceptor(userSettings, logger);
}
// Gson
@Provides
@Singleton
public Gson provideGson() {
return new GsonBuilder()
.create();
}
@Provides
@Singleton
public OkHttpClient provideOkHttpClient(AuthorizationInterceptor authorizationInterceptor) {
return new OkHttpClient.Builder()
.addInterceptor(authorizationInterceptor)
.build();
}
@Provides
@Singleton
public KidShiftApiService provideKidShiftApiService(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
// .baseUrl(userSettings.getApiSetting().getApiBaseUrl())
.baseUrl("https://kidshift-beta.nem.one/")
.addConverterFactory(GsonConverterFactory.create(provideGson()))
.client(okHttpClient)
.build()
.create(KidShiftApiService.class);
}
}

View File

@ -0,0 +1,52 @@
package one.nem.kidshift.data.retrofit.interceptor;
import android.util.Log;
import androidx.annotation.NonNull;
import java.io.IOException;
import javax.inject.Inject;
import okhttp3.Interceptor;
import okhttp3.Response;
import one.nem.kidshift.data.UserSettings;
import one.nem.kidshift.utils.KSLogger;
public class AuthorizationInterceptor implements Interceptor {
private static final String HEADER_NAME = "Authorization";
private static final String HEADER_VALUE = "VALUE";
public static final String HEADER_PLACEHOLDER = HEADER_NAME + ": " + HEADER_VALUE;
private final UserSettings userSettings;
private final KSLogger logger;
public AuthorizationInterceptor(UserSettings userSettings, KSLogger logger) {
this.userSettings = userSettings;
this.logger = logger;
logger.setTag("Auth_Interceptor");
}
@NonNull
@Override
public Response intercept(@NonNull Chain chain) throws IOException {
logger.debug("intercept");
try {
if (chain.request().header(HEADER_NAME) == null) {
logger.debug("Authorization header is null");
return chain.proceed(chain.request());
}
if (!HEADER_VALUE.equals(chain.request().header(HEADER_NAME))) {
logger.debug("Authorization header is invalid");
return chain.proceed(chain.request());
}
return chain.proceed(chain.request().newBuilder()
.header(HEADER_NAME, "Barer " + userSettings.getAppCommonSetting().getAccessToken())
.build());
} catch (Exception e) {
return chain.proceed(chain.request());
}
}
}

View File

@ -0,0 +1,38 @@
package one.nem.kidshift.data.retrofit.model.parent;
public class ParentInfoResponse {
private String id;
private String email;
private String displayName;
public ParentInfoResponse(String id, String email, String displayName) {
this.id = id;
this.email = email;
this.displayName = displayName;
}
public String getId() {
return id;
}
public String getEmail() {
return email;
}
public String getDisplayName() {
return displayName;
}
public void setId(String id) {
this.id = id;
}
public void setEmail(String email) {
this.email = email;
}
public void setDisplayName(String displayName) {
this.displayName = displayName;
}
}

View File

@ -86,7 +86,13 @@ public class SettingMainFragment extends Fragment {
// Inflate the layout for this fragment
//親の名前アドレス表示
ParentModel parent = parentData.getParent("poiuytrew");
ParentModel parent = parentData.getParent().join();
if (parent == null) {
parent = new ParentModel(); // Workaround非ログインデバッグ用
parent.setDisplayName("親の名前");
parent.setEmail("親のアドレス");
}
//RecyclerViewの処理
View view = inflater.inflate(R.layout.fragment_setting_main, container, false);

View File

@ -25,6 +25,9 @@ public class ParentModel {
this.displayName = displayName;
}
public ParentModel() {
}
// Getter
public String getInternalId() {