diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d19981..fbb6828 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 1b3ccab..c8978b2 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + 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..b33fed4 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..b90a22b 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.AlbumsActivity import com.codingblocks.restapiretrofitjson.activities.PostsActivity import com.codingblocks.restapiretrofitjson.activities.TodosActivity import com.codingblocks.restapiretrofitjson.activities.UsersActivity @@ -27,6 +28,8 @@ class MainActivity : AppCompatActivity() { startActivity(Intent(this@MainActivity, TodosActivity::class.java)) }) - + btnAlbums.setOnClickListener({ + startActivity(Intent(this@MainActivity, AlbumsActivity::class.java)) + }) } } diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumsActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumsActivity.java new file mode 100644 index 0000000..b1feeb6 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/AlbumsActivity.java @@ -0,0 +1,59 @@ +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.util.Log; +import android.view.View; + +import com.codingblocks.restapiretrofitjson.R; +import com.codingblocks.restapiretrofitjson.adapters.AlbumAdapter; +import com.codingblocks.restapiretrofitjson.adapters.UserAdapter; +import com.codingblocks.restapiretrofitjson.api.API; +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 AlbumsActivity extends AppCompatActivity { + final String TAG = "AlbumAct"; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_albums); + + RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvAlbumList); + final AlbumAdapter albumAdapter = new AlbumAdapter(this, new ArrayList()); + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + recyclerView.setAdapter(albumAdapter); + + albumAdapter.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(int itemId, View view) { + Intent albumIntent = new Intent(AlbumsActivity.this, PhotosListActivity.class); + albumIntent.putExtra("albumId", itemId); + startActivity(albumIntent); + } + }); + + API.getInstance().getAlbumsAPI().getAllAlbums().enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + Log.d(TAG, "onResponse: "); + albumAdapter.updateAdapter(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + Log.d(TAG, "onFailure: "); + } + }); + + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoViewActivity.java b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoViewActivity.java new file mode 100644 index 0000000..0096d51 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotoViewActivity.java @@ -0,0 +1,22 @@ +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 PhotoViewActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_photo_view); + + Picasso.with(this).load(getIntent().getStringExtra("url")).placeholder(R.mipmap.loading_image_2_icon) + .into((ImageView) findViewById(R.id.ivPhoto)); + ((TextView)findViewById(R.id.tvPhotoViewTitle)).setText(getIntent().getStringExtra("title")); + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotosListActivity.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotosListActivity.kt new file mode 100644 index 0000000..ffe4c2b --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/activities/PhotosListActivity.kt @@ -0,0 +1,44 @@ +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.widget.Toast +import kotlinx.android.synthetic.main.activity_photos_list.* + +import com.codingblocks.restapiretrofitjson.R +import com.codingblocks.restapiretrofitjson.adapters.PhotoListAdapter +import com.codingblocks.restapiretrofitjson.api.API +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener +import com.codingblocks.restapiretrofitjson.models.Photo +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class PhotosListActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_photos_list) + + var photoListAdapter : PhotoListAdapter = PhotoListAdapter(this, ArrayList()) + + rvPhotosList.layoutManager = LinearLayoutManager(this) + rvPhotosList.adapter = photoListAdapter + + var photoListCallback = object: Callback> { + override fun onResponse(call: Call>?, response: Response>?) { + photoListAdapter.updatePhotos(response?.body()) + } + + override fun onFailure(call: Call>?, t: Throwable?) { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + } + + API.getInstance().photoAPI.getPhotosOfAlbumId(intent.getIntExtra("albumId",-1)) + .enqueue(photoListCallback) + } +} diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.kt new file mode 100644 index 0000000..6719fb6 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/AlbumAdapter.kt @@ -0,0 +1,58 @@ +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 com.codingblocks.restapiretrofitjson.R +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener +import com.codingblocks.restapiretrofitjson.models.Album +import kotlinx.android.synthetic.main.list_item_album.view.* + +/** + * Created by abheisenberg on 2/7/17. + */ + +class AlbumAdapter (private val context: Context, + private var albumsList: ArrayList?) + : RecyclerView.Adapter() { + + internal var onItemClickListener : OnItemClickListener? = null + + fun setOnItemClickListener(onItemClickListener: OnItemClickListener) { + this.onItemClickListener = onItemClickListener + } + + fun updateAdapter(newAlbumList: ArrayList) { + this.albumsList = newAlbumList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): AlbumHolder { + val itemView = LayoutInflater.from(parent?.context) + .inflate(R.layout.list_item_album, parent, false) + return AlbumHolder(itemView) + } + + override fun onBindViewHolder(holder: AlbumHolder?, position: Int) { + holder?.BindAlbum(albumsList!![position]) + } + + override fun getItemCount(): Int { + return albumsList!!.size + } + + inner class AlbumHolder (public var thisView: View) + : RecyclerView.ViewHolder(thisView) { + + fun BindAlbum(album: Album) { + thisView.tvAlbumTitle.text = album.title + thisView.setOnClickListener { + onItemClickListener?.onItemClick(album.id + , thisView) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoListAdapter.kt b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoListAdapter.kt new file mode 100644 index 0000000..52766e1 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/adapters/PhotoListAdapter.kt @@ -0,0 +1,56 @@ +package com.codingblocks.restapiretrofitjson.adapters + +import android.content.Context +import android.content.Intent +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.codingblocks.restapiretrofitjson.R +import com.codingblocks.restapiretrofitjson.activities.PhotoViewActivity +import com.codingblocks.restapiretrofitjson.interfaces.OnItemClickListener +import com.codingblocks.restapiretrofitjson.models.Photo +import com.squareup.picasso.Picasso +import kotlinx.android.synthetic.main.list_item_photos.view.* + +/** + * Created by abheisenberg on 2/7/17. + */ +class PhotoListAdapter (private val context: Context, + private var photosList: ArrayList? +) : RecyclerView.Adapter() { + + fun updatePhotos(newPhotoList: ArrayList?) { + this.photosList = newPhotoList + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): photoHolder { + val itemView : View = LayoutInflater.from(parent?.context).inflate(R.layout.list_item_photos, parent, false) + return photoHolder(itemView) + } + + override fun onBindViewHolder(holder: photoHolder?, position: Int) { + holder?.BindPhotoHolder(photosList!![position]) + holder?.thisView?.setOnClickListener { + context.startActivity(Intent(context, PhotoViewActivity::class.java) + .putExtra("title",photosList!![position].title) + .putExtra("url",photosList!![position].url)) + } + } + + override fun getItemCount(): Int { + return photosList!!.size + } + + inner class photoHolder (public var thisView: View) : RecyclerView.ViewHolder(thisView) + { + fun BindPhotoHolder(photo: Photo) { + Picasso.with(context).load(photo.thumbnailUrl) + .placeholder(R.mipmap.loading_image_2_icon) + .into(thisView.ivThumbnail) + thisView.tvPhotoTitle.text = photo.title + } + } + +} \ No newline at end of file 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..6f8de18 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.cbCompleted.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..538db1b 100644 --- a/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/API.java @@ -1,5 +1,7 @@ package com.codingblocks.restapiretrofitjson.api; +import com.codingblocks.restapiretrofitjson.models.Photo; + import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -15,6 +17,16 @@ public class API { private UsersAPI usersAPI; private CommentsAPI commentsAPI; private TodosAPI todosAPI; + private AlbumAPI albumsAPI; + private PhotoAPI photoAPI; + + public PhotoAPI getPhotoAPI() { + return photoAPI; + } + + public AlbumAPI getAlbumsAPI() { + return albumsAPI; + } public PostsAPI getPostsAPI() { return postsAPI; @@ -44,6 +56,8 @@ private API() { usersAPI = retrofit.create(UsersAPI.class); commentsAPI = retrofit.create(CommentsAPI.class); todosAPI = retrofit.create(TodosAPI.class); + albumsAPI = 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..6e97d69 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/AlbumAPI.java @@ -0,0 +1,17 @@ +package com.codingblocks.restapiretrofitjson.api; + +import com.codingblocks.restapiretrofitjson.models.Album; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; + +/** + * Created by abheisenberg on 2/7/17. + */ + +public interface AlbumAPI { + @GET("/albums") + Call> getAllAlbums(); +} 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..c0c02b9 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/api/PhotoAPI.java @@ -0,0 +1,20 @@ +package com.codingblocks.restapiretrofitjson.api; + +import com.codingblocks.restapiretrofitjson.models.Photo; + +import java.util.ArrayList; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by abheisenberg on 2/7/17. + */ + +public interface PhotoAPI { + + @GET("/photos") + Call> getPhotosOfAlbumId(@Query("albumId") int albumId); + +} 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..5aa53b0 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Album.kt @@ -0,0 +1,11 @@ +package com.codingblocks.restapiretrofitjson.models + +/** + * Created by abheisenberg on 2/7/17. + */ + +data class Album ( + val userId: Int, + val id: Int, + val title: String +) 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..985ab90 --- /dev/null +++ b/app/src/main/java/com/codingblocks/restapiretrofitjson/models/Photo.kt @@ -0,0 +1,12 @@ +package com.codingblocks.restapiretrofitjson.models + +/** + * Created by abheisenberg 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/res/layout/activity_albums.xml b/app/src/main/res/layout/activity_albums.xml new file mode 100644 index 0000000..c8cf955 --- /dev/null +++ b/app/src/main/res/layout/activity_albums.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_photo_view.xml b/app/src/main/res/layout/activity_photo_view.xml new file mode 100644 index 0000000..a5c8ea3 --- /dev/null +++ b/app/src/main/res/layout/activity_photo_view.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/app/src/main/res/layout/activity_photos_list.xml b/app/src/main/res/layout/activity_photos_list.xml new file mode 100644 index 0000000..7e84a98 --- /dev/null +++ b/app/src/main/res/layout/activity_photos_list.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/app/src/main/res/layout/list_item_album.xml b/app/src/main/res/layout/list_item_album.xml new file mode 100644 index 0000000..4fda29e --- /dev/null +++ b/app/src/main/res/layout/list_item_album.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/list_item_comment.xml b/app/src/main/res/layout/list_item_comment.xml index f4df93b..74f5a30 100644 --- a/app/src/main/res/layout/list_item_comment.xml +++ b/app/src/main/res/layout/list_item_comment.xml @@ -1,34 +1,46 @@ - - + - + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/list_item_photos.xml b/app/src/main/res/layout/list_item_photos.xml new file mode 100644 index 0000000..6296d57 --- /dev/null +++ b/app/src/main/res/layout/list_item_photos.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/list_item_post.xml b/app/src/main/res/layout/list_item_post.xml index e6f9cce..0f7ec49 100644 --- a/app/src/main/res/layout/list_item_post.xml +++ b/app/src/main/res/layout/list_item_post.xml @@ -1,21 +1,32 @@ - - - + android:layout_height="wrap_content"> + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/layout/list_item_todo.xml b/app/src/main/res/layout/list_item_todo.xml index 7dd7af1..6f93be5 100644 --- a/app/src/main/res/layout/list_item_todo.xml +++ b/app/src/main/res/layout/list_item_todo.xml @@ -1,12 +1,37 @@ - - + + + + + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/loading_image_2_icon.png b/app/src/main/res/mipmap-hdpi/loading_image_2_icon.png new file mode 100644 index 0000000..fd67221 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/loading_image_2_icon.png differ