package com.ringtone.music;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.ringtone.music.download.DownloadActivity;
import com.ringtone.music.download.DownloadJson;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
public class SingerList extends ListActivity implements OnItemClickListener {
private static SingerList sSingerList;
private static int NEW_SINGERS_NUMBER = 3;
private static int HOT_SINGERS_NUMBER = 3;
private static String AllSingerURL="http://ringtone-superstar.s3.amazonaws.com/all.txt";
private static String HotSingerURL="http://ringtone-superstar.s3.amazonaws.com/hot.txt";
private ProgressBar mProgressBar;
private TextView mSearchMessage;
private static ArrayList<SingerInfo> sData = new ArrayList<SingerInfo>();
private SingerListAdapter mAdapter;
private static FetchSingerListTask sFetchSingerListTask;
private static String sKeyword;
private static String sType;
private static boolean sNoData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sSingerList = this;
setContentView(R.layout.singer_list);
Utils.addAds(this);
mProgressBar = (ProgressBar) findViewById(R.id.singer_search_progress);
mSearchMessage = (TextView) findViewById(R.id.singer_search_message);
mAdapter = new SingerListAdapter(SingerList.this,R.layout.singer_item);
setListAdapter(mAdapter);
getListView().setOnItemClickListener(this);
if (sData == null){
mProgressBar.setVisibility(View.VISIBLE);
mSearchMessage.setVisibility(View.VISIBLE);
}
Bundle myExtras = getIntent().getExtras();
String keyword = myExtras.getString("keyword");
String type = myExtras.getString("type");
startQuery(SingerList.this, keyword, type);
}
@Override
protected void onDestroy() {
super.onDestroy();
sSingerList = null;
sData = null;
}
private final class SingerListAdapter extends BaseAdapter {
private int mResource;
private LayoutInflater mInflater;
public SingerListAdapter(Context context,int resource){
mResource = resource;
mInflater = (LayoutInflater)context.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
if (sData == null) return 0;
else return sData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
if (sData == null) return null;
return sData.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v;
Object item = sData.get(position);
if (convertView == null){
v = mInflater.inflate(mResource,parent,false);
} else {
v = convertView;
}
SingerInfo info = (SingerInfo) item;
ImageView iv=(ImageView) v.findViewById(R.id.singer_image);
TextView txt=(TextView) v.findViewById(R.id.singer_name);
switch (info.getType()) {
case SingerInfo.MATCH_SINGER_LIST_SINGER:
iv.setImageResource(R.drawable.puzzle_green);
break;
case SingerInfo.HOT_SINGER_LIST_SINGER:
iv.setImageResource(R.drawable.puzzle_red);
break;
case SingerInfo.NEW_SINGER_LIST_SINGER:
iv.setImageResource(R.drawable.puzzle_yellow);
break;
case SingerInfo.MATCH_SINGER_LIST_TITLE:
iv.setImageResource(R.drawable.singer_match);
txt.setTextColor(Color.rgb(157, 205, 105));
break;
case SingerInfo.NEW_SINGER_LIST_TITLE:
iv.setImageResource(R.drawable.singer_new);
txt.setTextColor(Color.rgb(252,191,10));
break;
case SingerInfo.HOT_SINGER_LIST_TITLE:
iv.setImageResource(R.drawable.singer_hot);
txt.setTextColor(Color.rgb(236,111,33));
break;
case SingerInfo.ALL_SINGER_LIST_SINGER:
iv.setImageResource(R.drawable.hot);
break;
default:
break;
}
txt.setText(info.getSingerName());
return v;
}
}
private static class FetchSingerListTask extends AsyncTask<Void, Void, Void> {
Context mContext;
public FetchSingerListTask(Context context){
super();
mContext = context;
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
if (sSingerList != null){
sSingerList.getlist();
}
return null;
}
@Override
protected void onPostExecute(Void v) {
if (sFetchSingerListTask != this) {
return;
}
sFetchSingerListTask = null;
if (sSingerList != null){
sSingerList.handleSearchResult();
}
}
}
private void handleSearchResult(){
if (sNoData==true) {
mProgressBar.setVisibility(View.GONE);
mSearchMessage.setVisibility(View.VISIBLE);
mSearchMessage.setText("No Data Found");
return;
}
mProgressBar.setVisibility(View.GONE);
mSearchMessage.setVisibility(View.GONE);
if (sSingerList!=null)
sSingerList.notifyDataSetInvalidated();
getListView().setFocusable(true);
getListView().requestFocus();
}
private ArrayList<SingerInfo> getlist(){
if (sData == null) sData = new ArrayList<SingerInfo>();
// String allsingerdata=DownloadJson.readFile(new File("/sdcard/ringtonehelper/superstar/json/json.txt"));
// String hotsingerdata=DownloadJson.readFile(new File("/sdcard/ringtonehelper/superstar/json/hot.txt"));
if (sType!=null && sType.equals("allsingers")){
try {
// JSONObject allSingerObj=new JSONObject(allsingerdata);
JSONObject allSingerObj=DownloadJson.getJsonFromUrl(AllSingerURL, DownloadJson.ThreeAndAHalfDays);
if (allSingerObj == null) {
sNoData=true;
return null;
}
JSONArray mAllSingerList = allSingerObj.getJSONArray("superstar");
for(int i = 0; i < mAllSingerList.length(); i++) {
JSONArray item = mAllSingerList.getJSONArray(i);
SingerInfo info = new SingerInfo(SingerInfo.ALL_SINGER_LIST_SINGER,item.getString(1),item.getString(0));
boolean exist=false;
for (SingerInfo d : sData) {
if (d.getSingerName().equals(info.getSingerName())) {
exist=true;
break;
}
}
if (!exist) sData.add(info);
}
if (sData.size() == 0) {
sNoData=true;
return null;
}
/* 显示所有时排序 */
Collections.sort(sData, new CompareSingerInfo());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
sNoData=true;
return null;
}
} else {
try {
// JSONObject allSingerObj=new JSONObject(allsingerdata);
// JSONObject hotSingerObj=new JSONObject(hotsingerdata);
JSONObject allSingerObj=DownloadJson.getJsonFromUrl(AllSingerURL, DownloadJson.ThreeAndAHalfDays);
JSONObject hotSingerObj=DownloadJson.getJsonFromUrl(HotSingerURL, DownloadJson.ThreeAndAHalfDays);
if (allSingerObj == null || hotSingerObj == null) {
sNoData=true;
return null;
}
JSONArray mAllSingerList = allSingerObj.getJSONArray("superstar");
JSONArray hotSingerList = hotSingerObj.getJSONArray("hot");
JSONArray newSingerList = hotSingerObj.getJSONArray("new");
ArrayList<SingerInfo> primaryList = new ArrayList<SingerInfo>();
for(int i = 0; i < mAllSingerList.length(); i++) {
JSONArray item = mAllSingerList.getJSONArray(i);
if (item == null) continue;
String primary = item.getString(2);
if (isMatch(sKeyword, primary)) {
SingerInfo info = new SingerInfo(SingerInfo.HOT_SINGER_LIST_SINGER,item.getString(1),item.getString(0));
primaryList.add(info);
}
}
ArrayList<SingerInfo> secondaryList = new ArrayList<SingerInfo>();
for(int i = 0; i < mAllSingerList.length(); i++) {
JSONArray item = mAllSingerList.getJSONArray(i);
if (item == null) continue;
String secondary = item.getString(3);
if (isMatch(sKeyword, secondary)) {
SingerInfo info = new SingerInfo(SingerInfo.HOT_SINGER_LIST_SINGER,item.getString(1),item.getString(0));
secondaryList.add(info);
}
}
if (primaryList.size()!=0 || secondaryList.size()!=0){
SingerInfo info=new SingerInfo(SingerInfo.MATCH_SINGER_LIST_TITLE, "","The most similar singers");
sData.add(info);
for (int i=0;i<primaryList.size();i++){
SingerInfo primaryinfo = new SingerInfo(SingerInfo.MATCH_SINGER_LIST_SINGER,
primaryList.get(i).getPackageName(),
primaryList.get(i).getSingerName());
boolean exist=false;
for (SingerInfo d : sData) {
if (d.getSingerName().equals(primaryinfo.getSingerName())) {
exist=true;
break;
}
}
if (!exist) sData.add(primaryinfo);
}
for (int i=0;i<secondaryList.size();i++){
SingerInfo secondaryinfo = new SingerInfo(SingerInfo.MATCH_SINGER_LIST_SINGER,
secondaryList.get(i).getPackageName(),
secondaryList.get(i).getSingerName());
boolean exist=false;
for (SingerInfo d : sData) {
if (d.getSingerName().equals(secondaryinfo.getSingerName())) {
exist=true;
break;
}
}
if (!exist) sData.add(secondaryinfo);
}
} else {
SingerInfo info=new SingerInfo(SingerInfo.MATCH_SINGER_LIST_TITLE, "","No match singer");
sData.add(info);
}
if (newSingerList.length() != 0){
SingerInfo info=new SingerInfo(SingerInfo.NEW_SINGER_LIST_TITLE, "","New singers");
sData.add(info);
Random rd=new Random();
int listlong = newSingerList.length();
for (int i=0,j=0;i<listlong*2 && j< NEW_SINGERS_NUMBER;i++){
int off=Math.abs(rd.nextInt()) % listlong;
JSONArray item = newSingerList.getJSONArray(off);
SingerInfo newinfo = new SingerInfo(SingerInfo.NEW_SINGER_LIST_SINGER,item.getString(1),item.getString(0));
boolean exist=false;
for (SingerInfo d : sData) {
if (d.getSingerName().equals(newinfo.getSingerName())) {
exist=true;
break;
}
}
if (!exist) {
sData.add(newinfo);
j++;
}
}
}
if (hotSingerList.length() != 0){
SingerInfo info=new SingerInfo(SingerInfo.HOT_SINGER_LIST_TITLE, "","Hot singers");
sData.add(info);
Random rd=new Random();
int listlong = hotSingerList.length();
for (int i=0,j=0;i<listlong*2 && j< HOT_SINGERS_NUMBER;i++){
int off=Math.abs(rd.nextInt()) % listlong;
JSONArray item = hotSingerList.getJSONArray(off);
SingerInfo hotinfo = new SingerInfo(SingerInfo.HOT_SINGER_LIST_SINGER,item.getString(1),item.getString(0));
boolean exist=false;
for (SingerInfo d : sData) {
if (d.getSingerName().equals(hotinfo.getSingerName())) {
exist=true;
break;
}
}
if (!exist) {
sData.add(hotinfo);
j++;
}
}
}
}catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
sNoData=true;
return null;
}
}
return null;
}
private boolean isMatch(String keyword,String filter){
if (keyword == null || filter == null) return false;
String sKeyword = keyword.toLowerCase();
String[] sFilters = filter.toLowerCase().split("\\|");
for (int i=0;i<sFilters.length;i++){
String key = sFilters[i];
if (key == null || key.length() ==0 ) continue;
if (sKeyword.contains(key)) return true;
}
return false;
}
private class SingerInfo {
private static final int MATCH_SINGER_LIST_TITLE = 0;
private static final int HOT_SINGER_LIST_TITLE = 1;
private static final int NEW_SINGER_LIST_TITLE = 2;
private static final int MATCH_SINGER_LIST_SINGER = 3;
private static final int HOT_SINGER_LIST_SINGER = 4;
private static final int NEW_SINGER_LIST_SINGER = 5;
private static final int ALL_SINGER_LIST_SINGER = 6;
private int mType;
private String mPackageName;
private String mSingerName;
public SingerInfo(int type,String packagename,String singername){
mType=type;
mPackageName=packagename;
mSingerName=singername;
}
public int getType() {
return mType;
}
public String getPackageName() {
return mPackageName;
}
public String getSingerName() {
return mSingerName;
}
@Override
public boolean equals(Object o) {
SingerInfo info=(SingerInfo) o;
if (info.getPackageName() == mPackageName)
return true;
return false;
}
}
private class CompareSingerInfo implements Comparator {
@Override
public int compare(Object object1, Object object2) {
// TODO Auto-generated method stub
SingerInfo singer1 = (SingerInfo) object1;
SingerInfo singer2 = (SingerInfo) object2;
return singer1.getSingerName().compareTo(singer2.getSingerName());
}
}
public static void startQuery(Context context,String keyword,String type){
if (!TextUtils.isEmpty(keyword) || !TextUtils.isEmpty(type)) {
sKeyword=keyword;
sType=type;
sData = null;
sNoData = false;
if (sSingerList!=null)
sSingerList.notifyDataSetInvalidated();
if (sFetchSingerListTask != null)
sFetchSingerListTask.cancel(true);
sFetchSingerListTask = new FetchSingerListTask(context);
sFetchSingerListTask.execute();
} else {
sData = null;
sFetchSingerListTask = null;
}
}
private void notifyDataSetInvalidated(){
if (mAdapter != null)
mAdapter.notifyDataSetInvalidated();
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
int type=sData.get(position).getType();
if (type!=SingerInfo.ALL_SINGER_LIST_SINGER
&& type!=SingerInfo.MATCH_SINGER_LIST_SINGER
&& type!=SingerInfo.HOT_SINGER_LIST_SINGER
&& type!=SingerInfo.NEW_SINGER_LIST_SINGER)
return;
String url = "market://search?q=pname:" + sData.get(position).getPackageName();
try {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}