package com.sound.ampache.ui; import android.os.Handler; import android.os.Message; import android.os.Messenger; import android.util.Log; import com.sound.ampache.amdroid; import com.sound.ampache.net.AmpacheApiAction; import com.sound.ampache.objects.Directive; import com.sound.ampache.objects.ampacheObject; import java.util.ArrayList; /** * Created by dejvino on 3.11.14. */ class AmpacheListHandler extends Handler { public static final int AMPACHE_INIT_REQUEST = 0x1336; public static final int AMPACHE_INC_REQUEST = 0x1337; public static final int ENQUEUE_SONG = 0x1339; private AmpacheListView ampacheListView; public boolean stopIncFetch = false; public boolean isFetching = false; private Directive lastDirective; public AmpacheListHandler(AmpacheListView ampacheListView) { this.ampacheListView = ampacheListView; } public void setIsFetching(boolean val) { if (isFetching != val) { isFetching = val; ampacheListView.onIsFetchingChange(isFetching); } } public void enqueMessage(int what, Directive directive, int startIndex, boolean addHistory) { ampacheListView.onEnqueMessage(what, directive, startIndex, addHistory); if (isFetching && what == AMPACHE_INIT_REQUEST) { stopIncFetch = true; } if (what != ENQUEUE_SONG) { setIsFetching(true); lastDirective = directive; } Message requestMsg = this.obtainMessage(); requestMsg.arg1 = startIndex; requestMsg.obj = directive; requestMsg.what = what; // tell it how to handle the stuff requestMsg.replyTo = new Messenger(this); Log.d("AmpacheAmdroidList", "Sending message: " + requestMsg.toString()); amdroid.networkClient.sendMessage(requestMsg); } @Override public void handleMessage(Message msg) { Log.d("AmpacheAmdroidList", "Handling message: " + msg.toString()); if (msg.what == AMPACHE_INIT_REQUEST || msg.what == AMPACHE_INC_REQUEST) { if (stopIncFetch && msg.what == AMPACHE_INC_REQUEST) { return; } // Clear the collection adapter in case we have received "leftovers" if (msg.what == AMPACHE_INIT_REQUEST) { ampacheListView.onClearAmpacheObjects(); stopIncFetch = false; } // Update our list with the received data ArrayList<ampacheObject> aList = (ArrayList<ampacheObject>) msg.obj; ampacheListView.onAddAmpacheObjects(aList); // queue up a new inc fetch if we did not receive 100 results. 100 is the limit set // in AmpacheApiClient if (lastDirective.action != AmpacheApiAction.STATS && aList.size() >= 100) { enqueMessage(AMPACHE_INC_REQUEST, lastDirective, msg.arg1 + 100, false); } else { setIsFetching(false); } } else if (msg.what == ENQUEUE_SONG) { amdroid.playbackControl.addAllPlaylistCurrent((ArrayList) msg.obj); } else { // Handle error } } }