diff --git a/README.md b/README.md index 99a834f..e01cb21 100644 --- a/README.md +++ b/README.md @@ -1 +1,5 @@ -# giphy-browser +# GIPHY Browser + +Notes: + +- Models don't have proper getters and setters to save time diff --git a/app/build.gradle b/app/build.gradle index bcd4f9d..61c2c57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,7 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-kapt' +apply plugin: 'dagger.hilt.android.plugin' android { compileSdkVersion 29 @@ -11,10 +14,22 @@ android { versionCode 1 versionName "1.0" } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { + implementation "com.google.dagger:hilt-android:2.28-alpha" + kapt "com.google.dagger:hilt-android-compiler:2.28-alpha" implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' + implementation 'androidx.recyclerview:recyclerview:1.1.0' + implementation 'androidx.paging:paging-runtime:2.1.2' + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-moshi:2.9.0' + implementation 'com.facebook.fresco:fresco:2.2.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bbb6147..f8e6490 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,21 +1,28 @@ - + + + + android:theme="@style/AppTheme" + android:name=".MainApplication"> + - + diff --git a/app/src/main/java/com/tananaev/giphy/MainActivity.java b/app/src/main/java/com/tananaev/giphy/MainActivity.java index 6b91445..5a35867 100644 --- a/app/src/main/java/com/tananaev/giphy/MainActivity.java +++ b/app/src/main/java/com/tananaev/giphy/MainActivity.java @@ -6,6 +6,9 @@ import com.tananaev.giphy.ui.main.MainFragment; +import dagger.hilt.android.AndroidEntryPoint; + +@AndroidEntryPoint public class MainActivity extends AppCompatActivity { @Override diff --git a/app/src/main/java/com/tananaev/giphy/MainApplication.java b/app/src/main/java/com/tananaev/giphy/MainApplication.java new file mode 100644 index 0000000..06482ae --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/MainApplication.java @@ -0,0 +1,14 @@ +package com.tananaev.giphy; + +import android.app.Application; + +import dagger.hilt.android.HiltAndroidApp; + +@HiltAndroidApp +public class MainApplication extends Application { + + @Override + public void onCreate() { + super.onCreate(); + } +} diff --git a/app/src/main/java/com/tananaev/giphy/inject/NetworkModule.java b/app/src/main/java/com/tananaev/giphy/inject/NetworkModule.java new file mode 100644 index 0000000..5b526e2 --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/inject/NetworkModule.java @@ -0,0 +1,24 @@ +package com.tananaev.giphy.inject; + +import com.tananaev.giphy.service.GiphyService; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import dagger.hilt.InstallIn; +import dagger.hilt.android.components.FragmentComponent; +import retrofit2.Retrofit; + +@Module +@InstallIn(FragmentComponent.class) +public abstract class NetworkModule { + + @Provides + public static GiphyService provideGiphyService() { + return new Retrofit.Builder() + .baseUrl("https://api.giphy.com") + .build() + .create(GiphyService.class); + } +} diff --git a/app/src/main/java/com/tananaev/giphy/model/Gif.java b/app/src/main/java/com/tananaev/giphy/model/Gif.java new file mode 100644 index 0000000..a53ff7a --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/model/Gif.java @@ -0,0 +1,5 @@ +package com.tananaev.giphy.model; + +public class Gif { + public Images images; +} diff --git a/app/src/main/java/com/tananaev/giphy/model/Image.java b/app/src/main/java/com/tananaev/giphy/model/Image.java new file mode 100644 index 0000000..51757aa --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/model/Image.java @@ -0,0 +1,7 @@ +package com.tananaev.giphy.model; + +public class Image { + public String width; + public String height; + public String url; +} diff --git a/app/src/main/java/com/tananaev/giphy/model/Images.java b/app/src/main/java/com/tananaev/giphy/model/Images.java new file mode 100644 index 0000000..aa24c8b --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/model/Images.java @@ -0,0 +1,7 @@ +package com.tananaev.giphy.model; + +public class Images { + public Image preview_gif; + public Image downsized; + public Image original; +} diff --git a/app/src/main/java/com/tananaev/giphy/model/Pagination.java b/app/src/main/java/com/tananaev/giphy/model/Pagination.java new file mode 100644 index 0000000..d6095bc --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/model/Pagination.java @@ -0,0 +1,7 @@ +package com.tananaev.giphy.model; + +public class Pagination { + public int offset; + public int total_count; + public int count; +} diff --git a/app/src/main/java/com/tananaev/giphy/model/Response.java b/app/src/main/java/com/tananaev/giphy/model/Response.java new file mode 100644 index 0000000..2aa6d9c --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/model/Response.java @@ -0,0 +1,8 @@ +package com.tananaev.giphy.model; + +import java.util.List; + +public class Response { + public List data; + public Pagination pagination; +} diff --git a/app/src/main/java/com/tananaev/giphy/repo/MainRepository.java b/app/src/main/java/com/tananaev/giphy/repo/MainRepository.java new file mode 100644 index 0000000..629d0fa --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/repo/MainRepository.java @@ -0,0 +1,15 @@ +package com.tananaev.giphy.repo; + +import com.tananaev.giphy.service.GiphyService; + +import javax.inject.Inject; + +public class MainRepository { + + private GiphyService service; + + @Inject + public MainRepository(GiphyService service) { + this.service = service; + } +} diff --git a/app/src/main/java/com/tananaev/giphy/service/AuthInterceptor.java b/app/src/main/java/com/tananaev/giphy/service/AuthInterceptor.java new file mode 100644 index 0000000..4c6fd2c --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/service/AuthInterceptor.java @@ -0,0 +1,29 @@ +package com.tananaev.giphy.service; + +import java.io.IOException; + +import okhttp3.HttpUrl; +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +public class AuthInterceptor implements Interceptor { + + private static final String API_KEY = "FdzU6ULmoB0YkKrII9Gzs0HX6fDS4YCo"; + + @Override + public Response intercept(Chain chain) throws IOException { + + Request original = chain.request(); + HttpUrl originalHttpUrl = original.url(); + + HttpUrl url = originalHttpUrl.newBuilder() + .addQueryParameter("api_key", API_KEY) + .build(); + + Request.Builder requestBuilder = original.newBuilder().url(url); + + Request request = requestBuilder.build(); + return chain.proceed(request); + } +} diff --git a/app/src/main/java/com/tananaev/giphy/service/GiphyService.java b/app/src/main/java/com/tananaev/giphy/service/GiphyService.java new file mode 100644 index 0000000..05c8c59 --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/service/GiphyService.java @@ -0,0 +1,12 @@ +package com.tananaev.giphy.service; + +import com.tananaev.giphy.model.Response; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface GiphyService { + @GET("/v1/gifs/trending") + Call trending(@Query("offset") int offset, @Query("limit") int limit); +} diff --git a/app/src/main/java/com/tananaev/giphy/ui/main/MainFragment.java b/app/src/main/java/com/tananaev/giphy/ui/main/MainFragment.java index 9327dc9..513bedb 100644 --- a/app/src/main/java/com/tananaev/giphy/ui/main/MainFragment.java +++ b/app/src/main/java/com/tananaev/giphy/ui/main/MainFragment.java @@ -1,22 +1,35 @@ package com.tananaev.giphy.ui.main; -import androidx.lifecycle.ViewModelProviders; - import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; +import androidx.lifecycle.ViewModelProvider; +import androidx.lifecycle.ViewModelProviders; +import androidx.paging.PagedListAdapter; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.tananaev.giphy.R; +import javax.inject.Inject; + +import dagger.hilt.android.AndroidEntryPoint; + +@AndroidEntryPoint public class MainFragment extends Fragment { - private MainViewModel mViewModel; + private static final int COLUMNS = 2; + + private MainViewModel viewModel; + private PagedListAdapter adapter; + + @Inject + MainViewModelFactory viewModelFactory; public static MainFragment newInstance() { return new MainFragment(); @@ -24,16 +37,23 @@ public static MainFragment newInstance() { @Nullable @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, - @Nullable Bundle savedInstanceState) { + public View onCreateView( + @NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.main_fragment, container, false); } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + RecyclerView gridView = view.findViewById(R.id.grid); + gridView.setLayoutManager(new GridLayoutManager(getContext(), COLUMNS)); + + } + @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mViewModel = ViewModelProviders.of(this).get(MainViewModel.class); - // TODO: Use the ViewModel + viewModel = new ViewModelProvider(this, viewModelFactory).get(MainViewModel.class); } - } diff --git a/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModel.java b/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModel.java index ca5fab8..72dd238 100644 --- a/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModel.java +++ b/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModel.java @@ -2,6 +2,16 @@ import androidx.lifecycle.ViewModel; +import com.tananaev.giphy.repo.MainRepository; + +import javax.inject.Inject; + public class MainViewModel extends ViewModel { - // TODO: Implement the ViewModel + + private MainRepository repository; + + @Inject + public MainViewModel(MainRepository repository) { + this.repository = repository; + } } diff --git a/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModelFactory.java b/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModelFactory.java new file mode 100644 index 0000000..980ba3a --- /dev/null +++ b/app/src/main/java/com/tananaev/giphy/ui/main/MainViewModelFactory.java @@ -0,0 +1,25 @@ +package com.tananaev.giphy.ui.main; + +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import com.tananaev.giphy.repo.MainRepository; + +import javax.inject.Inject; + +public class MainViewModelFactory implements ViewModelProvider.Factory { + + private MainRepository repository; + + @Inject + public MainViewModelFactory(MainRepository repository) { + this.repository = repository; + } + + @NonNull + @Override + public T create(@NonNull Class modelClass) { + return (T) new MainViewModel(repository); + } +} diff --git a/app/src/main/res/layout/main_fragment.xml b/app/src/main/res/layout/main_fragment.xml index 1196542..dff0b56 100644 --- a/app/src/main/res/layout/main_fragment.xml +++ b/app/src/main/res/layout/main_fragment.xml @@ -1,20 +1,15 @@ - - + - \ No newline at end of file + diff --git a/build.gradle b/build.gradle index 0b8bbad..f0592db 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ buildscript { } dependencies { classpath "com.android.tools.build:gradle:4.0.0" + classpath "com.google.dagger:hilt-android-gradle-plugin:2.28-alpha" } }