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"
}
}