From d8a38a7aace3b877dc089ff34f577e1b41282e41 Mon Sep 17 00:00:00 2001 From: Hiroki Honda Date: Fri, 24 Nov 2017 19:07:04 -0800 Subject: [PATCH 1/8] Add dependencies for retrofit --- app/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index e778a2b..06ba958 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,6 +49,10 @@ dependencies { compile "com.github.gfx.android.orma:orma:4.2.5" kapt "com.github.gfx.android.orma:orma-processor:4.2.5" + // for Retrofit2 + compile 'com.squareup.retrofit2:retrofit:2.3.0' + compile 'com.squareup.retrofit2:converter-gson:2.3.0' + compile 'com.squareup.okhttp3:logging-interceptor:3.8.1' } From 0b3877e7e12c09238301a66240e430e88d7b1dd1 Mon Sep 17 00:00:00 2001 From: Hiroki Honda Date: Fri, 24 Nov 2017 21:03:06 -0800 Subject: [PATCH 2/8] Implement to cal API and print Logs what got. --- app/src/main/AndroidManifest.xml | 12 +++- .../di/ActivityComponent.kt | 3 + .../kotlindatabindingsample/di/AppModule.kt | 10 ++- .../di/ClientModule.kt | 11 ++++ .../model/orma/RandomUser.kt | 16 +++++ .../kotlindatabindingsample/net/ApiService.kt | 62 +++++++++++++++++++ .../net/client/ApiRandomUserClient.kt | 28 +++++++++ .../presenter/RandomUserPresenter.kt | 10 +++ .../task/RandomUserGetterTask.kt | 17 +++++ .../view/MainActivity.kt | 2 + .../view/RandomUserListActivity.kt | 33 ++++++++++ app/src/main/res/layout/activity_main.xml | 6 ++ app/src/main/res/values/strings.xml | 1 + 13 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ClientModule.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/model/orma/RandomUser.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/ApiService.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/client/ApiRandomUserClient.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/presenter/RandomUserPresenter.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/task/RandomUserGetterTask.kt create mode 100644 app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/RandomUserListActivity.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2e5cb72..e0af0f7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,9 @@ + + + + @@ -17,13 +21,19 @@ + + + + + + - \ No newline at end of file + diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ActivityComponent.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ActivityComponent.kt index 83a49c5..6838ac9 100644 --- a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ActivityComponent.kt +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ActivityComponent.kt @@ -4,6 +4,7 @@ import dagger.Subcomponent import jp.chau2chaun2.kotlindatabindingsample.view.BMICalculateActivity import jp.chau2chaun2.kotlindatabindingsample.view.BMIListActivity import jp.chau2chaun2.kotlindatabindingsample.view.BMIRealtimeCalculateActivity +import jp.chau2chaun2.kotlindatabindingsample.view.RandomUserListActivity @ActivityScope @Subcomponent(modules = arrayOf(ActivityModule::class)) @@ -14,4 +15,6 @@ interface ActivityComponent { fun inject(activity: BMICalculateActivity) fun inject(activity: BMIListActivity) + + fun inject(activity: RandomUserListActivity) } diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/AppModule.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/AppModule.kt index 802485f..531c59d 100644 --- a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/AppModule.kt +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/AppModule.kt @@ -7,9 +7,11 @@ import com.github.gfx.android.orma.AccessThreadConstraint import dagger.Module import dagger.Provides import jp.chau2chaun2.kotlindatabindingsample.model.orma.OrmaDatabase +import jp.chau2chaun2.kotlindatabindingsample.net.ApiService +import jp.chau2chaun2.kotlindatabindingsample.net.IApiService import javax.inject.Singleton -@Module +@Module(includes = arrayOf(ClientModule::class)) class AppModule(private val mContext: Context) { @Provides @@ -36,4 +38,10 @@ class AppModule(private val mContext: Context) { .readOnMainThread(AccessThreadConstraint.NONE) .build() } + + @Singleton + @Provides + internal fun providesApiService(): IApiService { + return ApiService().service + } } diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ClientModule.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ClientModule.kt new file mode 100644 index 0000000..93d81db --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/di/ClientModule.kt @@ -0,0 +1,11 @@ +package jp.chau2chaun2.kotlindatabindingsample.di + +import dagger.Binds +import dagger.Module +import jp.chau2chaun2.kotlindatabindingsample.net.client.ApiRandomUserClient +import jp.chau2chaun2.kotlindatabindingsample.net.client.IApiRandomUser + +@Module +interface ClientModule { + @Binds fun bindApiService(client: ApiRandomUserClient): IApiRandomUser +} diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/model/orma/RandomUser.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/model/orma/RandomUser.kt new file mode 100644 index 0000000..b7f0e05 --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/model/orma/RandomUser.kt @@ -0,0 +1,16 @@ +package jp.chau2chaun2.kotlindatabindingsample.model.orma + +data class RandomUser(val info: Info, + val results: List) + +data class Info(val seed: String, + val results: Int, + val page: Int, + val version: String) + +data class Result(val gender: String, + val email: String, + val registered: String, + val dob: String, + val phone: String, + val cell: String) diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/ApiService.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/ApiService.kt new file mode 100644 index 0000000..b7d3e55 --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/ApiService.kt @@ -0,0 +1,62 @@ +package jp.chau2chaun2.kotlindatabindingsample.net + +import com.google.gson.GsonBuilder +import jp.chau2chaun2.kotlindatabindingsample.model.orma.RandomUser +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Call +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.http.GET +import java.util.concurrent.TimeUnit + + + +class ApiService { + + val service: IApiService = create(IApiService::class.java) + + lateinit var retrofit: Retrofit + + val httpBuilder: OkHttpClient.Builder get() { + val httpClient = OkHttpClient.Builder() + .addInterceptor(Interceptor { chain -> + val original = chain.request() + + //header設定 + val request = original.newBuilder() + .header("Accept", "application/json") + .method(original.method(), original.body()) + .build() + + return@Interceptor chain.proceed(request) + }) + .readTimeout(30, TimeUnit.SECONDS) + + val loggingInterceptor = HttpLoggingInterceptor() + loggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + httpClient.addInterceptor(loggingInterceptor) + + return httpClient + } + + fun create(serviceClass: Class): S { + val gson = GsonBuilder() + .serializeNulls() + .create() + + retrofit = Retrofit.Builder() + .addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl("http://randomuser.me/") + .client(httpBuilder.build()) + .build() + + return retrofit.create(serviceClass) + } +} + +interface IApiService { + @GET("api") + fun apiDemo(): Call +} diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/client/ApiRandomUserClient.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/client/ApiRandomUserClient.kt new file mode 100644 index 0000000..7781846 --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/net/client/ApiRandomUserClient.kt @@ -0,0 +1,28 @@ +package jp.chau2chaun2.kotlindatabindingsample.net.client + +import android.accounts.NetworkErrorException +import jp.chau2chaun2.kotlindatabindingsample.model.orma.RandomUser +import jp.chau2chaun2.kotlindatabindingsample.net.IApiService +import javax.inject.Inject + +interface IApiRandomUser { + fun getRandomUser(): RandomUser? +} + +class ApiRandomUserClient @Inject constructor(private val apiService: IApiService) : IApiRandomUser { + override fun getRandomUser(): RandomUser? { + try { + val responce = apiService.apiDemo().execute() + + if (responce.isSuccessful) { + return responce.body() + } else { + return null + } + + } catch (e: NetworkErrorException) { + + } + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/presenter/RandomUserPresenter.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/presenter/RandomUserPresenter.kt new file mode 100644 index 0000000..a957fa9 --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/presenter/RandomUserPresenter.kt @@ -0,0 +1,10 @@ +package jp.chau2chaun2.kotlindatabindingsample.presenter + +import jp.chau2chaun2.kotlindatabindingsample.model.orma.RandomUser +import jp.chau2chaun2.kotlindatabindingsample.net.client.IApiRandomUser +import javax.inject.Inject + +class RandomUserPresenter @Inject constructor(private val apiRandomUser: IApiRandomUser) { + + fun getNewRandomUser(): RandomUser? = apiRandomUser.getRandomUser() +} \ No newline at end of file diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/task/RandomUserGetterTask.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/task/RandomUserGetterTask.kt new file mode 100644 index 0000000..4488310 --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/task/RandomUserGetterTask.kt @@ -0,0 +1,17 @@ +package jp.chau2chaun2.kotlindatabindingsample.task + +import android.databinding.ObservableBoolean +import android.util.Log +import jp.chau2chaun2.kotlindatabindingsample.net.client.IApiRandomUser + + +class RandomUserGetterTask(private val apiRandomUser: IApiRandomUser) { + + val loading = ObservableBoolean(false) + + fun execute() { + Thread(Runnable { + Log.e("test", apiRandomUser.getRandomUser().toString()) + }).start() + } +} diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/MainActivity.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/MainActivity.kt index 0956d25..b646b5a 100644 --- a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/MainActivity.kt +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/MainActivity.kt @@ -19,4 +19,6 @@ class MainActivity : AppCompatActivity() { fun onClickBMIRealtimeCalculate(view: View) = startActivity(BMIRealtimeCalculateActivity.getIntent(this)) fun onClickBMIList(view: View) = startActivity(BMIListActivity.getIntent(this)) + + fun onClickRandomUserList(view: View) = startActivity(RandomUserListActivity.getIntent(this)) } diff --git a/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/RandomUserListActivity.kt b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/RandomUserListActivity.kt new file mode 100644 index 0000000..3e2540b --- /dev/null +++ b/app/src/main/java/jp/chau2chaun2/kotlindatabindingsample/view/RandomUserListActivity.kt @@ -0,0 +1,33 @@ +package jp.chau2chaun2.kotlindatabindingsample.view + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import jp.chau2chaun2.kotlindatabindingsample.net.client.IApiRandomUser +import jp.chau2chaun2.kotlindatabindingsample.presenter.RandomUserPresenter +import jp.chau2chaun2.kotlindatabindingsample.task.RandomUserGetterTask +import javax.inject.Inject + +class RandomUserListActivity : BaseActivity() { + + @Inject lateinit var presenter: RandomUserPresenter + + @Inject lateinit var apiRandomUser: IApiRandomUser + + override fun onActivityInject() { + mComponent.inject(this) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + RandomUserGetterTask(apiRandomUser).execute() +// Log.e("test", "### ${presenter.getNewRandomUser().toString()}") + } + + companion object { + fun getIntent(context: Context): Intent { + return Intent(context, RandomUserListActivity::class.java) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index e555712..abb4163 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -23,4 +23,10 @@ android:text="@string/move_to_BMIListActivity" android:onClick="onClickBMIList"/> +