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..fa3e0b4 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,84 @@ package ru.yandex.yamblz.handler; +import android.os.Handler; +import android.os.Looper; +import android.util.Log; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; + public class StubCriticalSectionsHandler implements CriticalSectionsHandler { + private Set sections = new HashSet<>(); + private LinkedList taskQueue = new LinkedList<>(); + private Handler handler = new Handler(Looper.getMainLooper()); + private HashMap delayedTask = new HashMap<>(); + private Runnable callBack = new Runnable() { + @Override + public void run() { + if (taskQueue.isEmpty()) { + return; + } + + Task firstTask = taskQueue.pop(); + firstTask.run(); + + if (sections.isEmpty()) { + handler.post(callBack); + } + } + }; + @Override public void startSection(int id) { - + Log.d("startSection", Integer.toString(sections.size())); + sections.add(id); + Log.d("startSection", Integer.toString(sections.size())); + handler.removeCallbacks(callBack); } @Override public void stopSection(int id) { - + Log.d("stopSection", Integer.toString(sections.size())); + sections.remove(id); + Log.d("stopSection", Integer.toString(sections.size())); + if (sections.isEmpty()) { + handler.post(callBack); + } } @Override public void stopSections() { - + sections.clear(); + handler.post(callBack); } @Override public void postLowPriorityTask(Task task) { - + Log.d("postLowPriorityTask", "post"); + taskQueue.add(task); + if (taskQueue.size() == 1 && sections.isEmpty()) { + handler.post(callBack); + } } @Override public void postLowPriorityTaskDelayed(Task task, int delay) { - + Runnable runnable = () -> postLowPriorityTask(task); + delayedTask.put(task, runnable); + handler.postDelayed(runnable, delay); } @Override public void removeLowPriorityTask(Task task) { - + taskQueue.remove(task); + handler.removeCallbacks(delayedTask.get(task)); } @Override public void removeLowPriorityTasks() { - + taskQueue.clear(); } } diff --git a/app/src/main/java/ru/yandex/yamblz/loader/CollageLoader.java b/app/src/main/java/ru/yandex/yamblz/loader/CollageLoader.java index dad5b76..b08b9e8 100644 --- a/app/src/main/java/ru/yandex/yamblz/loader/CollageLoader.java +++ b/app/src/main/java/ru/yandex/yamblz/loader/CollageLoader.java @@ -2,6 +2,7 @@ import android.widget.ImageView; +import java.lang.ref.WeakReference; import java.util.List; public interface CollageLoader { 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..4909361 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); + int numOfImage(); } 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..5accf27 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/loader/CollageStrategyImpl.java @@ -0,0 +1,46 @@ +package ru.yandex.yamblz.loader; + +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.util.Log; + +import java.util.List; +import java.util.Random; + +/** + * Created by kostya on 26.07.16. + */ + +public class CollageStrategyImpl implements CollageStrategy { + private static final int WIDTH = 600; + private static final int HEIGHT = 600; + @Override + public Bitmap create(List bitmaps) { + Log.d("Bitmap create, size = ", Integer.toString(bitmaps.size())); + if (bitmaps.isEmpty()) { + return null; + } + else if (bitmaps.size() < 4) { + Bitmap bitmap = Bitmap.createBitmap(WIDTH/2, HEIGHT/2, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(bitmaps.get(0), 0f, 0f, null); + canvas.save(); + return bitmap; + } + else { + Bitmap bitmap = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + canvas.drawBitmap(bitmaps.get(0), 0f, 0f, null); + canvas.drawBitmap(bitmaps.get(1), WIDTH/2, 0, null); + canvas.drawBitmap(bitmaps.get(2), 0f, HEIGHT/2, null); + canvas.drawBitmap(bitmaps.get(3), WIDTH/2, HEIGHT/2, null); + canvas.save(); + return bitmap; + } + } + + @Override + public int numOfImage() { + return 4; + } +} 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..3b0662f 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,33 @@ package ru.yandex.yamblz.loader; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.Log; import android.widget.ImageView; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.ArrayList; import java.util.List; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import ru.yandex.yamblz.R; +import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.handler.Task; public class StubCollageLoader implements CollageLoader { + private final ExecutorService pool = Executors.newFixedThreadPool(10); + @Override public void loadCollage(List urls, ImageView imageView) { @@ -19,7 +41,28 @@ public void loadCollage(List urls, ImageTarget imageTarget) { @Override public void loadCollage(List urls, ImageView imageView, CollageStrategy collageStrategy) { + imageView.setImageDrawable(null); + + Object old_setter = imageView.getTag(); + if (old_setter != null) { + Log.d("onBindViewHlder", "removeLowPriorityTask"); + CriticalSectionsManager.getHandler().removeLowPriorityTask((Task) old_setter); + } + + UUID uuid = UUID.randomUUID(); + Task setter = () -> { + pool.execute(() -> loadCollageImpl( + urls, + imageView, + collageStrategy, + uuid + )); + }; + + imageView.setTag(setter); + imageView.setTag(R.id.img_in_list, uuid); + CriticalSectionsManager.getHandler().postLowPriorityTask(setter); } @Override @@ -28,4 +71,42 @@ public void loadCollage(List urls, ImageTarget imageTarget, } + private void loadCollageImpl(List urls, ImageView imageView, + CollageStrategy collageStrategy, UUID uuid) { + Log.d("loadCollageImpl", "download"); + List bitmapList = new ArrayList<>(); + int size = Math.min(collageStrategy.numOfImage(), urls.size()); + for (int i = 0; i < size; i++) { + bitmapList.add(getBitmapFromURL(urls.get(i))); + } + Bitmap bitmap = collageStrategy.create(bitmapList); + if (imageView != null && imageView.getTag(R.id.img_in_list).equals(uuid)) { + imageView.post(() -> { + imageView.setImageDrawable(null); + imageView.setImageBitmap(bitmap); + }); + } + } + + private static Bitmap getBitmapFromURL(String src) { + try { + URL url = new URL(src); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.connect(); + InputStream input = connection.getInputStream(); + return BitmapFactory.decodeStream(input); + } catch (IOException e) { + Bitmap bitmap = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + int[] colors = {Color.BLACK, Color.BLUE, Color.GREEN, Color.RED}; + Random random = new Random(); + int ind = Math.abs(random.nextInt()) % colors.length; + Paint paint = new Paint(); + paint.setColor(colors[ind]); + canvas.drawCircle(150, 150, 150, paint); + canvas.save(); + return bitmap; + } + } } 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 index d46490f..32f7c92 100644 --- a/app/src/main/java/ru/yandex/yamblz/ui/fragments/ContentFragment.java +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/ContentFragment.java @@ -1,18 +1,97 @@ package ru.yandex.yamblz.ui.fragments; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +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.FrameLayout; +import android.widget.ImageView; + +import org.json.JSONArray; +import org.json.JSONException; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ExecutionException; import ru.yandex.yamblz.R; +import ru.yandex.yamblz.loader.CollageStrategyImpl; +import ru.yandex.yamblz.ui.fragments.Genre.Artist; +import ru.yandex.yamblz.ui.fragments.Genre.DownloadArtistsTask; +import ru.yandex.yamblz.ui.fragments.Genre.Genre; +import ru.yandex.yamblz.ui.fragments.Genre.GenreAdapter; +import ru.yandex.yamblz.ui.fragments.Genre.GenreOnScrollListener; public class ContentFragment extends BaseFragment { + private static final String urlStr = "http://download.cdn.yandex.net/mobilization-2016/artists.json"; + ImageView imageView; + @NonNull @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_content, container, false); + RecyclerView recyclerView = (RecyclerView)inflater.inflate(R.layout.fragment_content, container, false); + List genres = getGenres(); + RecyclerView.Adapter adapter = new GenreAdapter(genres, super.getActivity()); + recyclerView.setAdapter(adapter); + recyclerView.addOnScrollListener(new GenreOnScrollListener()); + recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); + return recyclerView; + } + + private List getGenres() { + List genres = new ArrayList<>(); + List artists = null; + SharedPreferences sharedPreferences = getActivity().getApplicationContext().getSharedPreferences("genres", 0); + String artistsJSON = sharedPreferences.getString("artistsJSON", null); + if (artistsJSON == null) { + Log.d("Main list fragment", "download"); + DownloadArtistsTask downloadArtists = new DownloadArtistsTask(); + downloadArtists.execute(urlStr); + try { + artistsJSON = downloadArtists.get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString("artistsJSON", artistsJSON); + editor.apply(); + } + try { + artists = Artist.fromJSON(new JSONArray(artistsJSON)); + } catch (JSONException e) { + e.printStackTrace(); + } + + Map genreMap = new HashMap<>(); + + assert artists != null; + for (Artist artist: artists) { + for(String genre: artist.getGenres()) { + if (!genreMap.containsKey(genre)) { + Genre genreObj = new Genre(genre); + genreMap.put(genre, genreObj); + } + genreMap.get(genre).addArtist(artist); + } + } + + genres.addAll(genreMap.values()); + + return genres; } } diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Artist.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Artist.java new file mode 100644 index 0000000..a7d58ef --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Artist.java @@ -0,0 +1,58 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by kostya on 26.07.16. + */ +public class Artist { + private static final String DEFAULT_STR = "unknown"; + private static final String DEFAULT_URL = ""; + + private String name; + private String imgUrl; + private List genres = new ArrayList<>(); + + public List getGenres() { + return genres; + } + + public Artist(JSONObject jsonObject) { + try { this.name = jsonObject.getString("name"); } catch (JSONException e) { this.name = DEFAULT_STR; } + try { this.imgUrl = jsonObject.getJSONObject("cover").getString("small"); } catch (JSONException e) { this.imgUrl = DEFAULT_URL; } + try { + JSONArray jsonGenres = jsonObject.getJSONArray("genres"); + for (int i = 0; i < jsonGenres.length(); i++) { + genres.add((String) jsonGenres.get(i)); + } + } catch (JSONException e) { + e.printStackTrace(); + } + } + + public static ArrayList fromJSON (JSONArray jsonArray) { + ArrayList list = new ArrayList<>(); + + for (int i = 0; i < jsonArray.length(); i++) { + try { + list.add(new Artist(jsonArray.getJSONObject(i))); + } catch (JSONException e) { + e.printStackTrace(); + } + } + return list; + } + + public String getName() { + return name; + } + + public String getImgUrl() { + return imgUrl; + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/DownloadArtistsTask.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/DownloadArtistsTask.java new file mode 100644 index 0000000..59adbaa --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/DownloadArtistsTask.java @@ -0,0 +1,39 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +import android.os.AsyncTask; + +import java.io.BufferedInputStream; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; + +/** + * Created by kostya on 26.07.16. + */ + +public class DownloadArtistsTask extends AsyncTask { + + @Override + protected String doInBackground(String... strings) { + HttpURLConnection urlConnection; + + StringBuilder stringBuilder = new StringBuilder(); + try { + URL url = new URL(strings[0]); + urlConnection = (HttpURLConnection) url.openConnection(); + InputStream in = new BufferedInputStream(urlConnection.getInputStream()); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + String line; + while ((line = reader.readLine())!=null) { + stringBuilder.append(line); + } + } catch (IOException e) { + e.printStackTrace(); + } + + return stringBuilder.toString(); + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Genre.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Genre.java new file mode 100644 index 0000000..b20f289 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/Genre.java @@ -0,0 +1,47 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * Created by kostya on 26.07.16. + */ + +public class Genre { + private String name; + private List artists = new ArrayList<>(); + + public Genre(String name) { + this.name = name; + } + public String getDescription() { + StringBuilder stringBuilder = new StringBuilder(); + for (Artist artist: artists) { + stringBuilder.append(". "); + stringBuilder.append(artist.getName()); + } + return stringBuilder.toString(); + } + + public String getName() { + return name; + } + + public void addArtist(Artist artist) { + artists.add(artist); + } + + public List getImgUrls() { + List listUrls = new LinkedList<>(); + for (Artist artist: artists) { + listUrls.add(artist.getImgUrl()); + } + return listUrls; + } + + @Override + public int hashCode() { + return name.hashCode(); + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreAdapter.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreAdapter.java new file mode 100644 index 0000000..11ce4cc --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreAdapter.java @@ -0,0 +1,55 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +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 java.util.ArrayList; +import java.util.List; + +import ru.yandex.yamblz.R; +import ru.yandex.yamblz.handler.CriticalSectionsManager; +import ru.yandex.yamblz.handler.Task; +import ru.yandex.yamblz.loader.CollageLoader; +import ru.yandex.yamblz.loader.CollageLoaderManager; +import ru.yandex.yamblz.loader.CollageStrategyImpl; + +/** + * Created by kostya on 26.07.16. + */ + +public class GenreAdapter extends RecyclerView.Adapter { + private List genres = new ArrayList<>(); + private FragmentActivity context; + + public GenreAdapter(List genres, FragmentActivity context) { + this.genres = genres; + this.context = context; + } + + @Override + public GenreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_row, parent, false); + return new GenreViewHolder(view); + } + + @Override + public void onBindViewHolder(GenreViewHolder holder, int position) { + Genre genre = genres.get(position); + Log.d("onBindViewHlder", "genre = " + genre.getName()); + holder.textInList.setText(genre.getName() + "\n" + genre.getDescription()); + CollageLoaderManager.getLoader().loadCollage( + genre.getImgUrls(), + holder.imgInList, + new CollageStrategyImpl() + ); + } + + @Override + public int getItemCount() { + return genres.size(); + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreOnScrollListener.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreOnScrollListener.java new file mode 100644 index 0000000..f4d4bb9 --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreOnScrollListener.java @@ -0,0 +1,25 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +import android.support.v7.widget.RecyclerView; +import android.util.Log; + +import ru.yandex.yamblz.handler.CriticalSectionsManager; + +/** + * Created by kostya on 26.07.16. + */ + +public class GenreOnScrollListener extends RecyclerView.OnScrollListener { + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { + Log.d("nScrollStateChanged", "DRAGGING"); + CriticalSectionsManager.getHandler().startSection(42); + } + else if (newState == RecyclerView.SCROLL_STATE_IDLE) { + Log.d("nScrollStateChanged", "IDLE"); + CriticalSectionsManager.getHandler().stopSection(42); + } + } +} diff --git a/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreViewHolder.java b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreViewHolder.java new file mode 100644 index 0000000..bd60ffd --- /dev/null +++ b/app/src/main/java/ru/yandex/yamblz/ui/fragments/Genre/GenreViewHolder.java @@ -0,0 +1,27 @@ +package ru.yandex.yamblz.ui.fragments.Genre; + +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import java.lang.ref.WeakReference; + +import ru.yandex.yamblz.R; + +/** + * Created by kostya on 26.07.16. + */ +public class GenreViewHolder extends RecyclerView.ViewHolder { + + ImageView imgInList; + TextView textInList; + + public GenreViewHolder(View itemView) { + super(itemView); + imgInList = (ImageView) itemView.findViewById(R.id.img_in_list); + textInList = (TextView) itemView.findViewById(R.id.text_in_list); + } + + +} diff --git a/app/src/main/res/layout/fragment_content.xml b/app/src/main/res/layout/fragment_content.xml index 81016ea..21583f5 100644 --- a/app/src/main/res/layout/fragment_content.xml +++ b/app/src/main/res/layout/fragment_content.xml @@ -1,14 +1,7 @@ - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/list_row.xml b/app/src/main/res/layout/list_row.xml new file mode 100644 index 0000000..b90ce0f --- /dev/null +++ b/app/src/main/res/layout/list_row.xml @@ -0,0 +1,27 @@ + + + + + + + + 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', diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 86a3e94..95d21e6 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon May 30 20:17:48 ICT 2016 +#Mon Jul 25 23:14:19 MSK 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.13-all.zip