/* * Copyright 2014 Bevbot LLC <info@bevbot.com> * * This file is part of the Kegtab package from the Kegbot project. For * more information on Kegtab or Kegbot, see <http://kegbot.org/>. * * Kegtab 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, version 2. * * Kegtab 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 Kegtab. If not, see <http://www.gnu.org/licenses/>. */ package org.kegbot.app; import android.content.AsyncTaskLoader; import android.content.Context; import android.os.SystemClock; import android.util.Log; import com.google.common.collect.Lists; import org.kegbot.backend.Backend; import org.kegbot.backend.BackendException; import org.kegbot.core.KegbotCore; import org.kegbot.proto.Models.User; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.concurrent.TimeUnit; /** * @author mike wakerly (mike@wakerly.com) */ public class UserDetailListLoader extends AsyncTaskLoader<List<User>> { private static final String TAG = UserDetailListLoader.class.getSimpleName(); private Backend mApi; private final List<User> mUsers = Lists.newArrayList(); private final long MAX_LOAD_AGE_MILLIS = TimeUnit.SECONDS.toMillis(15); private long mLastLoadMillis = 0; private static Comparator<User> USERS_ALPHABETIC = new Comparator<User>() { @Override public int compare(User object1, User object2) { return object1.getUsername().toLowerCase().compareTo( object2.getUsername().toLowerCase()); } }; /** * @param context */ public UserDetailListLoader(Context context) { super(context); mApi = KegbotCore.getInstance(context).getBackend(); } @Override public List<User> loadInBackground() { Log.d(TAG, "loadInBackground"); try { final List<User> result = mApi.getUsers(); mUsers.clear(); mUsers.addAll(result); Collections.sort(mUsers, USERS_ALPHABETIC); return mUsers; } catch (BackendException e) { // TODO(mikey): retry? Log.d(TAG, "Error loading. ", e); return Lists.newArrayList(); } } @Override protected void onStartLoading() { Log.d(TAG, "onStartLoading"); final long now = SystemClock.uptimeMillis(); if ((now - mLastLoadMillis) > MAX_LOAD_AGE_MILLIS) { Log.d(TAG, "Forcing load, mLastLoadMillis=" + mLastLoadMillis); mLastLoadMillis = now; forceLoad(); } else { Log.d(TAG, "delivering cached results"); deliverResult(mUsers); } } @Override protected void onReset() { Log.d(TAG, "onReset"); super.onReset(); onStopLoading(); } /** * Handles a request to stop the Loader. */ @Override protected void onStopLoading() { // Attempt to cancel the current load task if possible. cancelLoad(); } }