Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added the changes for improve load time. #117

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
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
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ public class ZypeApi {
private static final String USERNAME = "username";
public static final String UUID = "uuid";

public static final int PER_PAGE_DEFAULT = 20;
public static final int PER_PAGE_DEFAULT = 10;

private static ZypeApi instance;
private static Retrofit retrofit;
Expand Down
4 changes: 2 additions & 2 deletions Application/app/version.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#Sat Jun 26 10:24:21 IST 2021
VERSION_CODE=1310
#Thu Jul 29 10:07:50 IST 2021
VERSION_CODE=1323
adb=u
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
import java.util.Stack;

import rx.Observable;
import rx.Single;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
Expand Down Expand Up @@ -2714,6 +2715,10 @@ public void actionTriggered(Activity activity, Content content, int actionId,
}
}

public Single<List<ContentContainer>> loadNextPlaylists(String lastPlayListId) {
return getContentLoader().loadNextPlaylists(lastPlayListId, ZypeConfiguration.getRootPlaylistId(mAppContext));
}

/**
* Toggles the watch list action button text.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,17 +56,24 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.List;

import okhttp3.ResponseBody;
import org.json.JSONArray;
import org.json.JSONObject;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import rx.Observable;
import rx.Single;
import rx.Single.OnSubscribe;
import rx.SingleSubscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.FuncN;
import rx.schedulers.Schedulers;

import static com.amazon.android.contentbrowser.ContentBrowser.BROADCAST_DATA_LOADED;
Expand Down Expand Up @@ -791,6 +798,82 @@ public Observable<Pair> getVideosFeedObservable(Object contentContainerAsObject,
}
}

public Single<List<ContentContainer>> loadNextPlaylists(String lastPlayListId, String parentContainerId) {
return Single.create((OnSubscribe<List<ContentContainer>>) emitter -> {
List<PlaylistData> playlists = ZypeDataDownloaderHelper.loadPlaylists();
//sort the play lists based on priority first
Collections.sort(playlists, (a, b) -> {
Integer valA;
Integer valB;
try {
valA = a.priority;
valB = b.priority;
}
catch (Exception e) {
return 0;
}
return valA.compareTo(valB);
});
List<Single<ContentContainer>> playListVideosLoader = new ArrayList<>();
boolean found = false;

for (PlaylistData playlistData : playlists) {
if (TextUtils.isEmpty(playlistData.description)) {
playlistData.description = " ";
}
// Skip playlist that are not direct child of the root playlist
if (TextUtils.isEmpty(playlistData.parentId)
|| !playlistData.parentId.equals(ZypeConfiguration.getRootPlaylistId(mContext))) {
continue;
}
if (playlistData.playlistItemCount > 0 && found) {
playListVideosLoader.add(loadContainer(playlistData));
}
if(!found) {
found = playlistData.id.equalsIgnoreCase(lastPlayListId);
}
}

if(playListVideosLoader.isEmpty()) {
emitter.onSuccess(Collections.emptyList());
return;
}

Single.zip(playListVideosLoader, (FuncN<List<ContentContainer>>) args -> {
ArrayList<ContentContainer> containers = new ArrayList<>();
if(args != null) {
for (Object arg : args) {
if (arg instanceof ContentContainer) {
containers.add((ContentContainer)arg);
}
}
}
return containers;
}).subscribeOn(Schedulers.io()).subscribe(emitter::onSuccess, emitter::onError);
}).subscribeOn(Schedulers.io());
}

private Single<ContentContainer> loadContainer(PlaylistData playlistData) {
return Single.create((OnSubscribe<ContentContainer>) emitter -> {
Recipe recipeDynamicParserContainer = Recipe.newInstance(mContext, "recipes/ZypeCategoriesRecipe.json");
HashMap map = new HashMap();
map.put("categories", Arrays.asList(playlistData));
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
String feed = gson.toJson(map);
String[] params = new String[] { playlistData.parentId };

mDynamicParser.cookRecipeObservable(recipeDynamicParserContainer, feed,null, params).flatMap(o -> {
ContentContainer contentContainer = (ContentContainer)o;
return Observable.just(contentContainer);
}).observeOn(Schedulers.io()).subscribe(container-> {
loadContentForContentContainer(container, mContext, () -> {
emitter.onSuccess(container);
});
});
}).subscribeOn(Schedulers.io());
}

public Observable<ContentContainer> loadPlayList(ContentContainer root, String playListId) {
return Observable.just(playListId).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).flatMap(id -> {
PlaylistData playlistData = ZypeDataDownloaderHelper.loadPlayList(playListId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import android.content.Context;
import android.text.TextUtils;
import android.util.Log;

import android.util.Pair;
import com.amazon.android.recipe.Recipe;
import com.amazon.android.utils.Preferences;
import com.amazon.dataloader.R;
Expand All @@ -29,6 +29,14 @@
import java.util.Collections;
import java.util.List;

import rx.Observable;
import rx.Scheduler;
import rx.Single;
import rx.Single.OnSubscribe;
import rx.SingleSubscriber;
import rx.functions.FuncN;
import rx.schedulers.Schedulers;

/**
* Created by Evgeny Cherkasov on 04.03.2017.
*/
Expand All @@ -43,6 +51,8 @@ public class ZypeDataDownloader extends ADataDownloader {

private static final String PREFERENCE_TERMS = "ZypeTerms";

private final Object syncObject = new Object();

/**
* {@link AUrlGenerator} instance.
*/
Expand Down Expand Up @@ -108,12 +118,13 @@ protected Data fetchData(Recipe dataLoadRecipe) throws Exception {
Log.d(TAG, "fetchData(): Started");

AppData appData = loadAppConfiguration();
Log.d(TAG, "fetchData(): App configuration loaded");
ZypeConfiguration.update(appData, mContext);
Log.d(TAG, "fetchData(): App configuration loaded");

loadZobjectContents();
Log.d(TAG, "fetchData(): ZObjects loaded");

List<PlaylistData> playlists = loadPlaylists();
List<PlaylistData> playlists = ZypeDataDownloaderHelper.loadPlaylists();
Log.d(TAG, "fetchData(): Playlists loaded");
addFavoritesPlaylist(playlists);
if (ZypeSettings.LIBRARY_ENABLED) {
Expand All @@ -127,51 +138,82 @@ protected Data fetchData(Recipe dataLoadRecipe) throws Exception {
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();

//sort the play lists based on priority first
Collections.sort(playlists, (a, b) -> {
Integer valA;
Integer valB;
try {
valA = a.priority;
valB = b.priority;
}
catch (Exception e) {
return 0;
}
return valA.compareTo(valB);
});

Log.d(TAG, "testData(): Videos loaded Started");
List<Single<Pair<PlaylistData, VideosResponse>>> playListVideosLoader = new ArrayList<>();

for (PlaylistData playlistData : playlists) {
if (TextUtils.isEmpty(playlistData.description)) {
playlistData.description = " ";
}
// Skip playlist that are not direct child of the root playlist
if (TextUtils.isEmpty(playlistData.parentId)
|| !playlistData.parentId.equals(ZypeConfiguration.getRootPlaylistId(mContext))) {
|| !playlistData.parentId.equals(ZypeConfiguration.getRootPlaylistId(mContext))) {
continue;
}

if (playlistData.playlistItemCount > 0) {
Log.d(TAG, "fetchData(): Loading videos for " + playlistData.title);
//jsonCategories.put(new JSONObject(gson.toJson(playlistData)));
playListVideosLoader.add(ZypeDataDownloaderHelper.loadPlayListVideos(playlistData));
}

VideosResponse videosResponse = ZypeDataDownloaderHelper.loadPlaylistVideos(playlistData.id, 1);
if (videosResponse != null) {
for (VideoData videoData : videosResponse.videoData) {
jsonContents.put(new JSONObject(gson.toJson(videoData)));
if(playListVideosLoader.size() > 20) {
break;
}
}
Single.zip(playListVideosLoader, (FuncN<List<VideosResponse>>) args -> {
ArrayList<VideosResponse> videosResponses = new ArrayList<>();
if(args != null) {
for (Object arg : args) {
if (arg instanceof Pair) {
VideosResponse videosResponse = (VideosResponse) ((Pair)arg).second;
for (VideoData videoData : videosResponse.videoData) {
try {
jsonContents.put(new JSONObject(gson.toJson(videoData)));
} catch (Exception ignored) {
}
}
videosResponses.add(videosResponse);
}
}
}
}
Log.d(TAG, "fetchData(): Videos loaded");

Collections.sort(playlists, (a, b) -> {
Integer valA;
Integer valB;
try {
valA = a.priority;
valB = b.priority;
return videosResponses;
}).subscribeOn(Schedulers.io()).subscribe(videosResponses -> {
synchronized (syncObject) {
syncObject.notify();
}
catch (Exception e) {
return 0;
}, throwable -> {
synchronized (syncObject) {
syncObject.notify();
}
return valA.compareTo(valB);
});
synchronized (syncObject) {
syncObject.wait();
}

for (PlaylistData playlistData : playlists) {
String playlistId = playlistData.id;
if (playlistId.equals(ZypeConfiguration.getRootPlaylistId(mContext))
|| TextUtils.isEmpty(playlistData.parentId)) {
|| TextUtils.isEmpty(playlistData.parentId)) {
continue;
}
jsonCategories.put(new JSONObject(gson.toJson(playlistData)));
}

Log.d(TAG, "testData(): Videos loaded");

JSONObject jsonResult = new JSONObject();
jsonResult.put("categories", jsonCategories);
jsonResult.put("contents", jsonContents);
Expand Down Expand Up @@ -212,25 +254,6 @@ private void loadZobjectContents() {
}
}

private List<PlaylistData> loadPlaylists() {
List<PlaylistData> result = new ArrayList<>();

int page = 1;
PlaylistsResponse playlistsResponse = ZypeApi.getInstance().getPlaylists(page);
if (playlistsResponse != null && playlistsResponse.response != null) {
result.addAll(playlistsResponse.response);
if (playlistsResponse.pagination != null && playlistsResponse.pagination.pages > 1) {
for (page = playlistsResponse.pagination.next; page <= playlistsResponse.pagination.pages; page++) {
playlistsResponse = ZypeApi.getInstance().getPlaylists(page);
if (playlistsResponse != null && playlistsResponse.response != null) {
result.addAll(playlistsResponse.response);
}
}
}
}
return result;
}

private void addFavoritesPlaylist(List<PlaylistData> playlists) {
PlaylistData item = new PlaylistData();
item.id = ZypeSettings.ROOT_FAVORITES_PLAYLIST_ID;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import android.text.TextUtils;
import android.util.Log;

import android.util.Pair;
import com.amazon.android.recipe.Recipe;
import com.zype.fire.api.Model.PlaylistData;
import com.zype.fire.api.Model.PlaylistsResponse;
Expand All @@ -18,6 +18,9 @@

import java.util.ArrayList;
import java.util.List;
import rx.Single;
import rx.Single.OnSubscribe;
import rx.schedulers.Schedulers;

/**
* Created by Evgeny Cherkasov on 20.11.2017.
Expand Down Expand Up @@ -97,7 +100,7 @@ public static VideosResult loadFavoriteVideos(String favoritesPlaylistId, String

while (loadNext) {
VideoFavoritesResponse response = ZypeApi.getInstance()
.getVideoFavorites(consumerId, accessToken, result.nextPage);
.getVideoFavorites(consumerId, accessToken, result.nextPage);
if (response != null) {
Log.d(TAG, "loadFavoriteVideos(): size=" + response.videoFavorites.size());

Expand Down Expand Up @@ -140,4 +143,34 @@ public static VideosResult loadFavoriteVideos(String favoritesPlaylistId, String
return result;
}

public static List<PlaylistData> loadPlaylists() {
List<PlaylistData> result = new ArrayList<>();

int page = 1;
PlaylistsResponse playlistsResponse = ZypeApi.getInstance().getPlaylists(page);
if (playlistsResponse != null && playlistsResponse.response != null) {
result.addAll(playlistsResponse.response);
if (playlistsResponse.pagination != null && playlistsResponse.pagination.pages > 1) {
for (page = playlistsResponse.pagination.next; page <= playlistsResponse.pagination.pages; page++) {
playlistsResponse = ZypeApi.getInstance().getPlaylists(page);
if (playlistsResponse != null && playlistsResponse.response != null) {
result.addAll(playlistsResponse.response);
}
}
}
}
return result;
}

public static Single<Pair<PlaylistData, VideosResponse>> loadPlayListVideos(PlaylistData playlistData) {
return Single.create((OnSubscribe<Pair<PlaylistData, VideosResponse>>) emitter -> {
Log.d(TAG, "fetchData(): Loading videos for " + playlistData.title);

VideosResponse videosResponse = loadPlaylistVideos(playlistData.id, 1);
if(videosResponse == null) {
videosResponse = new VideosResponse();
}
emitter.onSuccess(Pair.create(playlistData, videosResponse));
}).subscribeOn(Schedulers.io());
}
}
Loading