diff --git a/app/build.gradle b/app/build.gradle index b963ad0..e09adf6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,6 +33,7 @@ dependencies { compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8' compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0' + compile 'com.squareup.picasso:picasso:2.5.2' testCompile 'junit:junit:4.12' } repositories { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 363fe63..5e30cba 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,10 @@ - + + + + \ No newline at end of file diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/MainActivity.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/MainActivity.kt index f8ad985..986e035 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/MainActivity.kt +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/MainActivity.kt @@ -3,6 +3,7 @@ package com.codingblocks.restapiretrofitjson import android.content.Intent import android.support.v7.app.AppCompatActivity import android.os.Bundle +import com.codingblocks.restapiretrofitjson.activities.AlbumActivity import com.codingblocks.restapiretrofitjson.activities.PostsActivity import com.codingblocks.restapiretrofitjson.activities.TodosActivity import com.codingblocks.restapiretrofitjson.activities.UsersActivity @@ -15,18 +16,22 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - btnPosts.setOnClickListener({ + iv_Posts.setOnClickListener({ startActivity(Intent(this@MainActivity, PostsActivity::class.java)) }) - btnUsers.setOnClickListener({ + iv_user.setOnClickListener({ startActivity(Intent(this@MainActivity, UsersActivity::class.java)) }) - btnTodos.setOnClickListener({ + iv_Todos.setOnClickListener({ startActivity(Intent(this@MainActivity, TodosActivity::class.java)) }) + iv_Albums.setOnClickListener ({ + startActivity(Intent(this@MainActivity,AlbumActivity::class.java)) + }) + } } diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumActivity.java new file mode 100644 index 0000000..11e3881 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumActivity.java @@ -0,0 +1,67 @@ +package com.codingblocks.restapiretrofitjson.activities; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.codingblocks.restapiretrofitjson.R; +import com.codingblocks.restapiretrofitjson.adapters.AlbumAdapter; +import com.codingblocks.restapiretrofitjson.api.API; +import com.codingblocks.restapiretrofitjson.api.AlbumAPI; +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener; +import com.codingblocks.restapiretrofitjson.models.Album; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class AlbumActivity extends AppCompatActivity { + + public static final String TAG = "alb_act"; + + RecyclerView rvalbum; + AlbumAdapter albumAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_album); + + rvalbum = (RecyclerView)findViewById(R.id.rv_album); + rvalbum.setLayoutManager(new LinearLayoutManager(this)); + + albumAdapter = new AlbumAdapter(this,new ArrayList()); + rvalbum.setAdapter(albumAdapter); + + albumAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(int itemId, View view) { + Intent i = new Intent(AlbumActivity.this,PhotoActivity.class); + i.putExtra("albumId",itemId); + startActivity(i); + } + }); + + AlbumAPI albumAPI = API.getInstance().getAlbumAPI(); + + Callback> albumcallback = new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + albumAdapter.updateAlbum(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }; + + int albumIdRecived = getIntent().getIntExtra("userId",-1); + albumAPI.getAlbum().enqueue(albumcallback); + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/LargeImageActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/LargeImageActivity.java new file mode 100644 index 0000000..2cee06e --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/LargeImageActivity.java @@ -0,0 +1,35 @@ +package com.codingblocks.restapiretrofitjson.activities; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.widget.ImageView; +import android.widget.TextView; + +import com.codingblocks.restapiretrofitjson.R; +import com.squareup.picasso.Picasso; + +public class LargeImageActivity extends AppCompatActivity { + + ImageView largeimage; + TextView title_largeimage; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_large_image); + + largeimage = (ImageView) findViewById(R.id.iv_largeimage); + title_largeimage = (TextView) findViewById(R.id.tv_largeimage_title); + + String imageUrlRecived = getIntent().getStringExtra("photoURL"); + if(imageUrlRecived != null){ + Picasso.with(LargeImageActivity.this).load(imageUrlRecived).error(R.drawable.no_image).into(largeimage); + } + + String imagetitleRecived = getIntent().getStringExtra("photoTitle"); + if(imagetitleRecived != null){ + title_largeimage.setText(imagetitleRecived); + } + + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoActivity.java new file mode 100644 index 0000000..4b5c132 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoActivity.java @@ -0,0 +1,65 @@ +package com.codingblocks.restapiretrofitjson.activities; + +import android.content.Intent; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.view.View; + +import com.codingblocks.restapiretrofitjson.R; +import com.codingblocks.restapiretrofitjson.adapters.PhotoAdapter; +import com.codingblocks.restapiretrofitjson.api.API; +import com.codingblocks.restapiretrofitjson.api.PhotoAPI; +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener; +import com.codingblocks.restapiretrofitjson.models.Photo; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class PhotoActivity extends AppCompatActivity { + + RecyclerView rvPhotos; + PhotoAdapter photoAdapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photo); + + rvPhotos = (RecyclerView) findViewById(R.id.rv_photo); + rvPhotos.setLayoutManager(new LinearLayoutManager(this)); + + photoAdapter = new PhotoAdapter(this,new ArrayList()); + rvPhotos.setAdapter(photoAdapter); + + photoAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(int itemId, View view) { + Intent fullImageActIntent=new Intent(PhotoActivity.this,LargeImageActivity.class); + fullImageActIntent.putExtra("photoURL",photoAdapter.getPhotos().get(itemId-1).getUrl()); + fullImageActIntent.putExtra("photoTitle",photoAdapter.getPhotos().get(itemId-1).getTitle()); + startActivity(fullImageActIntent); + } + }); + + PhotoAPI photoAPI = API.getInstance().getPhotoAPI(); + Callback> photocallback = new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + photoAdapter.updatephotolist(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }; + + int albumIdReceived = getIntent().getIntExtra("albumId", -1); + photoAPI.getPhotos().enqueue(photocallback); + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PostsActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PostsActivity.java index b244f79..865c854 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PostsActivity.java +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PostsActivity.java @@ -36,8 +36,10 @@ protected void onCreate(Bundle savedInstanceState) { rvPostsList = (RecyclerView) findViewById(R.id.rvPostsList); rvPostsList.setLayoutManager(new LinearLayoutManager(this)); + postAdapter = new PostAdapter(this, new ArrayList()); rvPostsList.setAdapter(postAdapter); + postAdapter.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int itemId, View view) { diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.java new file mode 100644 index 0000000..ea1ad87 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.java @@ -0,0 +1,90 @@ +package com.codingblocks.restapiretrofitjson.adapters; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import com.codingblocks.restapiretrofitjson.R; +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener; +import com.codingblocks.restapiretrofitjson.models.Album; + +import org.w3c.dom.Text; + +import java.util.ArrayList; + +/** + * Created by ravneet on 2/7/17. + */ + +public class AlbumAdapter extends RecyclerView.Adapter { + + public static final String TAG = "alb_adp"; + + private Context context; + private ArrayList albumlist; + private OnItemClickListener onItemClickListener; + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public AlbumAdapter(Context context,ArrayList albumlist){ + this.albumlist = albumlist; + this.context = context; + } + + public void updateAlbum(ArrayList albumlist){ + this.albumlist = albumlist; + notifyDataSetChanged(); + } + + @Override + public AlbumViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + Log.i(TAG, "onCreateViewHolder: "); + + LayoutInflater li = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); + View itemview = li.inflate(R.layout.list_item_album,parent,false); + return new AlbumViewHolder(itemview); + } + + @Override + public void onBindViewHolder(AlbumViewHolder holder, int position) { + + Log.i(TAG, "onBindViewHolder: "); + + final Album thisalbum = albumlist.get(position); + + holder.albumTitle.setText(thisalbum.getTitle()); + holder.thisview.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(onItemClickListener != null){ + onItemClickListener.onItemClick(thisalbum.getId(),view); + } + } + }); + + } + + @Override + public int getItemCount() { + return albumlist.size(); + } + + class AlbumViewHolder extends RecyclerView.ViewHolder{ + TextView albumTitle; + View thisview; + + public AlbumViewHolder(View itemView) { + super(itemView); + thisview = itemView; + albumTitle = (TextView) itemView.findViewById(R.id.tv_album_title); + + } + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoAdapter.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoAdapter.java new file mode 100644 index 0000000..dbb0f8d --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoAdapter.java @@ -0,0 +1,97 @@ +package com.codingblocks.restapiretrofitjson.adapters; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.codingblocks.restapiretrofitjson.R; +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener; +import com.codingblocks.restapiretrofitjson.models.Photo; +import com.squareup.picasso.Picasso; + +import java.util.ArrayList; + +/** + * Created by ravneet on 2/7/17. + */ + +public class PhotoAdapter extends RecyclerView.Adapter { + + private Context context; + private ArrayList photolist; + private OnItemClickListener onItemClickListener; + + public ArrayList getPhotos(){ + return photolist; + } + + public void setOnItemClickListener(OnItemClickListener onItemClickListener) { + this.onItemClickListener = onItemClickListener; + } + + public PhotoAdapter(Context context,ArrayList photolist){ + this.photolist = photolist; + this.context = context; + } + + public void updatephotolist(ArrayList photolist){ + this.photolist = photolist; + notifyDataSetChanged(); + } + + @Override + public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + + LayoutInflater li = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); + View itemview = li.inflate(R.layout.list_item_photo,parent,false); + + return new PhotoViewHolder(itemview); + } + + @Override + public void onBindViewHolder(PhotoViewHolder holder, int position) { + + final Photo thisphoto = photolist.get(position); + + String imageUrl = thisphoto.getThumbnailUrl(); + + if(imageUrl != null){ + Picasso.with(context).load(imageUrl).error(R.drawable.no_image).into(holder.ivPhotoThumb); + } + + holder.title.setText(thisphoto.getTitle()); + holder.thisview.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if(onItemClickListener != null){ + onItemClickListener.onItemClick(thisphoto.getId(),view); + } + } + }); + + } + + @Override + public int getItemCount() { + return photolist.size(); + } + + class PhotoViewHolder extends RecyclerView.ViewHolder{ + + ImageView ivPhotoThumb; + TextView title; + View thisview; + + public PhotoViewHolder(View itemView) { + super(itemView); + + ivPhotoThumb = (ImageView) itemView.findViewById(R.id.iv_photo); + title = (TextView) itemView.findViewById(R.id.tv_photo_title); + thisview = itemView; + } + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/TodoAdapter.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/TodoAdapter.kt index c0bb9b6..cadc773 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/TodoAdapter.kt +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/TodoAdapter.kt @@ -47,7 +47,8 @@ public class TodoAdapter ( : RecyclerView.ViewHolder(itemView) { fun bindTodo(todo: Todo) { - itemView.tvTodoTitle.text = todo.title; + itemView.tvTodoTitle.text = todo.title + itemView.checkbox.isChecked=todo.completed } } } \ No newline at end of file diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java index 771fdc2..f3e79c0 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java @@ -15,6 +15,8 @@ public class API { private UsersAPI usersAPI; private CommentsAPI commentsAPI; private TodosAPI todosAPI; + private AlbumAPI albumAPI; + private PhotoAPI photoAPI; public PostsAPI getPostsAPI() { return postsAPI; @@ -32,6 +34,10 @@ public TodosAPI getTodosAPI() { return todosAPI; } + public AlbumAPI getAlbumAPI(){return albumAPI;} + + public PhotoAPI getPhotoAPI(){return photoAPI;} + private API() { Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://jsonplaceholder.typicode.com") @@ -44,6 +50,8 @@ private API() { usersAPI = retrofit.create(UsersAPI.class); commentsAPI = retrofit.create(CommentsAPI.class); todosAPI = retrofit.create(TodosAPI.class); + albumAPI = retrofit.create(AlbumAPI.class); + photoAPI = retrofit.create(PhotoAPI.class); } public static API getInstance() { diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/api/AlbumAPI.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/AlbumAPI.java new file mode 100644 index 0000000..80a8391 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/AlbumAPI.java @@ -0,0 +1,25 @@ +package com.codingblocks.restapiretrofitjson.api; + +import com.codingblocks.restapiretrofitjson.models.Album; +import com.codingblocks.restapiretrofitjson.models.Photo; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +/** + * Created by ravneet on 2/7/17. + */ + +public interface AlbumAPI { + + @GET("/albums") + Call> getAlbum(); + + @GET("/albums/{id}/photos") + Call> getPhotoById( + @Path("id") int id + ); +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/api/PhotoAPI.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/PhotoAPI.java new file mode 100644 index 0000000..f3a59c7 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/PhotoAPI.java @@ -0,0 +1,25 @@ +package com.codingblocks.restapiretrofitjson.api; + +import com.codingblocks.restapiretrofitjson.models.Album; +import com.codingblocks.restapiretrofitjson.models.Photo; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +/** + * Created by ravneet on 2/7/17. + */ + +public interface PhotoAPI { + + @GET("/photos") + Call> getPhotos(); + + @GET("/albums/{id}/photos") + Call> getPhotoById( + @Path("id") int id + ); +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Album.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Album.kt new file mode 100644 index 0000000..c7204a4 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Album.kt @@ -0,0 +1,10 @@ +package com.codingblocks.restapiretrofitjson.models + +/** + * Created by ravneet on 2/7/17. + */ +data class Album( + val userId: Int, + val id: Int, + val title: String +) \ No newline at end of file diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Photo.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Photo.kt new file mode 100644 index 0000000..65f001e --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Photo.kt @@ -0,0 +1,12 @@ +package com.codingblocks.restapiretrofitjson.models + +/** + * Created by ravneet on 2/7/17. + */ +data class Photo( + val albumId: Int, + val id: Int, + val title: String, + val url: String, + val thumbnailUrl: String +) \ No newline at end of file diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Todo.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Todo.kt index b5a3ff1..26eef86 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Todo.kt +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Todo.kt @@ -4,6 +4,8 @@ package com.codingblocks.restapiretrofitjson.models * Created by championswimmer on 02/07/17. */ data class Todo ( - val id: Int, val userId: Int, - val title: String, val completed: Boolean + val id: Int, + val userId: Int, + val title: String, + val completed: Boolean ) \ No newline at end of file diff --git a/app/src/main/res/drawable/album.png b/app/src/main/res/drawable/album.png new file mode 100644 index 0000000..4bcd0c7 Binary files /dev/null and b/app/src/main/res/drawable/album.png differ diff --git a/app/src/main/res/drawable/no_image.png b/app/src/main/res/drawable/no_image.png new file mode 100644 index 0000000..ceedd03 Binary files /dev/null and b/app/src/main/res/drawable/no_image.png differ diff --git a/app/src/main/res/drawable/post.jpg b/app/src/main/res/drawable/post.jpg new file mode 100644 index 0000000..ac15563 Binary files /dev/null and b/app/src/main/res/drawable/post.jpg differ diff --git a/app/src/main/res/drawable/todo.jpg b/app/src/main/res/drawable/todo.jpg new file mode 100644 index 0000000..c2edb21 Binary files /dev/null and b/app/src/main/res/drawable/todo.jpg differ diff --git a/app/src/main/res/drawable/user.png b/app/src/main/res/drawable/user.png new file mode 100644 index 0000000..acf9b68 Binary files /dev/null and b/app/src/main/res/drawable/user.png differ diff --git a/app/src/main/res/layout/activity_album.xml b/app/src/main/res/layout/activity_album.xml new file mode 100644 index 0000000..0344f82 --- /dev/null +++ b/app/src/main/res/layout/activity_album.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_large_image.xml b/app/src/main/res/layout/activity_large_image.xml new file mode 100644 index 0000000..6c2e289 --- /dev/null +++ b/app/src/main/res/layout/activity_large_image.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d7e01c2..ae4280f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,6 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:layout_margin="10dp" android:layout_height="match_parent" tools:context="com.codingblocks.restapiretrofitjson.MainActivity"> @@ -11,18 +12,35 @@ android:layout_width="0dp" android:orientation="vertical" android:layout_height="match_parent"> -