package com.feebe.rings; import java.io.BufferedInputStream; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; import java.util.List; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import com.feebe.lib.AdListener; import com.feebe.lib.BaseList; import com.feebe.lib.DbAdapter; import com.feebe.lib.EndlessUrlArrayAdapter; import com.feebe.lib.HmacMd5; import com.feebe.lib.ImgThread; import com.feebe.lib.UrlArrayAdapter; import com.feebe.lib.Util; import android.app.AlertDialog; import android.app.Dialog; import android.app.ListActivity; import android.app.ProgressDialog; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.Handler; import android.provider.SearchRecentSuggestions; import android.util.Log; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.ContextMenu.ContextMenuInfo; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; public class SearchList extends ListActivity implements OnItemClickListener { private final static String TAG = "SearchList"; private static final int PROGRESS_DIALOG = 0; private int currentPage = 0; private ProgressDialog waitDialog; final Handler uiHandler = new Handler(); private boolean dedup_ = true; private boolean auth = true; @Override public void onCreate(Bundle savedInstanceState) { Const.init(this); //android.util.// // Log.e("init", "" + Const.main != null); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.list); AdListener.createAds(this); final ListView list = getListView(); SearchListFooterView footer = new SearchListFooterView(this); list.addFooterView(footer); setListAdapter(getAdapter()); list.setDividerHeight(1); list.setFocusable(true); // list.setOnCreateContextMenuListener(this); list.setTextFilterEnabled(true); list.setOnItemClickListener(this); ImageButton btnPre = footer.getBtnPre(); ImageButton btnNext = footer.getBtnNext(); btnPre.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(currentPage <= 0) Toast.makeText(getApplicationContext(), "No pre page", Toast.LENGTH_LONG).show(); else { currentPage--; mAdapter.clear(); //mAdapter.reset(); mAdapter.runSyn(mAdapter.getUrl(currentPage), Const.OneWeek); mAdapter.notifyDataSetChanged(); } } }); btnNext.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { currentPage++; try { showDialog(PROGRESS_DIALOG); } catch (Exception e) { } new Thread( new Runnable() { public void run() { final List list = mAdapter.getListFromUrl(mAdapter.getUrl(currentPage), Const.OneWeek); if(list == null) { currentPage--; uiHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "No next page", Toast.LENGTH_LONG).show(); } }); } else { uiHandler.post(new Runnable() { @Override public void run() { mAdapter.clear(); mAdapter.runList(list); mAdapter.notifyDataSetChanged(); } }); } waitDialog.dismiss(); } } ).start(); } }); } public ListAdapter getAdapter() { new ImgThread(getListView()); Intent i = this.getIntent(); reloadUrl = getUrlFromIntent(i); long expire = i.getLongExtra(Const.expire, 0); dedup_ = i.getBooleanExtra(Const.USEDEDUP, true); auth = i.getBooleanExtra(Const.AUTH, true); mAdapter = new SearchResultAdapter(this, R.layout.searchlist_row); if(!Util.inCache(reloadUrl, expire)) showDialog(PROGRESS_DIALOG); return mAdapter; } @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { SearchResult ring; try { ring = mAdapter.getItem(pos); } catch (Exception e) { return; } Search.startRing(this, Search.getRingUrl(ring.key)); } public static class SearchResult{ String title; String artist; String key; String image; String rating; public SearchResult(String title, String artist, String key, String image, String rating) { super(); this.title = title; this.artist = artist; this.key = key; this.image = image; this.rating = rating; } }; @Override public boolean onSearchRequested() { startSearch(this.getString(R.string.search_hint), true, null, false); return true; } private String getUrlFromIntent(final Intent intent) { String url = null; final String action = intent.getAction(); if (Intent.ACTION_SEARCH.equals(action)) { String key = intent.getStringExtra(SearchManager.QUERY); url = Search.getSearchKeyUrl(key); try { Const.dbAdapter.intsertHistory(key, DbAdapter.TYPE_SEARCH); } catch (Exception e) { Const.dbAdapter = new DbAdapter(this); Const.dbAdapter.intsertHistory(key, DbAdapter.TYPE_SEARCH); } } else if (Intent.ACTION_VIEW.equals(action)){ // Get from suggestions url = Search.getSearchKeyUrl(intent.getDataString()); } else { url = intent.getStringExtra(Const.searchurl); } return url; } // this should not be null private String reloadUrl; @Override public void onNewIntent(final Intent intent) { super.onNewIntent(intent); reloadUrl = getUrlFromIntent(intent); if(reloadUrl == null) return; else { mAdapter.clear(); mAdapter.reset(); } } public class SearchResultAdapter extends UrlArrayAdapter<SearchResult, SearchViewWp> { public SearchResultAdapter(Context context, int resource) { super(context, resource); useDedup_ = dedup_; reset(); } public void reset() { runAsyn(getUrl(currentPage), Const.OneWeek); } @Override public SearchResult getT(Object o) { try { JSONObject obj = (JSONObject) o; String title = obj.getString(Const.title); String artist = obj.getString(Const.artist); String key = obj.getString(Const.key); String image = obj.getString(Const.image); String rating = obj.getString(Const.rating); if (key != null && (title != null || artist != null )) { return new SearchResult(title, artist, key, image, rating); } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override public SearchViewWp getWrapper(View v) { return new SearchViewWp(v); } @Override public void applyWrapper(SearchResult item, SearchViewWp w, boolean newView) { if (item.title != null) { w.name.setText(item.title); } if (item.artist != null) { w.artist.setText(item.artist); } if (item.rating != null) { int ratingNum = Integer.parseInt(item.rating); if (ratingNum < 60){ w.rating.setRating(1); }else if (ratingNum < 70){ w.rating.setRating(2); }else if (ratingNum < 80){ w.rating.setRating(3); }else if (ratingNum < 90){ w.rating.setRating(4); }else w.rating.setRating(5); } if (item.image != null && item.image.length() > 0) { w.setUrl("http://s.heiguge.com/" + item.image); if (newView) { w.download(); } } } protected String getUrl(int page) { if (page == 0) { return reloadUrl; } String url; if (reloadUrl.indexOf('?') != -1) { url = reloadUrl + "&start=" +page*15; } else { url = reloadUrl + "?start=" +page*15; } return url; } @Override protected List getListFromUrl(String url, long expire) { if(auth) { return RingUtil.getJsonArrayFromUrl(Search.auth(url), expire); } else { return RingUtil.getJsonArrayFromUrl(url, expire); } } @Override protected void onNoResult() { if(!reloadUrl.contains("start=") && reloadUrl.contains("artist=") && reloadUrl.contains("&q=")) { reloadUrl = reloadUrl.substring(0, reloadUrl.indexOf("&q=")); mAdapter.clear(); mAdapter.reset(); } else { super.onNoResult(); finish(); } } @Override protected void dismissProgressDialog() { if(waitDialog != null && waitDialog.isShowing()) dismissDialog(PROGRESS_DIALOG); } } protected Dialog onCreateDialog(int id) { switch(id) { case PROGRESS_DIALOG: waitDialog = new ProgressDialog(SearchList.this); waitDialog.setTitle("Please wait"); waitDialog.setMessage("Getting ringtone"); waitDialog.setIndeterminate(true); return waitDialog; default: return null; } } private SearchResultAdapter mAdapter; }