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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ android {
applicationId 'ru.yandex.yamblz'
minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk
versionCode versions.code // Notice that you may want to use BUILD_NUMBER from CI in real project with own CI.
versionCode versions.code
// Notice that you may want to use BUILD_NUMBER from CI in real project with own CI.
versionName versions.name

// Make generated apks contain version name and code.
Expand Down Expand Up @@ -104,6 +105,10 @@ dependencies {
compile libraries.tinyDancer
compile libraries.lynx
compile libraries.processPhoenix
compile libraries.rxjava
compile libraries.rxandroid
compile libraries.okhttp
compile libraries.gson

testCompile libraries.junit
testCompile libraries.robolectric
Expand All @@ -121,6 +126,8 @@ dependencies {
exclude module: 'recyclerview-v7'
exclude module: 'support-v4'
}


}

configurations.all {
Expand Down
8 changes: 6 additions & 2 deletions app/src/main/java/ru/yandex/yamblz/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,16 @@

import android.app.Application;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.NonNull;

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 {
Expand All @@ -34,8 +38,8 @@ public void onCreate() {
devMetricsProxy.apply();
}

CollageLoaderManager.init(null); // add implementation
CriticalSectionsManager.init(null); // add implementation
CollageLoaderManager.init(new StubCollageLoader());
CriticalSectionsManager.init(new StubCriticalSectionsHandler(new Handler(Looper.getMainLooper())));
}

@NonNull
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.yandex.yamblz;

/**
* Created by Aleksandra on 24/07/16.
*/
public final class Constants {

public static final String MOBILIZATION_URL = "http://download.cdn.yandex.net/mobilization-2016/artists.json";

private Constants() {
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
package ru.yandex.yamblz.handler;

import android.os.Handler;
import android.os.Looper;

public class CriticalSectionsManager {

private static CriticalSectionsHandler sCriticalSectionsHandler;
private static volatile CriticalSectionsHandler sCriticalSectionsHandler;

private CriticalSectionsManager() {
}

public static void init(CriticalSectionsHandler criticalSectionsHandler) {
sCriticalSectionsHandler = criticalSectionsHandler;
}

public static CriticalSectionsHandler getHandler() {
if (sCriticalSectionsHandler == null) {
sCriticalSectionsHandler = new StubCriticalSectionsHandler();
sCriticalSectionsHandler = new StubCriticalSectionsHandler(new Handler(Looper.getMainLooper()));
}
return sCriticalSectionsHandler;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,82 @@
package ru.yandex.yamblz.handler;

import android.os.Handler;

import java.util.concurrent.CopyOnWriteArrayList;

public class StubCriticalSectionsHandler implements CriticalSectionsHandler {

private final Handler handler;
private final CopyOnWriteArrayList<Integer> criticalSections = new CopyOnWriteArrayList<>();
private final CopyOnWriteArrayList<Task> lowPriorityTasks = new CopyOnWriteArrayList<>();
private final LowPriorityTaskExecutor executor = new LowPriorityTaskExecutor();

public StubCriticalSectionsHandler(Handler handler) {
this.handler = handler;
}

@Override
public void startSection(int id) {

if (!criticalSections.contains(id)) {
criticalSections.add(id);
handler.removeCallbacks(executor);
}
}

@Override
public void stopSection(int id) {

criticalSections.remove(Integer.valueOf(id));
if (criticalSections.isEmpty()) {
handler.post(executor);
}
}

@Override
public void stopSections() {

criticalSections.clear();
handler.post(executor);
}

@Override
public void postLowPriorityTask(Task task) {

if (criticalSections.isEmpty() && lowPriorityTasks.isEmpty()) {
lowPriorityTasks.add(task);
handler.post(executor);
} else {
lowPriorityTasks.add(task);
}
}

@Override
public void postLowPriorityTaskDelayed(Task task, int delay) {

lowPriorityTasks.add(task);
}

@Override
public void removeLowPriorityTask(Task task) {

lowPriorityTasks.remove(task);
}

@Override
public void removeLowPriorityTasks() {
handler.removeCallbacks(executor);
lowPriorityTasks.clear();
}


public class LowPriorityTaskExecutor implements Runnable {
@Override
public void run() {
executeLowPriorityTask();
}

public void executeLowPriorityTask() {
Task currentTask;
while (criticalSections.isEmpty() && !lowPriorityTasks.isEmpty()) {
currentTask = lowPriorityTasks.remove(0);
currentTask.run();
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

public class CollageLoaderManager {

private static CollageLoader sCollageLoader;
private static volatile CollageLoader sCollageLoader;

private CollageLoaderManager() {
}

public static void init(CollageLoader collageLoader) {
sCollageLoader = collageLoader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,7 @@

public interface CollageStrategy {

int amountOfImagesNeeded();

Bitmap create(List<Bitmap> bitmaps);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ru.yandex.yamblz.loader;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.util.Log;

import java.util.List;

/**
* Created by Aleksandra on 24/07/16.
*/
public class FourImagesCollageStrategy implements CollageStrategy {
public static final String DEBUG_TAG = FourImagesCollageStrategy.class.getName();

@Override
public int amountOfImagesNeeded() {
return 4;
}

@Override
public Bitmap create(List<Bitmap> bitmaps) {
Log.d(DEBUG_TAG, "in create collage");

Bitmap result;

if (bitmaps.size() >= 4) {
result = Bitmap.createBitmap(600, 600, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(bitmaps.get(0), 0, 0, null);
canvas.drawBitmap(bitmaps.get(1), 0, 300, null);
canvas.drawBitmap(bitmaps.get(2), 300, 0, null);
canvas.drawBitmap(bitmaps.get(3), 300, 300, null);
canvas.save();
} else {
result = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(bitmaps.get(0), 0, 0, null);
canvas.save();
}

return result;
}

}
87 changes: 87 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/loader/GenreLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package ru.yandex.yamblz.loader;

import android.content.Context;
import android.support.v4.content.AsyncTaskLoader;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.ResponseBody;
import ru.yandex.yamblz.Constants;
import ru.yandex.yamblz.model.ArtistInfo;
import ru.yandex.yamblz.model.Genre;

/**
* Created by Aleksandra on 25/07/16.
*/
public class GenreLoader extends AsyncTaskLoader<List<Genre>> {
public static final String DEBUG_TAG = GenreLoader.class.getName();

private OkHttpClient client = new OkHttpClient();
private Gson gson = new Gson();
private TypeToken<List<ArtistInfo>> artists = new TypeToken<List<ArtistInfo>>() {
};

public GenreLoader(Context context) {
super(context);
}

@Override
public List<Genre> loadInBackground() {
Request request = new Request.Builder()
.url(Constants.MOBILIZATION_URL)
.build();

Response response;
try {
response = client.newCall(request).execute();
ResponseBody responseBody = response.body();

List<ArtistInfo> artistInfoList = gson.fromJson(responseBody.charStream(), artists.getType());
responseBody.close();

Map<String, Genre> genres = new HashMap<>();
for (ArtistInfo a : artistInfoList) {
for (String g : a.getGenres()) {
if (genres.containsKey(g)) {
genres.get(g).getUrls().add(a.getCover().getSmall());
} else {
List<String> list = new ArrayList<>();
list.add(a.getCover().getSmall());
genres.put(g, new Genre(list, g));
}
}
}
List<Genre> result = new ArrayList<>(genres.size());

for (Map.Entry<String, Genre> entry : genres.entrySet()) {
result.add(entry.getValue());
}

for (Genre g : result) {
Log.d(DEBUG_TAG, "" + g.toString());
}

return result;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onStartLoading() {
super.onStartLoading();
forceLoad();
}
}
7 changes: 7 additions & 0 deletions app/src/main/java/ru/yandex/yamblz/loader/ImageTarget.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

import android.graphics.Bitmap;

import ru.yandex.yamblz.handler.Task;
import rx.Subscription;

public interface ImageTarget {

void onLoadBitmap(Bitmap bitmap);

void setSubscription(Subscription subscription);

void setTask(Task task);
}
Loading