Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,18 @@ dependencies {
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.android.support:design:22.2.0'
compile 'com.android.support:recyclerview-v7:22.2.0'

compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.4.0'
compile 'com.squareup.okhttp:okhttp:2.4.0'

compile 'com.github.bumptech.glide:glide:3.6.0'
compile 'com.github.bumptech.glide:okhttp-integration:1.3.1'

compile 'de.halfbit:tinybus:3.0.1'

compile('de.keyboardsurfer.android.widget:crouton:1.8.5@aar') {
// exclusion is not necessary, but generally a good idea.
exclude group: 'com.google.android', module: 'support-v4'
}
}
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@
</activity>
</application>

<uses-permission android:name="android.permission.INTERNET" />

</manifest>
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package android.coding.interview.makeitawesome;

import android.app.FragmentTransaction;
import android.coding.interview.makeitawesome.fragment.DetailFragment;
import android.coding.interview.makeitawesome.fragment.PicturesFragment;
import android.coding.interview.makeitawesome.fragment.WelcomeScreenFragment;
import android.os.Bundle;
Expand Down Expand Up @@ -74,6 +76,7 @@ public boolean onNavigationItemSelected(MenuItem menuItem) {
if (fm.findFragmentByTag("PICTURES_FRAGMENT") == null) { // no pictures shown yet, show it
fm.beginTransaction().replace(R.id.content_frame, PicturesFragment.newInstance(), "PICTURES_FRAGMENT").addToBackStack(null).commit();
}

}

mDrawerLayout.closeDrawers();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,51 @@
package android.coding.interview.makeitawesome.adapter;


import android.coding.interview.makeitawesome.R;
import android.coding.interview.makeitawesome.fragment.DetailFragment;
import android.coding.interview.makeitawesome.model.Album;
import android.graphics.Bitmap;
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 java.util.Arrays;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;

import java.util.ArrayList;
import java.util.List;

/**
* adapter keeping data for list of photos
*/
public class PhotosAdapter extends RecyclerView.Adapter<PhotosAdapter.ViewHolder> {

// TODO this is a dummy data that you have to replace. You probably need List of some objects representing pictures
// rather than just strings
private List<String> mData = Arrays.asList("dummy 1", "dummy 2", "dummy 3", "dummy 4", "etc");

private List<Album> mData = null;
android.support.v4.app.FragmentManager fragmentManager;

public android.support.v4.app.FragmentManager getFragmentManager() {
return fragmentManager;
}

public void setFragmentManager(android.support.v4.app.FragmentManager fragmentManager) {
this.fragmentManager = fragmentManager;
}

public List<Album> getmData() {
return mData;
}

public void setmData(List<Album> mData) {
this.mData = mData;
}

public PhotosAdapter() {
mData = new ArrayList<Album>();
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
Expand All @@ -27,19 +55,41 @@ public ViewHolder onCreateViewHolder(ViewGroup parent, int i) {

@Override
public void onBindViewHolder(ViewHolder holder, int i) {
holder.mText.setText(mData.get(i));
holder.mText.setText(mData.get(i).getTitle());

final ImageView img = holder.mImage;
Glide.with(holder.mImage.getContext()).load(mData.get(i).getThumbnailUrl()).asBitmap().into(new SimpleTarget<Bitmap>(80, 80) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

keeping img reference here in callback causes multiple loading of different urls into same position on fast scrolling and then waiting for load.
Easily fixed by just simple loading with .into(holder.mImage) without callback.

img.setImageBitmap(resource);
}
});
}

@Override
public int getItemCount() {
return mData.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {



public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

final TextView mText;
final ImageView mImage;

public ViewHolder(View itemView) {
super(itemView);
mText = (TextView) itemView;
itemView.setOnClickListener(this);
mText = (TextView) itemView.findViewById(R.id.item_title);
mImage = (ImageView) itemView.findViewById(R.id.item_icon);
}

@Override
public void onClick(final View view) {
int itemPosition = getPosition();
fragmentManager.beginTransaction().replace(R.id.content_frame,DetailFragment.newInstance(mData.get(itemPosition)), "PICTURES_FRAGMENT").addToBackStack(null).commit();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package android.coding.interview.makeitawesome.fragment;

import android.coding.interview.makeitawesome.R;
import android.coding.interview.makeitawesome.model.Album;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;


public class DetailFragment extends Fragment {

public static Fragment newInstance(Album album) {
DetailFragment detail = new DetailFragment();
detail.setAlbum(album);
detail.setRetainInstance(true);
return detail;
}

public Album getAlbum() {
return album;
}

public void setAlbum(Album album) {
this.album = album;
}

Album album;
ImageView mImage;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.picture_detail, container, false);
mImage = (ImageView) v.findViewById(R.id.item_icon);
showImage();
return v;
}


public void showImage() {

Glide.with(getActivity()).load(album.getUrl()).asBitmap().into(new SimpleTarget<Bitmap>(350, 350) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
mImage.setImageBitmap(resource);
}
});
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package android.coding.interview.makeitawesome.fragment;

import android.app.ProgressDialog;
import android.coding.interview.makeitawesome.R;
import android.coding.interview.makeitawesome.adapter.PhotosAdapter;
import android.coding.interview.makeitawesome.model.Album;
import android.coding.interview.makeitawesome.networking.AlbumEvent;
import android.coding.interview.makeitawesome.networking.RestClient;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
Expand All @@ -11,6 +15,13 @@
import android.view.View;
import android.view.ViewGroup;

import java.util.List;

import de.halfbit.tinybus.Subscribe;
import de.halfbit.tinybus.TinyBus;
import de.keyboardsurfer.android.widget.crouton.Crouton;
import de.keyboardsurfer.android.widget.crouton.Style;

/**
* This is Your TASK:<br>
* This is a fragment where you need to show list of pictures and details fetched from API<br>
Expand All @@ -19,19 +30,78 @@
public class PicturesFragment extends Fragment {

public static Fragment newInstance() {
return new PicturesFragment();
PicturesFragment pictures = new PicturesFragment();
pictures.setRetainInstance(true);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not a good practice, but you can't completely blame someone for using it. At least, in this version he worries about the lifecycle.

return pictures;
}

RecyclerView rv;
ProgressDialog mProgressDialog;
List<Album> mData;
boolean loading = false;
private TinyBus mBus;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
RecyclerView rv = (RecyclerView) inflater.inflate(R.layout.pictures_list_fragment, container, false);
setupRecyclerView(rv);
rv = (RecyclerView) inflater.inflate(R.layout.pictures_list_fragment, container, false);

if (mProgressDialog != null && mProgressDialog.isShowing())
mProgressDialog.dismiss();

mProgressDialog = new ProgressDialog(container.getContext());
mProgressDialog.setIndeterminate(true);
mProgressDialog.setMessage("Loading...");
mProgressDialog.show();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All this code is messy. He should have at least encapsulated some parts in functions.


mBus = TinyBus.from(getActivity());

if (mData == null) {
if (!loading) {
RestClient restClient = RestClient.getInstance();
restClient.getPhotos(mBus);
loading = true;
}
} else {
drawList();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dialog is hidden in drawlist(), but if mData was != null, he shouldn't have ever shown it. I get more worried about this kind of thins. A medium-good programmer that moreover is trying to impress you... I want to think I wouldn't write such a spaghetti code for something relatively simple.

}
return rv;
}

private void setupRecyclerView(RecyclerView recyclerView) {
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
recyclerView.setAdapter(new PhotosAdapter());
@Override
public void onResume() {
super.onResume();
mBus.register(this);
}

@Override
public void onPause() {
super.onPause();
mBus.unregister(this);
}

@Subscribe
public void onAlbumEvent(AlbumEvent apiEvent) {

if (mProgressDialog.isShowing())
mProgressDialog.dismiss();
if (apiEvent.getError() != null) {
Crouton.makeText(getActivity(), apiEvent.getError().getMessage(), Style.ALERT).show();
} else {
mData = apiEvent.getObject();
drawList();
}
loading = false;
}

public void drawList() {
if (mProgressDialog.isShowing())
mProgressDialog.dismiss();
rv.setLayoutManager(new LinearLayoutManager(rv.getContext()));
PhotosAdapter photosAdapter = new PhotosAdapter();
photosAdapter.setmData(mData);
photosAdapter.setFragmentManager(getActivity().getSupportFragmentManager());
rv.setAdapter(photosAdapter);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package android.coding.interview.makeitawesome.model;

/**
* Created by antonio on 24/07/15.
*/
public class Album {

private int albumId;
private int id;
private String title;
private String url;
private String thumbnailUrl;

public Album() {
this.albumId = -1;
this.id = -1;
this.title = "";
this.url = "";
this.thumbnailUrl = "";
}

public Album(int albumId, int id, String title, String url, String thumbnailUrl) {
this.albumId = albumId;
this.id = id;
this.title = title;
this.url = url;
this.thumbnailUrl = thumbnailUrl;
}

public int getAlbumId() {
return albumId;
}

public void setAlbumId(int albumId) {
this.albumId = albumId;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getTitle() {
return title;
}

public void setTitle(String title) {
this.title = title;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getThumbnailUrl() {
return thumbnailUrl;
}

public void setThumbnailUrl(String thumbnailUrl) {
this.thumbnailUrl = thumbnailUrl;
}
}
Loading