diff --git a/app/build.gradle b/app/build.gradle index 445372a..0332d4b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -104,6 +104,8 @@ dependencies { compile libraries.tinyDancer compile libraries.lynx compile libraries.processPhoenix + compile 'com.googlecode.json-simple:json-simple:1.1' + testCompile libraries.junit testCompile libraries.robolectric diff --git a/app/src/main/java/ru/yandex/yamblz/App.java b/app/src/main/java/ru/yandex/yamblz/App.java index e5f9972..fcefd03 100644 --- a/app/src/main/java/ru/yandex/yamblz/App.java +++ b/app/src/main/java/ru/yandex/yamblz/App.java @@ -7,7 +7,9 @@ import ru.yandex.yamblz.developer_settings.DevMetricsProxy; import ru.yandex.yamblz.developer_settings.DeveloperSettingsModel; import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.handler.StubCriticalSectionsHandler; import ru.yandex.yamblz.loader.CollageLoaderManager; +import ru.yandex.yamblz.loader.StubCollageLoader; import timber.log.Timber; public class App extends Application { @@ -34,8 +36,8 @@ public void onCreate() { devMetricsProxy.apply(); } - CollageLoaderManager.init(null); // add implementation - CriticalSectionsManager.init(null); // add implementation + CollageLoaderManager.init(new StubCollageLoader()); // add implementation + CriticalSectionsManager.init(new StubCriticalSectionsHandler()); // add implementation } @NonNull diff --git a/app/src/main/java/ru/yandex/yamblz/handler/StubCriticalSectionsHandler.java b/app/src/main/java/ru/yandex/yamblz/handler/StubCriticalSectionsHandler.java index 0af9646..705c57d 100644 --- a/app/src/main/java/ru/yandex/yamblz/handler/StubCriticalSectionsHandler.java +++ b/app/src/main/java/ru/yandex/yamblz/handler/StubCriticalSectionsHandler.java @@ -1,39 +1,97 @@ package ru.yandex.yamblz.handler; + +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import junit.framework.Test; + +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentLinkedQueue; + public class StubCriticalSectionsHandler implements CriticalSectionsHandler { + private Handler handler = new Handler(Looper.getMainLooper()); + //private LinkedList taskList = new LinkedList<>(); + private Set sections = new HashSet<>(); + private ConcurrentLinkedQueue taskList = new ConcurrentLinkedQueue<>(); + private Map delayTasks = new LinkedHashMap<>(); + + private Runnable callback = new Runnable(){ + @Override + public void run() { + Task taskToExecute = null; + if (taskList.isEmpty()) { + return; + } + taskToExecute = taskList.poll(); + taskToExecute.run(); + if (sections.isEmpty()){ + handler.post(callback); + } + } + }; + @Override public void startSection(int id) { - + Log.i("Section", "start " + taskList.size()); + sections.add(id); + handler.removeCallbacks(callback); } @Override public void stopSection(int id) { - + Log.i("Section", "stop " + taskList.size()); + sections.remove(id); + if (sections.isEmpty()) { + handler.post(callback); + } } @Override public void stopSections() { - + Log.i("Sections", "all stop " + taskList.size()); + sections.clear(); + handler.post(callback); } @Override public void postLowPriorityTask(Task task) { + Log.i("LowPriotityTask", "start " + taskList.size()); + taskList.add(task); + if (taskList.size() == 1 && sections.isEmpty()) { + handler.post(callback); + } } @Override public void postLowPriorityTaskDelayed(Task task, int delay) { - + Log.i("LowPriorityTaskDelay", "start " + taskList.size()); + Runnable runnable = () -> postLowPriorityTask(task); + delayTasks.put(task, runnable); + handler.postDelayed(runnable, delay); } @Override public void removeLowPriorityTask(Task task) { - + Log.i("RemoveLwPriotityTask", "start " + taskList.size()); + taskList.remove(task); + handler.removeCallbacks(delayTasks.get(task)); } @Override public void removeLowPriorityTasks() { - + taskList.clear(); } + + } diff --git a/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategy.java b/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategy.java index d81d52d..081a980 100644 --- a/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategy.java +++ b/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategy.java @@ -7,4 +7,5 @@ public interface CollageStrategy { Bitmap create(List bitmaps); + } diff --git a/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategyImpl.java b/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategyImpl.java new file mode 100644 index 0000000..e654eb5 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategyImpl.java @@ -0,0 +1,41 @@ +package ru.yandex.yamblz.loader; + +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.util.Log; + +import java.util.List; + +/** + * Created by dan on 29.07.16. + */ +public class CollageStrategyImpl implements CollageStrategy { + @Override + public Bitmap create(List bitmaps) { + if (bitmaps.size() >= 4) { + Log.i("String", "Im here beach with 4 pics"); + Bitmap bitmap = Bitmap.createBitmap(600, 600, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(bitmaps.get(0), 0, 0, null); + canvas.drawBitmap(bitmaps.get(1), 300, 0, null); + canvas.drawBitmap(bitmaps.get(2), 0, 300, null); + canvas.drawBitmap(bitmaps.get(3), 300, 300, null); + canvas.save(); + return bitmap; + } + else { + Log.i("String", "Im here beach with 1 pic"); + Bitmap bitmap = Bitmap.createBitmap(600, 600, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(bitmaps.get(0), 0, 0, null); + canvas.save(); + return bitmaps.get(0); + } + + } + + +} diff --git a/app/src/main/java/ru/yandex/yamblz/loader/StubCollageLoader.java b/app/src/main/java/ru/yandex/yamblz/loader/StubCollageLoader.java index 1dc051b..c70082f 100644 --- a/app/src/main/java/ru/yandex/yamblz/loader/StubCollageLoader.java +++ b/app/src/main/java/ru/yandex/yamblz/loader/StubCollageLoader.java @@ -1,11 +1,40 @@ package ru.yandex.yamblz.loader; +import android.app.Activity; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.DrawableContainer; +import android.util.Log; import android.widget.ImageView; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; import java.util.List; +import java.util.UUID; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import ru.yandex.yamblz.App; +import ru.yandex.yamblz.R; +import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.handler.Task; +import ru.yandex.yamblz.ui.activities.BaseActivity; +import ru.yandex.yamblz.ui.activities.MainActivity; +import ru.yandex.yamblz.ui.fragments.ArtistAdapter; +import ru.yandex.yamblz.ui.fragments.ArtistListFragment; +import ru.yandex.yamblz.ui.fragments.BaseFragment; public class StubCollageLoader implements CollageLoader { + private static final int THREADS = 4; + + public ExecutorService threadPool = Executors.newFixedThreadPool(THREADS); + @Override public void loadCollage(List urls, ImageView imageView) { @@ -20,6 +49,62 @@ public void loadCollage(List urls, ImageTarget imageTarget) { public void loadCollage(List urls, ImageView imageView, CollageStrategy collageStrategy) { + + UUID uuid = UUID.randomUUID(); + Object oldCreateImages = imageView.getTag(); + + + if (oldCreateImages != null) { + CriticalSectionsManager.getHandler().removeLowPriorityTask((Task) oldCreateImages); + } + + Task setter = () -> { + threadPool.execute(() -> { + loadCollage(urls, imageView, collageStrategy, uuid); + }); + }; + imageView.setTag(setter); + imageView.setTag(R.id.recycler_item_image, uuid); + CriticalSectionsManager.getHandler().postLowPriorityTask(setter); + } + + public void loadCollage(List urls, ImageView imageView, + CollageStrategy collageStrategy, UUID uuid) { + Runnable rr = () -> { + List bitmapList = new ArrayList<>(); + int len = 1; + if (urls.size() >= 4) { + len = 4; + } + for (int i = 0; i < len; i++) { + bitmapList.add(getBitmapFromUrl(urls.get(i))); + } + Bitmap bitmap = collageStrategy.create(bitmapList); + if (imageView != null && imageView.getTag(R.id.recycler_item_image).equals(uuid)) { + imageView.post(() -> imageView.setImageBitmap(bitmap)); + } + }; + + threadPool.submit(rr); + + } + + + + public Bitmap getBitmapFromUrl(String link) { + try { + URL url = new URL(link); + HttpURLConnection connection = (HttpURLConnection)url.openConnection(); + connection.setDoInput(true); + connection.connect(); + InputStream input = connection.getInputStream(); + return BitmapFactory.decodeStream(input); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; } @Override @@ -28,4 +113,6 @@ public void loadCollage(List urls, ImageTarget imageTarget, } + + } diff --git a/app/src/main/java/ru/yandex/yamblz/ui/activities/MainActivity.java b/app/src/main/java/ru/yandex/yamblz/ui/activities/MainActivity.java index 3b9efea..f6ba835 100644 --- a/app/src/main/java/ru/yandex/yamblz/ui/activities/MainActivity.java +++ b/app/src/main/java/ru/yandex/yamblz/ui/activities/MainActivity.java @@ -3,6 +3,7 @@ import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; +import android.view.View; import javax.inject.Inject; import javax.inject.Named; @@ -10,7 +11,7 @@ import ru.yandex.yamblz.App; import ru.yandex.yamblz.R; import ru.yandex.yamblz.developer_settings.DeveloperSettingsModule; -import ru.yandex.yamblz.ui.fragments.ContentFragment; +import ru.yandex.yamblz.ui.fragments.ArtistListFragment; import ru.yandex.yamblz.ui.other.ViewModifier; public class MainActivity extends BaseActivity { @@ -27,10 +28,14 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setContentView(viewModifier.modify(getLayoutInflater().inflate(R.layout.activity_main, null))); if (savedInstanceState == null) { - getSupportFragmentManager() - .beginTransaction() - .replace(R.id.main_frame_layout, new ContentFragment()) + getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_layout, new ArtistListFragment()) .commit(); } } + + public void onClick(View v) { + return; + } + + } diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Artist.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Artist.java new file mode 100644 index 0000000..969a1a5 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Artist.java @@ -0,0 +1,129 @@ +package ru.yandex.yamblz.ui.fragments; + +/** + * Created by dan on 28.07.16. + */ + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +public class Artist implements Serializable { + private long id ; + private String name = ""; + private long tracks; + private long albums; + private String link = ""; + private String description = ""; + private List genres; + private String bigImg = ""; + private String smallImg = ""; + private String genresString = ""; + + + public Artist() { + genres = new ArrayList<>(); + } + + public void addGenre(String genre) { + genres.add(genre); + } + + public List getListGenres() { + return genres; + } + + public String getGenres() { + if (genresString.length() > 0) { + return genresString; + } + + StringBuilder concatination = new StringBuilder(); + for(String s: genres) { + if (concatination.length() != 0) { + concatination.append(", "); + } + concatination.append(s); + + } + if (genresString.length() == 0) { + genresString = concatination.toString(); + } + + return concatination.toString(); + } + + public String getInfo() { + return String.valueOf(albums) + " альбомов, " + String.valueOf(tracks) + " песен" ; + } + + + public void setGenresString(String genres) { + genresString = genres; + } + + public void setId(long id) { + this.id = id; + } + + public void setTracks(long tracks) { + this.tracks = tracks; + } + + public void setAlbums(long albums) { + this.albums = albums; + } + + public void setName(String name) { + this.name = name; + } + + public void setDescription(String description) { + this.description = description; + } + + public long getId() { + return this.id; + } + + public long getTracks() { + return this.tracks; + } + + public long getAlbums() { + return this.albums; + } + + public String getName() { + return this.name; + } + + public String getDescription() { + return this.description; + } + + public String getLink() { + return link; + } + + public void setLink(String link) { + this.link = link; + } + + public String getBigImg() { + return bigImg; + } + + public void setBigImg(String bigImg) { + this.bigImg = bigImg; + } + + public String getSmallImg() { + return smallImg; + } + + public void setSmallImg(String smallImg) { + this.smallImg = smallImg; + } +} + diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistAdapter.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistAdapter.java new file mode 100644 index 0000000..01aeb26 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistAdapter.java @@ -0,0 +1,118 @@ +package ru.yandex.yamblz.ui.fragments; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +import android.support.v4.view.PagerAdapter; +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.ImageView; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.List; + + + +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.support.v4.app.FragmentActivity; +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.ImageView; +import android.widget.TextView; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import ru.yandex.yamblz.R; +import ru.yandex.yamblz.handler.CriticalSectionsHandler; +import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.handler.Task; +import ru.yandex.yamblz.loader.CollageLoaderManager; +import ru.yandex.yamblz.loader.CollageStrategyImpl; + +import static android.support.v7.appcompat.R.id.image; + +/** + * Created by danil on 25.04.16. + */ +public class ArtistAdapter extends RecyclerView.Adapter { + + private List mDataset; + private FragmentActivity context; + + public ArtistAdapter(FragmentActivity context) { + mDataset = new ArrayList<>(); + this.context = context; + } + + @Override + public ArtistAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + // create a new view + View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false); + + // change layout's params. here + + ViewHolder vh = new ViewHolder(v); + + return vh; + } + + public void setItems(List items) { + if (mDataset != null) { + int x = mDataset.size(); + mDataset.clear(); + notifyItemRangeRemoved(0, x); + } + if (items != null && mDataset != null) { + mDataset.addAll(items); + notifyItemRangeInserted(0, items.size()); + } + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + holder.genres.setText(mDataset.get(position).getGenre()); + holder.artists.setText(mDataset.get(position).getNames()); + holder.image.setImageDrawable(null); + + + Task createImages = () -> new Thread(() -> { + CollageLoaderManager.getLoader().loadCollage(mDataset.get(position).getImgUrls(), holder.image, new CollageStrategyImpl()); + }).start(); + CriticalSectionsManager.getHandler().postLowPriorityTask(createImages); + + } + + @Override + public int getItemCount() { + return mDataset.size(); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + public TextView genres; + public TextView artists; + public ImageView image; + + public ViewHolder(View v) { + super(v); + genres = (TextView) v.findViewById(R.id.recycler_item_genre); + image = (ImageView) v.findViewById(R.id.recycler_item_image); + artists = (TextView) v.findViewById(R.id.recycler_item_artists); + } + } +} + diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistListFragment.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistListFragment.java new file mode 100644 index 0000000..f165a7f --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ArtistListFragment.java @@ -0,0 +1,183 @@ +package ru.yandex.yamblz.ui.fragments; + +import android.os.AsyncTask; +import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +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.LinearLayout; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import ru.yandex.yamblz.R; +import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.ui.parser.MyJsonParser; + + +public class ArtistListFragment extends BaseFragment { + private DownloadTask downloadTask; + private RecyclerView mRecyclerView; + private ArtistAdapter mAdapter; + private RecyclerView.LayoutManager mLayoutManager; + public List artists; + public List genres; + + + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + artists = new ArrayList<>(); + genres = new ArrayList<>(); + LinearLayout linearLayout = (LinearLayout) inflater.inflate(R.layout.fragment_content, container, false); + + mRecyclerView = (RecyclerView) linearLayout.findViewById(R.id.my_recycler_view); + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { + Log.i("criticalSection", "start"); + CriticalSectionsManager.getHandler().startSection(228); + } else if (newState == RecyclerView.SCROLL_STATE_IDLE) { + Log.i("criticalSection", "stop"); + CriticalSectionsManager.getHandler().stopSection(228); + } + } + }); + mLayoutManager = new LinearLayoutManager(getActivity()); + mRecyclerView.setLayoutManager(mLayoutManager); + mAdapter = new ArtistAdapter(getActivity()); + downloadTask = new DownloadTask(this); + downloadTask.execute(); + + + + mAdapter.setItems(genres); + + /*if (savedInstanceState == null) { + onRetainCustomNonConfigurationInstance(); + } else { + artists = (List) savedInstanceState.getSerializable("listArtist"); + mAdapter.setItems(genres); + }*/ + + mRecyclerView.setAdapter(mAdapter); + return linearLayout; + } + + + + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putSerializable("listArtist", (Serializable) artists); + } + + + public Object onRetainCustomNonConfigurationInstance() { + return downloadTask; + } + + + private enum Result { + INPROGRESS, OK, NOARTIST, ERROR + } + + + + + + + private class DownloadTask extends AsyncTask { + + private ArtistListFragment activity = null; + private Artist artist = null; + private Result result = Result.INPROGRESS; + + public DownloadTask(ArtistListFragment activity) { + this.activity = activity; + } + + public void attachActivity(ArtistListFragment activity) { + this.activity = activity; + publishProgress(); + } + + @Override + protected Result doInBackground(Void... params) { + + Log.i("fxf", "Task started"); + try { + + MyJsonParser parser = new MyJsonParser(); + List list = parser.parse(); + Log.i("zaza", "Artists parsed " + list.size()); + if (list == null) { + result = Result.ERROR; + return result; + } else if (list.size() == 0) { + result = Result.NOARTIST; + return result; + } + artists.addAll(list); + initListGenres(); + + + } catch (Exception e) { + return Result.ERROR; + } + result = Result.OK; + return result; + } + + @Override + protected void onPostExecute(Result res) { + result = res; + updateUI(); + } + + @Override + protected void onProgressUpdate(Void... values) { + updateUI(); + } + + private void updateUI() { + if (result == Result.OK) { + mAdapter.setItems(genres); + } + } + + public void initListGenres() { + int curGunresInt = 0; + Map map = new LinkedHashMap<>(); + for (int i = 0; i < artists.size(); i++) { + List list = artists.get(i).getListGenres(); + for (int j = 0; j < list.size(); j++) { + if (!map.containsKey(list.get(j))){ + map.put(list.get(j), curGunresInt++); + Genre genre = new Genre(); + genre.setGenre(list.get(j)); + genre.addArtist(artists.get(i)); + genres.add(genre); + } else { + genres.get(map.get(list.get(j))).addArtist(artists.get(i)); + } + } + } + } + + } + + + } + + diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/ContentFragment.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ContentFragment.java deleted file mode 100644 index d46490f..0000000 --- a/app/src/main/java/ru/yandex/yamblz/ui/fragments/ContentFragment.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.yandex.yamblz.ui.fragments; - -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import ru.yandex.yamblz.R; - -public class ContentFragment extends BaseFragment { - @NonNull - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_content, container, false); - } -} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre.java new file mode 100644 index 0000000..d9695e1 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre.java @@ -0,0 +1,41 @@ +package ru.yandex.yamblz.ui.fragments; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by dan on 28.07.16. + */ +public class Genre { + private String genre = ""; + private List artists = new ArrayList<>(); + + public void addArtist(Artist artist) { + artists.add(artist); + } + + public String getNames() { + StringBuilder stringBuilder = new StringBuilder(); + for (Artist a: artists) { + stringBuilder.append(a.getName() + ", "); + } + return stringBuilder.toString(); + } + + public List getImgUrls() { + List list = new LinkedList<>(); + for (Artist a: artists) { + list.add(a.getSmallImg()); + } + return list; + } + + public String getGenre() { + return genre; + } + + public void setGenre(String genre) { + this.genre = genre; + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/parser/MyJsonParser.java b/app/src/main/java/ru/yandex/yamblz/ui/parser/MyJsonParser.java new file mode 100644 index 0000000..cb3c35e --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/parser/MyJsonParser.java @@ -0,0 +1,90 @@ +package ru.yandex.yamblz.ui.parser; + +import android.util.Log; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import android.util.Log; + +import org.json.JSONException; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import ru.yandex.yamblz.ui.fragments.Artist; + +/** + * Created by dan on 27.04.16. + */ +public class MyJsonParser { + + + public MyJsonParser() { + + } + + public List parse() throws IOException, URISyntaxException, ParseException { + List list = new ArrayList<>(); + String text = loadJsonString("https://download.cdn.yandex.net/mobilization-2016/artists.json"); + list.addAll(getAllArtists(text)); + return list; + } + + public static String loadJsonString(String url) throws IOException { + BufferedReader input = null; + try { + input = new BufferedReader(new InputStreamReader(new URL(url).openStream(), "UTF-8")); + } catch (IOException e) { + e.printStackTrace(); + } + String s = ""; + StringBuilder concatination = new StringBuilder(); + while ((s = input.readLine()) != null) + concatination.append(s); + return concatination.toString(); + } + + public static List getAllArtists(String text) throws ParseException { + List listOfValues = new ArrayList(); + JSONArray array = (JSONArray) new JSONParser().parse(text); + for (int i = 0; i < array.size(); i++) { + JSONObject obj = (JSONObject) array.get(i); + Artist artist = new Artist(); + artist.setId((Long) obj.get("id")); + artist.setName((String) obj.get("name")); + artist.setTracks((Long) obj.get("tracks")); + artist.setAlbums((Long) obj.get("albums")); + artist.setLink((String) obj.get("link")); + artist.setDescription((String) obj.get("description")); + + JSONArray genres = (JSONArray) obj.get("genres"); + for (int j = 0; j < genres.size(); j++) { + artist.addGenre((String)genres.get(j)); + } + + JSONObject cover = (JSONObject) obj.get("cover"); + artist.setSmallImg((String) cover.get("small")); + artist.setBigImg((String) cover.get("big")); + listOfValues.add(artist); + Log.i("ppc", String.valueOf(i)); + } + return listOfValues; + + } +} + diff --git a/app/src/main/res/layout/fragment_content.xml b/app/src/main/res/layout/fragment_content.xml index 81016ea..61385af 100644 --- a/app/src/main/res/layout/fragment_content.xml +++ b/app/src/main/res/layout/fragment_content.xml @@ -1,14 +1,15 @@ - + - - - \ No newline at end of file + android:background="#f2d9f9"/> + \ No newline at end of file diff --git a/app/src/main/res/layout/recycler_item.xml b/app/src/main/res/layout/recycler_item.xml new file mode 100644 index 0000000..588acbf --- /dev/null +++ b/app/src/main/res/layout/recycler_item.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle index d9cb375..d340e7b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,7 +7,7 @@ ext.versions = [ compileSdk : 23, buildTools : '23.0.3', - androidGradlePlugin : '2.2.0-alpha4', + androidGradlePlugin : '2.2.0-alpha6', aptGradlePlugin : '1.8', retrolambdaGradlePlugin : '3.2.5', lombokGradlePlugin : '0.2.3.a2',