/* This file is part of Subsonic. Subsonic is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Subsonic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Subsonic. If not, see . Copyright 2015 (C) Scott Jackson */ package net.nullsum.audinaut.adapter; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import net.nullsum.audinaut.R; import net.nullsum.audinaut.domain.MusicDirectory; import net.nullsum.audinaut.domain.MusicDirectory.Entry; import net.nullsum.audinaut.fragments.MainFragment; import net.nullsum.audinaut.service.MusicService; import net.nullsum.audinaut.service.MusicServiceFactory; import net.nullsum.audinaut.util.ImageLoader; import net.nullsum.audinaut.util.SilentBackgroundTask; import net.nullsum.audinaut.view.UpdateView; import java.util.List; public class EntryInfiniteGridAdapter extends EntryGridAdapter { public static final int VIEW_TYPE_LOADING = 4; private String type; private String extra; private int size; private boolean loading = false; private boolean allLoaded = false; public EntryInfiniteGridAdapter(Context context, List entries, ImageLoader imageLoader, boolean largeCell) { super(context, entries, imageLoader, largeCell); } @Override public UpdateView.UpdateViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == VIEW_TYPE_LOADING) { View progress = LayoutInflater.from(context).inflate(R.layout.tab_progress, null); progress.setVisibility(View.VISIBLE); return new UpdateView.UpdateViewHolder(progress); } return super.onCreateViewHolder(parent, viewType); } @Override public int getItemViewType(int position) { if (isLoadingView(position)) { return VIEW_TYPE_LOADING; } return super.getItemViewType(position); } @Override public void onBindViewHolder(UpdateView.UpdateViewHolder holder, int position) { if (!isLoadingView(position)) { super.onBindViewHolder(holder, position); } } @Override public int getItemCount() { int size = super.getItemCount(); if (!allLoaded) { size++; } return size; } public void setData(String type, String extra, int size) { this.type = type; this.extra = extra; this.size = size; if (super.getItemCount() < size) { allLoaded = true; } } public void loadMore() { if (loading || allLoaded) { return; } loading = true; new SilentBackgroundTask(context) { private List newData; @Override protected Void doInBackground() throws Throwable { newData = cacheInBackground(); return null; } @Override protected void done(Void result) { appendCachedData(newData); loading = false; if (newData.size() < size) { allLoaded = true; notifyDataSetChanged(); } } }.execute(); } private List cacheInBackground() throws Exception { MusicService service = MusicServiceFactory.getMusicService(context); MusicDirectory result; int offset = sections.get(0).size(); if ("genres".equals(type) || "years".equals(type)) { result = service.getAlbumList(type, extra, size, offset, false, context, null); } else if ("genres".equals(type) || "genres-songs".equals(type)) { result = service.getSongsByGenre(extra, size, offset, context, null); } else if (type.contains(MainFragment.SONGS_LIST_PREFIX)) { result = service.getSongList(type, size, offset, context, null); } else { result = service.getAlbumList(type, size, offset, false, context, null); } return result.getChildren(); } private void appendCachedData(List newData) { if (newData.size() > 0) { int start = sections.get(0).size(); sections.get(0).addAll(newData); this.notifyItemRangeInserted(start, newData.size()); } } private boolean isLoadingView(int position) { return !allLoaded && position >= sections.get(0).size(); } }