From 4054e192647c3424cd0f28d456c29b6229d13bdb Mon Sep 17 00:00:00 2001 From: Iurii Lutsenko Date: Sat, 16 Jul 2016 17:58:06 +0300 Subject: [PATCH 01/11] =?UTF-8?q?=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= =?UTF-8?q?=20=D0=BE=D0=B1=20=D0=B0=D1=80=D1=82=D0=B8=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D1=85=20=D0=B8=20ListOfArtistActivityFr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/yamsd/ArtistActivityFragment.java | 1 - .../example/android/yamsd/ArtistsCache.java | 101 ++++++++++++++++-- .../android/yamsd/CacheAndListBuffer.java | 64 +++++++++++ .../{SmallImageCache.java => ImageCache.java} | 6 +- .../yamsd/ListOfArtistsActivityFragment.java | 101 +----------------- .../android/yamsd/ListOfArtistsAdapter.java | 8 +- .../com/example/android/yamsd/Utility.java | 6 +- build.gradle | 2 +- 8 files changed, 176 insertions(+), 113 deletions(-) create mode 100644 app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java rename app/src/main/java/com/example/android/yamsd/{SmallImageCache.java => ImageCache.java} (89%) diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java index 3dc9d69..d93a35f 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java @@ -22,7 +22,6 @@ public class ArtistActivityFragment extends Fragment { private String LOG_TAG = getClass().getSimpleName(); - public ArtistActivityFragment() { } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistsCache.java b/app/src/main/java/com/example/android/yamsd/ArtistsCache.java index 2106c7a..be93a30 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistsCache.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistsCache.java @@ -1,7 +1,9 @@ package com.example.android.yamsd; import android.content.Context; +import android.os.AsyncTask; import android.util.Log; +import android.widget.Toast; import com.example.android.yamsd.ArtistsData.Artist; @@ -13,22 +15,34 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; /** - * Кэш для хранения списка артистов в формате json + * Кэш для хранения списка артистов * Загрузка из файла реализована исключительно из соображений простоты реализации */ public class ArtistsCache { private String LOG_TAG = getClass().getSimpleName(); + private String siteWithArtists = + "http://cache-default01e.cdn.yandex.net/" + + "download.cdn.yandex.net/mobilization-2016/artists.json"; private String cacheFileName = "artistsDownloaded"; + private File cacheFile; private Context context; - File cacheFile; - String artistsJsonFormat = null; + private String artistsJsonFormat = null; + private ArrayList artists = null; - public ArtistsCache(Context context) { + private CacheAndListBuffer cacheAndListBuffer; + + + public ArtistsCache( + Context context, + CacheAndListBuffer cacheAndListBuffer + ) { try { this.context = context; cacheFile = new File(context.getFilesDir(), cacheFileName); @@ -46,6 +60,9 @@ public ArtistsCache(Context context) { } cacheFile.createNewFile(); + + this.cacheAndListBuffer = cacheAndListBuffer; + } catch (IOException e) { Log.e(LOG_TAG, "Some troubles at constructor: " + e); } @@ -134,10 +151,82 @@ public boolean notExistsOrEmpty() { } - public Artist[] getArtistsFromCache() { + public void updateArtists() { + if (notExistsOrEmpty()) { + downloadArtistsFromCloud(); + } else { + artists = downloadArtistsFromCache(); + Log.v(LOG_TAG, "Loaded from cache"); + } + } + + + public void downloadArtistsFromCloud() { + //Костыль, срабатывающий при самом первом запуске приложения + //Будет загрузка из данной ниже json-строки, а не из интернета + //или кэша + artists = Utility.getArtists("[{\n" + + " \"id\": -1,\n" + + " \"name\": \"Идет загрузка артистов\",\n" + + " \"genres\": [\n" + + " \"Пожалуйста, подождите\"\n" + + " ],\n" + + " \"tracks\": 0,\n" + + " \"albums\": 0,\n" + + " \"link\": \"\",\n" + + " \"description\": \"Nothing to say\",\n" + + " \"cover\": {\n" + + " \"small\": \"http://avatars.yandex.net/get-music-content/dfc531f5.p.1080505/300x300\",\n" + + " \"big\": \"http://avatars.yandex.net/get-music-content/dfc531f5.p.1080505/300x300\"\n" + + " }\n" + + " }]" + ); + Toast.makeText(context, "Обновление...", Toast.LENGTH_SHORT).show(); + new ArtistsLoadingTask().execute(siteWithArtists); + Log.v(LOG_TAG, "Loaded from internet"); + } + + + public ArrayList downloadArtistsFromCache() { if (artistsJsonFormat == null) { readFromCache(); + } else { + artists = Utility.getArtists(artistsJsonFormat); + } + return artists; + } + + + public ArrayList getArtists() { + return artists; + } + + + private class ArtistsLoadingTask extends AsyncTask { + private final String LOG_TAG = getClass().getSimpleName(); + + @Override + protected String doInBackground(String... params) { + try { + return (String) Utility.downloadData(new URL(params[0]), "json"); + } catch (IOException e) { + Log.e(LOG_TAG, "IOException: " + e); + return null; + } } - return Utility.getArtists(artistsJsonFormat); + + + @Override + protected void onPostExecute(String result) { + super.onPostExecute(result); + + if (result != null) { + artists = Utility.getArtists(result); + writeToCache(result); + } + + cacheAndListBuffer.updateArtistsViewAdapter(artists); + } + } } diff --git a/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java b/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java new file mode 100644 index 0000000..1123406 --- /dev/null +++ b/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java @@ -0,0 +1,64 @@ +package com.example.android.yamsd; + +import android.app.Activity; +import android.content.Context; + +import com.example.android.yamsd.ArtistsData.Artist; + +import java.util.ArrayList; + +/** + * Вспомогательный класс, обеспечивающий связь между + * ListOfArtistsActivityFragment и хранилищем артистов + */ +public class CacheAndListBuffer { + + private ListOfArtistsAdapter listOfArtistsAdapter; + private ArtistsCache artistsCache; + + + public CacheAndListBuffer(Context context, Activity activity) { + + //Создание списка артистов + artistsCache = new ArtistsCache(context, this); + artistsCache.updateArtists(); + + listOfArtistsAdapter = + new ListOfArtistsAdapter( + activity, + R.layout.single_artist_in_list, + R.id.single_artist_in_list, + artistsCache.getArtists() + ); + } + + + public void updateArtistsViewAdapter(ArrayList artists) { + listOfArtistsAdapter.clear(); + for (Artist artist : artists) { + listOfArtistsAdapter.add(artist); + } + + listOfArtistsAdapter.notifyDataSetChanged(); + } + + + public ListOfArtistsAdapter getListOfArtistsAdapter() { + return listOfArtistsAdapter; + } + + + public ArtistsCache getArtistsCache() { + return artistsCache; + } + + + public void updateArtists(boolean downloadArtists) { + if (downloadArtists) { + artistsCache.downloadArtistsFromCloud(); + } else { + artistsCache.updateArtists(); + } + } + +} diff --git a/app/src/main/java/com/example/android/yamsd/SmallImageCache.java b/app/src/main/java/com/example/android/yamsd/ImageCache.java similarity index 89% rename from app/src/main/java/com/example/android/yamsd/SmallImageCache.java rename to app/src/main/java/com/example/android/yamsd/ImageCache.java index 41846b9..2e42288 100644 --- a/app/src/main/java/com/example/android/yamsd/SmallImageCache.java +++ b/app/src/main/java/com/example/android/yamsd/ImageCache.java @@ -7,7 +7,7 @@ /** * Кэш для сохранения маленьких картинок. */ -public class SmallImageCache { +public class ImageCache { private String LOG_TAG = getClass().getSimpleName(); @@ -17,7 +17,7 @@ public class SmallImageCache { final int cacheSize = maxMemory / 8; - public SmallImageCache() { + public ImageCache() { stringBitmapLruCache = new LruCache(cacheSize) { @Override @@ -28,7 +28,7 @@ protected int sizeOf(String key, Bitmap bitmap) { } - public void addBitmapToMemoryCache(String key, Bitmap bitmap) { + public void addBitmapToMemCache(String key, Bitmap bitmap) { try { if (getBitmapFromMemCache(key) == null) { stringBitmapLruCache.put(key, bitmap); diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java index 971da68..7a89532 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java @@ -1,10 +1,8 @@ package com.example.android.yamsd; import android.content.Intent; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -13,30 +11,16 @@ import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; -import android.widget.Toast; import com.example.android.yamsd.ArtistsData.Artist; -import java.io.IOException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; - /** * Фрагмент со списком артистов */ public class ListOfArtistsActivityFragment extends Fragment { private final String LOG_TAG = getClass().getSimpleName(); - private Artist[] artists = null; - private ListOfArtistsAdapter listOfArtistsAdapter; - - private String siteWithArtists = - "http://cache-default01e.cdn.yandex.net/" + - "download.cdn.yandex.net/mobilization-2016/artists.json"; - - private ArtistsCache artistsCache = null; - + private CacheAndListBuffer cacheAndListBuffer; public ListOfArtistsActivityFragment() { } @@ -58,7 +42,7 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.action_refresh) { - updateArtists(true); + cacheAndListBuffer.updateArtists(true); return true; } return super.onOptionsItemSelected(item); @@ -72,27 +56,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, View listOfArtistsView = inflater.inflate(R.layout.fragment_list_of_artists, container, false); - //Создание списка артистов - artistsCache = new ArtistsCache(getContext()); - updateArtists(artistsCache.notExistsOrEmpty()); - - ArrayList artistsList = new ArrayList<>(Arrays.asList(artists)); - listOfArtistsAdapter = - new ListOfArtistsAdapter( - getActivity(), - R.layout.single_artist_in_list, - R.id.single_artist_in_list, - artistsList - ); + cacheAndListBuffer = new CacheAndListBuffer(getContext(), getActivity()); //Создание ListView, на элементы которой можно нажимать ListView listView = (ListView) listOfArtistsView.findViewById(R.id.artists_list); - listView.setAdapter(listOfArtistsAdapter); + listView.setAdapter(cacheAndListBuffer.getListOfArtistsAdapter()); listView.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - Artist artist = artists[position]; + Artist artist = cacheAndListBuffer.getArtistsCache().getArtists().get(position); startActivity(createIntent(artist)); } } @@ -119,68 +92,4 @@ private Intent createIntent(Artist artist) { return artistInfoIntent; } - - private void updateArtists(boolean refreshModeOn) { - if (refreshModeOn) { - //Костыль, срабатывающий при самом первом запуске приложения - //Будет загрузка из данной ниже json-строки, а не из интернета - //или кэша - artists = Utility.getArtists("[{\n" + - " \"id\": 0,\n" + - " \"name\": \"0\",\n" + - " \"genres\": [\n" + - " \"rnb\"\n" + - " ],\n" + - " \"tracks\": 0,\n" + - " \"albums\": 0,\n" + - " \"link\": \"\",\n" + - " \"description\": \"Nothing to say\",\n" + - " \"cover\": {\n" + - " \"small\": \"http://avatars.yandex.net/get-music-content/dfc531f5.p.1080505/300x300\",\n" + - " \"big\": \"http://avatars.yandex.net/get-music-content/dfc531f5.p.1080505/300x300\"\n" + - " }\n" + - " }]"); - Toast.makeText(getContext(), "Обновление...", Toast.LENGTH_SHORT).show(); - new ArtistsLoadingTask().execute(siteWithArtists); - Log.v(LOG_TAG, "Loaded from internet"); - } else { - artists = - artistsCache.getArtistsFromCache(); - Log.v(LOG_TAG, "Loaded from cache"); - } - } - - - private class ArtistsLoadingTask extends AsyncTask { - private final String LOG_TAG = getClass().getSimpleName(); - - @Override - protected String doInBackground(String... params) { - try { - return (String) Utility.downloadData(new URL(params[0]), "json"); - } catch (IOException e) { - Log.e(LOG_TAG, "IOException: " + e); - return null; - } - } - - - @Override - protected void onPostExecute(String result) { - super.onPostExecute(result); - artists = Utility.getArtists(result); - - if (result != null) { - - listOfArtistsAdapter.clear(); - for (Artist artist : artists) { - listOfArtistsAdapter.add(artist); - } - - artistsCache.writeToCache(result); - } - listOfArtistsAdapter.notifyDataSetChanged(); - } - - } } diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java index 664397f..4a127e8 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java @@ -25,7 +25,7 @@ public class ListOfArtistsAdapter extends ArrayAdapter { private Context context; private ArrayList artists; - private SmallImageCache smallImageCache = null; + private ImageCache imageCache = null; public ListOfArtistsAdapter( @@ -38,7 +38,7 @@ public ListOfArtistsAdapter( this.context = context; this.artists = artists; - smallImageCache = new SmallImageCache(); + imageCache = new ImageCache(); } @@ -102,13 +102,13 @@ protected Bitmap doInBackground(Artist... params) { artist = params[0]; Bitmap bitmap = - smallImageCache.getBitmapFromMemCache(String.valueOf(artist.getId())); + imageCache.getBitmapFromMemCache(String.valueOf(artist.getId())); if (bitmap == null) { bitmap = (Bitmap) Utility.downloadData( new URL(params[0].getSmallCoverUrlString()), "bitmap" ); - smallImageCache.addBitmapToMemoryCache(String.valueOf(artist.getId()), bitmap); + imageCache.addBitmapToMemCache(String.valueOf(artist.getId()), bitmap); } return bitmap; diff --git a/app/src/main/java/com/example/android/yamsd/Utility.java b/app/src/main/java/com/example/android/yamsd/Utility.java index b51da2e..9feb6d8 100644 --- a/app/src/main/java/com/example/android/yamsd/Utility.java +++ b/app/src/main/java/com/example/android/yamsd/Utility.java @@ -16,6 +16,8 @@ import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; /** * Вспомогательный класс, созданный для вынесения повторяющихся функций @@ -165,7 +167,7 @@ public static String readJsonString(InputStream jsonStream) } - public static Artist[] getArtists(String jsonString) { + public static ArrayList getArtists(String jsonString) { try { JSONArray jsonArtists = new JSONArray(jsonString); @@ -175,7 +177,7 @@ public static Artist[] getArtists(String jsonString) { artistsList[i] = new Artist(jsonArtists.getJSONObject(i)); } - return artistsList; + return new ArrayList<>(Arrays.asList(artistsList)); } catch (JSONException e) { Log.e(LOG_TAG, "Incorrect JSON: " + e); } catch (NullPointerException e) { diff --git a/build.gradle b/build.gradle index 168f129..aff4f41 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:2.1.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From 59f6219c26426827c95782f16559589a30c7cb06 Mon Sep 17 00:00:00 2001 From: Iurii Lutsenko Date: Sun, 17 Jul 2016 15:40:20 +0300 Subject: [PATCH 02/11] =?UTF-8?q?=D0=9A=D1=8D=D1=88=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + .../example/android/yamsd/ArtistActivity.java | 8 +- .../android/yamsd/ArtistActivityFragment.java | 64 ++------- .../example/android/yamsd/ArtistsCache.java | 19 ++- .../android/yamsd/CacheAndListBuffer.java | 7 +- .../com/example/android/yamsd/ImageCache.java | 45 ------- .../example/android/yamsd/ImageStorage.java | 125 ++++++++++++++++++ .../yamsd/ListOfArtistsActivityFragment.java | 19 +-- .../android/yamsd/ListOfArtistsAdapter.java | 55 +------- .../com/example/android/yamsd/Utility.java | 14 +- 10 files changed, 174 insertions(+), 183 deletions(-) delete mode 100644 app/src/main/java/com/example/android/yamsd/ImageCache.java create mode 100644 app/src/main/java/com/example/android/yamsd/ImageStorage.java diff --git a/app/build.gradle b/app/build.gradle index a0866c0..1a71aa8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,4 +30,5 @@ dependencies { compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' + compile 'com.android.volley:volley:1.0.0' } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivity.java b/app/src/main/java/com/example/android/yamsd/ArtistActivity.java index 00dd0e9..885c979 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivity.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistActivity.java @@ -22,7 +22,13 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle(getIntent().getStringExtra("name")); + getSupportActionBar().setTitle( + ArtistsCache + .getInstance(getApplicationContext(), null) + .getArtists() + .get(getIntent().getIntExtra("position", 0)) + .getName() + ); } catch (NullPointerException e) { Log.e(LOG_TAG, "Null pointer: " + e); } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java index d93a35f..d29810e 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java @@ -1,8 +1,6 @@ package com.example.android.yamsd; import android.content.Intent; -import android.graphics.Bitmap; -import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; @@ -11,9 +9,6 @@ import android.view.ViewGroup; import com.example.android.yamsd.ArtistsData.Artist; - -import java.io.IOException; -import java.net.URL; /** * Фрагмент с информацией об одном артисте. */ @@ -34,18 +29,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Intent artistInfoIntent = getActivity().getIntent(); Artist artist = - new Artist( - artistInfoIntent.getStringExtra("name"), - - artistInfoIntent.getStringArrayExtra("genres"), - - artistInfoIntent.getIntExtra("albums", 0), - artistInfoIntent.getIntExtra("tracks", 0), - - artistInfoIntent.getStringExtra("description"), - - artistInfoIntent.getStringExtra("bigCover") - ); + ArtistsCache + .getInstance(getContext(), null) + .getArtists() + .get( + artistInfoIntent.getIntExtra("position", 0) + ); return loadArtistData(artist, inflater).getRootView(); } catch (NullPointerException e) { @@ -69,48 +58,11 @@ private ArtistViewHolder loadArtistData( "Artist", artist ); - new loadBigCoverTask(viewHolder).execute(artist); + + ImageStorage.getInstance(getContext()).getImage(artist, viewHolder, "big"); return viewHolder; } - private class loadBigCoverTask - extends AsyncTask { - private String LOG_TAG = getClass().getSimpleName(); - - Artist artist; - ArtistViewHolder viewHolder; - - - public loadBigCoverTask(ArtistViewHolder viewHolder) { - this.viewHolder = viewHolder; - } - - - @Override - protected Bitmap doInBackground(Artist... params) { - try { - artist = params[0]; - - return (Bitmap) Utility.downloadData( - new URL(params[0].getBigCoverUrlString()), - "bitmap" - ); - - } catch (IOException e) { - Log.e(LOG_TAG, "Error while loading image: " + e); - } catch (NullPointerException e){ - Log.e(LOG_TAG, "Null pointer while loading image: " + e); - } - - return null; - } - - - @Override - protected void onPostExecute(Bitmap bitmap) { - viewHolder.setCoverBitmap(bitmap); - } - } } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistsCache.java b/app/src/main/java/com/example/android/yamsd/ArtistsCache.java index be93a30..6e26e2e 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistsCache.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistsCache.java @@ -23,6 +23,9 @@ * Загрузка из файла реализована исключительно из соображений простоты реализации */ public class ArtistsCache { + + private static ArtistsCache artistsCache = null; + private String LOG_TAG = getClass().getSimpleName(); private String siteWithArtists = @@ -39,7 +42,7 @@ public class ArtistsCache { private CacheAndListBuffer cacheAndListBuffer; - public ArtistsCache( + private ArtistsCache( Context context, CacheAndListBuffer cacheAndListBuffer ) { @@ -69,6 +72,18 @@ public ArtistsCache( } + public synchronized static ArtistsCache getInstance( + Context context, + CacheAndListBuffer cacheAndListBuffer + ) { + if (artistsCache == null) { + artistsCache = new ArtistsCache(context, cacheAndListBuffer); + } + + return artistsCache; + } + + public void writeToCache(String string) { Log.v(LOG_TAG, "Writing to cache"); FileOutputStream outputStream = null; @@ -208,7 +223,7 @@ private class ArtistsLoadingTask extends AsyncTask { @Override protected String doInBackground(String... params) { try { - return (String) Utility.downloadData(new URL(params[0]), "json"); + return (String) Utility.downloadData(new URL(params[0])); } catch (IOException e) { Log.e(LOG_TAG, "IOException: " + e); return null; diff --git a/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java b/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java index 1123406..b9401f8 100644 --- a/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java +++ b/app/src/main/java/com/example/android/yamsd/CacheAndListBuffer.java @@ -20,7 +20,7 @@ public class CacheAndListBuffer { public CacheAndListBuffer(Context context, Activity activity) { //Создание списка артистов - artistsCache = new ArtistsCache(context, this); + artistsCache = ArtistsCache.getInstance(context, this); artistsCache.updateArtists(); listOfArtistsAdapter = @@ -61,4 +61,9 @@ public void updateArtists(boolean downloadArtists) { } } + + public ArrayList getArtists() { + return artistsCache.getArtists(); + } + } diff --git a/app/src/main/java/com/example/android/yamsd/ImageCache.java b/app/src/main/java/com/example/android/yamsd/ImageCache.java deleted file mode 100644 index 2e42288..0000000 --- a/app/src/main/java/com/example/android/yamsd/ImageCache.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.example.android.yamsd; - -import android.graphics.Bitmap; -import android.util.Log; -import android.util.LruCache; - -/** - * Кэш для сохранения маленьких картинок. - */ -public class ImageCache { - - private String LOG_TAG = getClass().getSimpleName(); - - private LruCache stringBitmapLruCache; - - final int maxMemory = (int) (Runtime.getRuntime().maxMemory()) / 1024; - final int cacheSize = maxMemory / 8; - - - public ImageCache() { - - stringBitmapLruCache = new LruCache(cacheSize) { - @Override - protected int sizeOf(String key, Bitmap bitmap) { - return bitmap.getByteCount() / 1024; - } - }; - } - - - public void addBitmapToMemCache(String key, Bitmap bitmap) { - try { - if (getBitmapFromMemCache(key) == null) { - stringBitmapLruCache.put(key, bitmap); - } - } catch (NullPointerException e) { - Log.e(LOG_TAG, "Unable to load image to cache"); - } - } - - - public Bitmap getBitmapFromMemCache(String key) { - return stringBitmapLruCache.get(key); - } -} diff --git a/app/src/main/java/com/example/android/yamsd/ImageStorage.java b/app/src/main/java/com/example/android/yamsd/ImageStorage.java new file mode 100644 index 0000000..4e78994 --- /dev/null +++ b/app/src/main/java/com/example/android/yamsd/ImageStorage.java @@ -0,0 +1,125 @@ +package com.example.android.yamsd; + +import android.content.Context; +import android.graphics.Bitmap; +import android.support.v4.util.LruCache; +import android.widget.ImageView; + +import com.android.volley.Network; +import com.android.volley.Request; +import com.android.volley.RequestQueue; +import com.android.volley.Response; +import com.android.volley.VolleyError; +import com.android.volley.toolbox.BasicNetwork; +import com.android.volley.toolbox.HurlStack; +import com.android.volley.toolbox.ImageLoader; +import com.android.volley.toolbox.ImageRequest; +import com.android.volley.toolbox.Volley; +import com.example.android.yamsd.ArtistsData.Artist; + +/** + * Кэш для сохранения картинок. + */ +public class ImageStorage { + + private static ImageStorage instance = null; + + private String LOG_TAG = getClass().getSimpleName(); + + private final Context context; + private Network network = new BasicNetwork(new HurlStack()); + + private RequestQueue requestQueue; + private ImageLoader imageLoader; + private static final int CACHE_SIZE = 100; + + public synchronized static ImageStorage getInstance(Context context) { + if (instance == null) { + instance = new ImageStorage(context); + } + + return instance; + } + + + private ImageStorage(Context context) { + + this.context = context; + + requestQueue = getRequestQueue(); + + imageLoader = new ImageLoader( + requestQueue, + new ImageLoader.ImageCache() { + private final LruCache cache = + new LruCache<>(CACHE_SIZE); + + @Override + public Bitmap getBitmap(String url) { + return cache.get(url); + } + + @Override + public void putBitmap(String url, Bitmap bitmap) { + cache.put(url, bitmap); + } + } + ); + } + + + public RequestQueue getRequestQueue() { + if (requestQueue == null) { + requestQueue = Volley.newRequestQueue(context.getApplicationContext()); + } + return requestQueue; + } + + + public void addToRequestQueue(Request request) { + getRequestQueue().add(request); + } + + + public ImageLoader getImageLoader() { + return imageLoader; + } + + + public void getImage( + Artist artist, + final ArtistViewHolder viewHolder, + + String sizeOfImage + ) { + ImageRequest imageRequest = + new ImageRequest( + sizeOfImage.equals("big") ? + artist.getBigCoverUrlString() : + artist.getSmallCoverUrlString(), + + new Response.Listener() { + @Override + public void onResponse(Bitmap response) { + viewHolder.cover.setImageBitmap(response); + } + }, + + 0, + 0, + + ImageView.ScaleType.CENTER_CROP, + null, + + new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + viewHolder.cover.setImageResource(R.drawable.dummy_image); + } + } + ); + + this.addToRequestQueue(imageRequest); + } + +} diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java index 7a89532..7ae7492 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java @@ -12,8 +12,6 @@ import android.widget.AdapterView; import android.widget.ListView; -import com.example.android.yamsd.ArtistsData.Artist; - /** * Фрагмент со списком артистов */ @@ -65,8 +63,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - Artist artist = cacheAndListBuffer.getArtistsCache().getArtists().get(position); - startActivity(createIntent(artist)); + startActivity(createIntent(position)); } } ); @@ -75,19 +72,9 @@ public void onItemClick(AdapterView parent, View view, int position, long id) } - private Intent createIntent(Artist artist) { + private Intent createIntent(int position) { Intent artistInfoIntent = new Intent(getActivity(), ArtistActivity.class); - - artistInfoIntent.putExtra("id", artist.getId()); - artistInfoIntent.putExtra("name", artist.getName()); - - artistInfoIntent.putExtra("genres", artist.getGenres()); - artistInfoIntent.putExtra("tracks", artist.getTracksCount()); - artistInfoIntent.putExtra("albums", artist.getAlbumsCount()); - - artistInfoIntent.putExtra("description", artist.getDescription()); - - artistInfoIntent.putExtra("bigCover", artist.getBigCoverUrlString()); + artistInfoIntent.putExtra("position", position); return artistInfoIntent; } diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java index 4a127e8..baabcf5 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java @@ -1,8 +1,6 @@ package com.example.android.yamsd; import android.content.Context; -import android.graphics.Bitmap; -import android.os.AsyncTask; import android.util.Log; import android.view.LayoutInflater; import android.view.View; @@ -11,8 +9,6 @@ import com.example.android.yamsd.ArtistsData.Artist; -import java.io.IOException; -import java.net.URL; import java.util.ArrayList; /** @@ -25,7 +21,6 @@ public class ListOfArtistsAdapter extends ArrayAdapter { private Context context; private ArrayList artists; - private ImageCache imageCache = null; public ListOfArtistsAdapter( @@ -38,7 +33,6 @@ public ListOfArtistsAdapter( this.context = context; this.artists = artists; - imageCache = new ImageCache(); } @@ -71,59 +65,16 @@ public View getView(int position, View convertView, ViewGroup parent) { private ArtistViewHolder loadListItem(Artist artist) { - ArtistViewHolder viewHolder = + final ArtistViewHolder viewHolder = new ArtistViewHolder( LayoutInflater.from(context), "ListOfArtists", artist ); - new loadSmallCoverTask(viewHolder).execute(artist); - return viewHolder; - } - - - private class loadSmallCoverTask - extends AsyncTask { - private String LOG_TAG = getClass().getSimpleName(); - - Artist artist; - ArtistViewHolder viewHolder; - - public loadSmallCoverTask(ArtistViewHolder viewHolder) { - this.viewHolder = viewHolder; - } - - - @Override - protected Bitmap doInBackground(Artist... params) { + ImageStorage.getInstance(context).getImage(artist, viewHolder, "small"); - try { - artist = params[0]; - - Bitmap bitmap = - imageCache.getBitmapFromMemCache(String.valueOf(artist.getId())); - if (bitmap == null) { - bitmap = (Bitmap) Utility.downloadData( - new URL(params[0].getSmallCoverUrlString()), - "bitmap" - ); - imageCache.addBitmapToMemCache(String.valueOf(artist.getId()), bitmap); - } - - return bitmap; - } catch (IOException e) { - Log.e(LOG_TAG, "Error while loading image: " + e); - } - - return null; - } - - - @Override - protected void onPostExecute(Bitmap bitmap) { - viewHolder.setCoverBitmap(bitmap); - } + return viewHolder; } diff --git a/app/src/main/java/com/example/android/yamsd/Utility.java b/app/src/main/java/com/example/android/yamsd/Utility.java index 9feb6d8..e0edce7 100644 --- a/app/src/main/java/com/example/android/yamsd/Utility.java +++ b/app/src/main/java/com/example/android/yamsd/Utility.java @@ -1,6 +1,5 @@ package com.example.android.yamsd; -import android.graphics.BitmapFactory; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -105,13 +104,13 @@ public static String getGenresAsSingleString(String[] genres) { } - //Функция для загрузки данных (картинок или списка исполнителей) из интернета - public static Object downloadData(URL pageWithData, String dataType) + //Функция для загрузки списка исполнителей из интернета + public static String downloadData(URL pageWithData) throws IOException { HttpURLConnection httpURLConnection = (HttpURLConnection)pageWithData.openConnection(); InputStream inputStream = null; - Object data = null; + String data = null; try { @@ -125,12 +124,7 @@ public static Object downloadData(URL pageWithData, String dataType) Log.v(LOG_TAG, "Response code: " + response); inputStream = httpURLConnection.getInputStream(); - //Сохранение - if (dataType.equals("bitmap")) { - data = BitmapFactory.decodeStream(inputStream); - } else if (dataType.equals("json")) { - data = readJsonString(inputStream); - } + data = readJsonString(inputStream); } finally { if (httpURLConnection != null) { httpURLConnection.disconnect(); From 0e6439c098cad5545779d4d354af0ba6dc279315 Mon Sep 17 00:00:00 2001 From: Iurii Lutsenko Date: Sun, 17 Jul 2016 18:48:56 +0300 Subject: [PATCH 03/11] =?UTF-8?q?=D0=9A=D1=8D=D1=88=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=81=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BC=D0=BE=D1=89=D1=8C=D1=8E=20Picasso?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +- .../android/yamsd/ArtistActivityFragment.java | 7 +- .../android/yamsd/ArtistViewHolder.java | 6 - .../example/android/yamsd/ImageStorage.java | 125 ------------------ .../android/yamsd/ListOfArtistsActivity.java | 5 + .../android/yamsd/ListOfArtistsAdapter.java | 6 +- 6 files changed, 18 insertions(+), 134 deletions(-) delete mode 100644 app/src/main/java/com/example/android/yamsd/ImageStorage.java diff --git a/app/build.gradle b/app/build.gradle index 1a71aa8..1fc3ed0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,5 +30,6 @@ dependencies { compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:23.2.1' - compile 'com.android.volley:volley:1.0.0' + compile 'com.squareup.picasso:picasso:2.5.2' + } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java index d29810e..1852649 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java @@ -9,6 +9,8 @@ import android.view.ViewGroup; import com.example.android.yamsd.ArtistsData.Artist; +import com.squareup.picasso.Picasso; + /** * Фрагмент с информацией об одном артисте. */ @@ -59,7 +61,10 @@ private ArtistViewHolder loadArtistData( artist ); - ImageStorage.getInstance(getContext()).getImage(artist, viewHolder, "big"); + Picasso + .with(getContext()) + .load(artist.getBigCoverUrlString()) + .into(viewHolder.cover); return viewHolder; } diff --git a/app/src/main/java/com/example/android/yamsd/ArtistViewHolder.java b/app/src/main/java/com/example/android/yamsd/ArtistViewHolder.java index 4a394f0..7024f84 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistViewHolder.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistViewHolder.java @@ -1,6 +1,5 @@ package com.example.android.yamsd; -import android.graphics.Bitmap; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; @@ -92,9 +91,4 @@ private void inflateViews(int layoutId) { public View getRootView() { return rootView; } - - - public void setCoverBitmap(Bitmap coverBitmap) { - cover.setImageBitmap(coverBitmap); - } } diff --git a/app/src/main/java/com/example/android/yamsd/ImageStorage.java b/app/src/main/java/com/example/android/yamsd/ImageStorage.java deleted file mode 100644 index 4e78994..0000000 --- a/app/src/main/java/com/example/android/yamsd/ImageStorage.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.example.android.yamsd; - -import android.content.Context; -import android.graphics.Bitmap; -import android.support.v4.util.LruCache; -import android.widget.ImageView; - -import com.android.volley.Network; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.Response; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.BasicNetwork; -import com.android.volley.toolbox.HurlStack; -import com.android.volley.toolbox.ImageLoader; -import com.android.volley.toolbox.ImageRequest; -import com.android.volley.toolbox.Volley; -import com.example.android.yamsd.ArtistsData.Artist; - -/** - * Кэш для сохранения картинок. - */ -public class ImageStorage { - - private static ImageStorage instance = null; - - private String LOG_TAG = getClass().getSimpleName(); - - private final Context context; - private Network network = new BasicNetwork(new HurlStack()); - - private RequestQueue requestQueue; - private ImageLoader imageLoader; - private static final int CACHE_SIZE = 100; - - public synchronized static ImageStorage getInstance(Context context) { - if (instance == null) { - instance = new ImageStorage(context); - } - - return instance; - } - - - private ImageStorage(Context context) { - - this.context = context; - - requestQueue = getRequestQueue(); - - imageLoader = new ImageLoader( - requestQueue, - new ImageLoader.ImageCache() { - private final LruCache cache = - new LruCache<>(CACHE_SIZE); - - @Override - public Bitmap getBitmap(String url) { - return cache.get(url); - } - - @Override - public void putBitmap(String url, Bitmap bitmap) { - cache.put(url, bitmap); - } - } - ); - } - - - public RequestQueue getRequestQueue() { - if (requestQueue == null) { - requestQueue = Volley.newRequestQueue(context.getApplicationContext()); - } - return requestQueue; - } - - - public void addToRequestQueue(Request request) { - getRequestQueue().add(request); - } - - - public ImageLoader getImageLoader() { - return imageLoader; - } - - - public void getImage( - Artist artist, - final ArtistViewHolder viewHolder, - - String sizeOfImage - ) { - ImageRequest imageRequest = - new ImageRequest( - sizeOfImage.equals("big") ? - artist.getBigCoverUrlString() : - artist.getSmallCoverUrlString(), - - new Response.Listener() { - @Override - public void onResponse(Bitmap response) { - viewHolder.cover.setImageBitmap(response); - } - }, - - 0, - 0, - - ImageView.ScaleType.CENTER_CROP, - null, - - new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - viewHolder.cover.setImageResource(R.drawable.dummy_image); - } - } - ); - - this.addToRequestQueue(imageRequest); - } - -} diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java index 1373385..0822b85 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java @@ -1,5 +1,6 @@ package com.example.android.yamsd; +import android.app.FragmentManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -11,8 +12,12 @@ public class ListOfArtistsActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list_of_artists); + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); + + FragmentManager fragmentManager = getFragmentManager(); + } diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java index baabcf5..8eba44f 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsAdapter.java @@ -8,6 +8,7 @@ import android.widget.ArrayAdapter; import com.example.android.yamsd.ArtistsData.Artist; +import com.squareup.picasso.Picasso; import java.util.ArrayList; @@ -72,7 +73,10 @@ private ArtistViewHolder loadListItem(Artist artist) { artist ); - ImageStorage.getInstance(context).getImage(artist, viewHolder, "small"); + Picasso + .with(context) + .load(artist.getSmallCoverUrlString()) + .into(viewHolder.cover); return viewHolder; } From 4dec61b007150d2ca3050980c25bdf6f3500f01c Mon Sep 17 00:00:00 2001 From: Iurii Lutsenko Date: Mon, 18 Jul 2016 01:12:47 +0300 Subject: [PATCH 04/11] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=B8=D1=82=D0=B8=20=D1=81=20?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=B8=D1=81=D1=82=D0=BE=D0=BC,=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=84=D1=80=D0=B0?= =?UTF-8?q?=D0=B3=D0=BC=D0=B5=D0=BD=D1=82=20"=D0=9E=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D0=B5"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 7 +- app/src/main/AndroidManifest.xml | 9 -- .../java/com/example/android/yamsd/About.java | 108 ++++++++++++++++++ .../example/android/yamsd/ArtistActivity.java | 37 ------ .../android/yamsd/ArtistActivityFragment.java | 20 +++- .../android/yamsd/ListOfArtistsActivity.java | 18 ++- .../yamsd/ListOfArtistsActivityFragment.java | 33 ++++-- app/src/main/res/layout/activity_artist.xml | 26 ----- .../res/layout/activity_list_of_artists.xml | 5 +- app/src/main/res/layout/content_artist.xml | 2 +- .../res/layout/content_list_of_artists.xml | 2 +- app/src/main/res/layout/fragment_about.xml | 21 ++++ app/src/main/res/layout/fragment_artist.xml | 2 +- .../main/res/layout/fragment_container.xml | 7 ++ .../res/layout/fragment_list_of_artists.xml | 4 +- app/src/main/res/menu/menu_artist.xml | 10 -- app/src/main/res/values/strings.xml | 3 + 17 files changed, 206 insertions(+), 108 deletions(-) create mode 100644 app/src/main/java/com/example/android/yamsd/About.java delete mode 100644 app/src/main/java/com/example/android/yamsd/ArtistActivity.java delete mode 100644 app/src/main/res/layout/activity_artist.xml create mode 100644 app/src/main/res/layout/fragment_about.xml create mode 100644 app/src/main/res/layout/fragment_container.xml delete mode 100644 app/src/main/res/menu/menu_artist.xml diff --git a/app/build.gradle b/app/build.gradle index 1fc3ed0..41479dc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,8 +28,9 @@ dependencies { testCompile 'org.mockito:mockito-core:1.10.19' testCompile 'org.json:json:20140107' - compile 'com.android.support:appcompat-v7:23.2.1' - compile 'com.android.support:design:23.2.1' - compile 'com.squareup.picasso:picasso:2.5.2' + compile 'com.android.support:appcompat-v7:23.4.0' + compile 'com.android.support:design:23.4.0' + compile 'com.squareup.picasso:picasso:2.5.2' + compile 'com.android.support:support-v4:23.4.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ddf3bce..d156c8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,15 +21,6 @@ - - - diff --git a/app/src/main/java/com/example/android/yamsd/About.java b/app/src/main/java/com/example/android/yamsd/About.java new file mode 100644 index 0000000..41fe143 --- /dev/null +++ b/app/src/main/java/com/example/android/yamsd/About.java @@ -0,0 +1,108 @@ +package com.example.android.yamsd; + +import android.content.Context; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + + +/** + * A simple {@link Fragment} subclass. + * Activities that contain this fragment must implement the + * {@link About.OnFragmentInteractionListener} interface + * to handle interaction events. + * Use the {@link About#newInstance} factory method to + * create an instance of this fragment. + */ +public class About extends Fragment { + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + private OnFragmentInteractionListener mListener; + + public About() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment About. + */ + // TODO: Rename and change types and number of parameters + public static About newInstance(String param1, String param2) { + About fragment = new About(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_about, container, false); + } + + // TODO: Rename method, update argument and hook method into UI event + public void onButtonPressed(Uri uri) { + if (mListener != null) { + mListener.onFragmentInteraction(uri); + } + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + if (context instanceof OnFragmentInteractionListener) { + mListener = (OnFragmentInteractionListener) context; + } else { + throw new RuntimeException(context.toString() + + " must implement OnFragmentInteractionListener"); + } + } + + @Override + public void onDetach() { + super.onDetach(); + mListener = null; + } + + /** + * This interface must be implemented by activities that contain this + * fragment to allow an interaction in this fragment to be communicated + * to the activity and potentially other fragments contained in that + * activity. + *

+ * See the Android Training lesson Communicating with Other Fragments for more information. + */ + public interface OnFragmentInteractionListener { + // TODO: Update argument type and name + void onFragmentInteraction(Uri uri); + } +} diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivity.java b/app/src/main/java/com/example/android/yamsd/ArtistActivity.java deleted file mode 100644 index 885c979..0000000 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivity.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.example.android.yamsd; - -import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.Toolbar; -import android.util.Log; - -/* - * Описание Activity, отвечающей за вывод информации об отдельном исполнителе - */ -public class ArtistActivity extends AppCompatActivity { - - private final String LOG_TAG = getClass().getSimpleName(); - - - @Override - protected void onCreate(Bundle savedInstanceState) { - try { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_artist); - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); - - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - getSupportActionBar().setTitle( - ArtistsCache - .getInstance(getApplicationContext(), null) - .getArtists() - .get(getIntent().getIntExtra("position", 0)) - .getName() - ); - } catch (NullPointerException e) { - Log.e(LOG_TAG, "Null pointer: " + e); - } - } - -} diff --git a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java index 1852649..c47bde3 100644 --- a/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ArtistActivityFragment.java @@ -1,6 +1,5 @@ package com.example.android.yamsd; -import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; @@ -19,6 +18,19 @@ public class ArtistActivityFragment extends Fragment { private String LOG_TAG = getClass().getSimpleName(); + + public static ArtistActivityFragment newInstance(int index) { + ArtistActivityFragment artistActivityFragment = + new ArtistActivityFragment(); + + Bundle args = new Bundle(); + args.putInt("index", index); + artistActivityFragment.setArguments(args); + + return artistActivityFragment; + } + + public ArtistActivityFragment() { } @@ -29,14 +41,12 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, try { - Intent artistInfoIntent = getActivity().getIntent(); + int artistInfoIndex = getArguments().getInt("index", 0); Artist artist = ArtistsCache .getInstance(getContext(), null) .getArtists() - .get( - artistInfoIntent.getIntExtra("position", 0) - ); + .get(artistInfoIndex); return loadArtistData(artist, inflater).getRootView(); } catch (NullPointerException e) { diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java index 0822b85..fa2e4c0 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivity.java @@ -1,6 +1,5 @@ package com.example.android.yamsd; -import android.app.FragmentManager; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; @@ -16,7 +15,20 @@ protected void onCreate(Bundle savedInstanceState) { Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); - FragmentManager fragmentManager = getFragmentManager(); + //Начинается реализация сменяемого объекта + ListOfArtistsActivityFragment listOfArtistsActivityFragment = + ListOfArtistsActivityFragment.newInstance(); + + android.support.v4.app.FragmentTransaction fragmentTransaction = + getSupportFragmentManager().beginTransaction(); + + fragmentTransaction.replace( + R.id.fragment_container, + listOfArtistsActivityFragment + ); + fragmentTransaction.addToBackStack(null); + + fragmentTransaction.commit(); } @@ -26,4 +38,6 @@ public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_list_of_artists, menu); return true; } + + } diff --git a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java index 7ae7492..ea6313f 100644 --- a/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java +++ b/app/src/main/java/com/example/android/yamsd/ListOfArtistsActivityFragment.java @@ -1,6 +1,5 @@ package com.example.android.yamsd; -import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -20,6 +19,15 @@ public class ListOfArtistsActivityFragment extends Fragment { private CacheAndListBuffer cacheAndListBuffer; + + public static ListOfArtistsActivityFragment newInstance() { + ListOfArtistsActivityFragment listOfArtistsActivityFragment + = new ListOfArtistsActivityFragment(); + + return listOfArtistsActivityFragment; + } + + public ListOfArtistsActivityFragment() { } @@ -63,7 +71,20 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - startActivity(createIntent(position)); + + ArtistActivityFragment artistActivityFragment = + ArtistActivityFragment.newInstance(position); + + android.support.v4.app.FragmentTransaction fragmentTransaction = + getFragmentManager().beginTransaction(); + + fragmentTransaction.replace( + R.id.fragment_container, + artistActivityFragment + ); + fragmentTransaction.addToBackStack(null); + + fragmentTransaction.commit(); } } ); @@ -71,12 +92,4 @@ public void onItemClick(AdapterView parent, View view, int position, long id) return listOfArtistsView; } - - private Intent createIntent(int position) { - Intent artistInfoIntent = new Intent(getActivity(), ArtistActivity.class); - artistInfoIntent.putExtra("position", position); - - return artistInfoIntent; - } - } diff --git a/app/src/main/res/layout/activity_artist.xml b/app/src/main/res/layout/activity_artist.xml deleted file mode 100644 index dd34511..0000000 --- a/app/src/main/res/layout/activity_artist.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_list_of_artists.xml b/app/src/main/res/layout/activity_list_of_artists.xml index 0021260..1cfa82d 100644 --- a/app/src/main/res/layout/activity_list_of_artists.xml +++ b/app/src/main/res/layout/activity_list_of_artists.xml @@ -2,6 +2,7 @@ - + diff --git a/app/src/main/res/layout/content_artist.xml b/app/src/main/res/layout/content_artist.xml index cd70b3f..6af1352 100644 --- a/app/src/main/res/layout/content_artist.xml +++ b/app/src/main/res/layout/content_artist.xml @@ -6,4 +6,4 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" - tools:layout="@layout/fragment_artist" /> + tools:layout="@layout/fragment_artist" /> \ No newline at end of file diff --git a/app/src/main/res/layout/content_list_of_artists.xml b/app/src/main/res/layout/content_list_of_artists.xml index 1810135..8af4463 100644 --- a/app/src/main/res/layout/content_list_of_artists.xml +++ b/app/src/main/res/layout/content_list_of_artists.xml @@ -1,7 +1,7 @@ + + + +