content: /*
    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 <http://www.gnu.org/licenses/>.
      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<Entry> 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<Void>(context) {
              private List<Entry> 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<Entry> 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<Entry> 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();
      }
  }
  