/* * Copyright 2013 Prateek Srivastava (@f2prateek) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.f2prateek.xkcd.ui; import android.content.Context; import android.os.Bundle; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.TextSwitcher; import android.widget.TextView; import butterknife.InjectView; import butterknife.Views; import com.crashlytics.android.Crashlytics; import com.f2prateek.xkcd.ComicCountUpdatedEvent; import com.f2prateek.xkcd.R; import com.f2prateek.xkcd.XKCDApi; import com.f2prateek.xkcd.model.Comic; import com.f2prateek.xkcd.ui.base.BaseListFragment; import com.f2prateek.xkcd.ui.util.BindingAdapter; import com.f2prateek.xkcd.util.Ln; import com.squareup.otto.Subscribe; import javax.inject.Inject; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; public class ListComicFragment extends BaseListFragment { @Inject XKCDApi xkcdApi; public static ListComicFragment newInstance() { return new ListComicFragment(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Subscribe public void onComicCountUpdated(ComicCountUpdatedEvent comicCountUpdatedEvent) { if (comicCountUpdatedEvent.comicCount > 0) { setListAdapter(new SimpleComicGridAdapter(getActivity(), comicCountUpdatedEvent.comicCount)); } } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Comic comic = (Comic) getListAdapter().getItem(position); bus.post(new OnComicClickedEvent(comic)); } public static class OnComicClickedEvent { public final Comic comic; public OnComicClickedEvent(Comic comic) { this.comic = comic; } } class SimpleComicGridAdapter extends BindingAdapter { private final int comicCount; private final SparseArray<Comic> comicsCache; SimpleComicGridAdapter(Context context, int comicCount) { super(context); this.comicCount = comicCount; comicsCache = new SparseArray<Comic>(comicCount); } @Override public View newView(LayoutInflater inflater, int type, ViewGroup parent) { View view = inflater.inflate(R.layout.simple_comic_list_item, parent, false); ViewHolder holder = new ViewHolder(view); view.setTag(holder); holder.title.setInAnimation(getContext(), android.R.anim.slide_in_left); holder.title.setOutAnimation(getContext(), android.R.anim.slide_out_right); // provide two TextViews for the TextSwitcher to use // you can apply styles to these Views before adding holder.title.addView(new TextView(getContext())); holder.title.addView(new TextView(getContext())); return view; } @Override public void bindView(int position, int type, final View view) { int comicNumber = (int) getItemId(position); Comic comic = comicsCache.get(comicNumber); if (comic == null) { xkcdApi.getComic(comicNumber, new Callback<Comic>() { @Override public void success(Comic comic, Response response) { comicsCache.put(comic.getNum(), comic); bindComic(view, comic); } @Override public void failure(RetrofitError retrofitError) { Throwable error = retrofitError.getCause(); Crashlytics.logException(error); Ln.e(error); } }); } else { bindComic(view, comic); } } public void bindComic(View view, Comic comic) { final ViewHolder holder = (ViewHolder) view.getTag(); holder.title.setText("# " + comic.getNum() + ". " + comic.getSafe_title()); } @Override public int getCount() { return comicCount; } @Override public Object getItem(int position) { return comicsCache.get((int) getItemId(position)); } @Override public long getItemId(int position) { return getCount() - position; } class ViewHolder { @InjectView(R.id.comic_title) TextSwitcher title; public ViewHolder(View view) { Views.inject(this, view); } } } }