package com.feebee.rings;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.feebe.lib.AdListener;
import com.feebe.lib.DefaultDownloadListener;
import com.feebe.lib.DownloadImg;
import com.feebe.lib.DownloadFile;
import com.feebe.lib.Util;
import com.feebee.rings.R;
import com.lib.RingSelect;
import com.ringdroid.RingdroidSelectActivity;
import entagged.audioformats.AudioFile;
import entagged.audioformats.AudioFileIO;
import entagged.audioformats.exceptions.CannotReadException;
import entagged.audioformats.exceptions.CannotWriteException;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Browser;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.RatingBar.OnRatingBarChangeListener;
public class RingActivity extends Activity {
private final static String TAG = "RingActivity";
private class RingDownloadListener extends DefaultDownloadListener {
public RingDownloadListener(Context context, Intent intent, boolean isBackground) {
super(context, intent, title, isBackground);
}
@Override
public void onDownloadFail() {
super.onDownloadFail();
Toast.makeText(
RingActivity.this, R.string.notification_text_failed, Toast.LENGTH_SHORT).show();
}
@Override
public void onDownloadFinish(File file, Uri u) {
super.onDownloadFinish(file, u);
//// Log.e("onDownloadFinish", file.getAbsolutePath());
mp3Location = file.getAbsolutePath();
mCurrentFileUri = u;
jsonLocation = Const.jsondir + file.getName();
// TODO: reload download ring page
RingActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
if (!isBackground()) {
initFinishDownloadButton();
}
}
});
}
@Override
public void onDownloadProgress(int percentage) {
super.onDownloadProgress(percentage);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//requestWindowFeature(Window.FEATURE_NO_TITLE);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setTitle(R.string.ring_activity_title);
setContentView(R.layout.ring);
AdListener.createAds(this);
iconImageView = (ImageView) findViewById(R.id.row_icon);
titleTextView = (TextView) findViewById(R.id.row_title);
artistTextView = (TextView) findViewById(R.id.row_artist);
ratingBar = (RatingBar) findViewById(R.id.row_small_ratingbar);
largeRatingBar = (RatingBar) findViewById(R.id.ratingBar);
detailInfo = (TextView) findViewById(R.id.info_text);
listSearchOthers = (ListView) findViewById(R.id.list_searchOthers);
dl = (Button)this.findViewById(R.id.download);
mPreview = (Button)this.findViewById(R.id.preview);
dl.setOnClickListener(dlClick);
mPreview.setOnClickListener(previewClick);
queue = (Button)this.findViewById(R.id.queue);
dl.setClickable(false);
mPreview.setClickable(false);
queue.setClickable(false);
largeRatingBar.setIsIndicator(true);
largeRatingBar.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
@Override
public void onRatingChanged(RatingBar largeRatingBar, float rating,
boolean fromUser) {
if(key!="" && jsonLocation != null) {
String ratingUrl = Const.RatingBase + key + "?score=" + rating*20;
try {
URL url = new URL(ratingUrl);
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection();
urlConn.setConnectTimeout(4000);
urlConn.connect();
urlConn.disconnect();
// Log.d(TAG, ratingUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
if (ring_.has(myRating)) {
ring_.remove(myRating);
}
try {
ring_.put(Const.myRating, rating);
Util.saveFile(ring_.toString(), jsonLocation);
} catch (JSONException e) {
// // Log.e(TAG, "put myRating "+ rating);
}
}
}
});
String json = getIntent().getStringExtra(Const.searchurl);
if (!json.startsWith("http")) {
jsonLocation = json;
}
new FetchJsonTask().execute(json);
}
private static final int RING_PICKER = 1;
private void initFinishDownloadButton() {
queue.setVisibility(View.GONE);
dl.setText(R.string.play);
mSet = (Button)this.findViewById(R.id.set);
mSet.setVisibility(View.VISIBLE);
mSet.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog(RING_PICKER);
}
});
largeRatingBar.setIsIndicator(false);
mAssign = (Button)this.findViewById(R.id.assign);
mAssign.setVisibility(View.VISIBLE);
mAssign.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
try {
if (mCurrentFileUri == null) {
mCurrentFileUri = Uri.parse(ring_.getString(Const.mp3));
}
// Log.e("u", " uri " + mCurrentFileUri.toString() + " mp3 " + ring.getString(Const.mp3));
intent.setData(mCurrentFileUri);
intent.setClass(RingActivity.this, com.ringdroid.ChooseContactActivity.class);
RingActivity.this.startActivity(intent);
} catch (JSONException e) {
// // Log.e("assign", e.getMessage());
}
}
});
mEdit = (Button) findViewById(R.id.edit);
mEdit.setVisibility(View.VISIBLE);
mEdit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO edit ringtone
try {
String filePath = ring_.getString("filePath");
Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse(filePath));
intent.putExtra("was_get_content_intent",false);
intent.setClassName(RingActivity.this,"com.lib.RingEditor");
startActivity(intent);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
mShare = (Button) findViewById(R.id.share);
mShare.setVisibility(View.VISIBLE);
mShare.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new AlertDialog.Builder(RingActivity.this)
.setTitle(R.string.alertdialog_share)
.setItems(R.array.select_share_methods, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch(which) {
case 0:
Intent sms = new Intent(Intent.ACTION_VIEW);
sms.putExtra("sms_body",
RingActivity.this.getString(R.string.share_sms1) + " " +
title+ " " + RingActivity.this.getString(R.string.share_sms2)+ "\n" +
key.substring(0, key.length() - 7)+ "\n" +
RingActivity.this.getString(R.string.share_sms3)
);
sms.setType("vnd.android-dir/mms-sms");
startActivity(sms);
break;
case 1:
Intent mEmailIntent = new Intent(android.content.Intent.ACTION_SEND);
mEmailIntent.setType("plain/text");
mEmailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
title);
mEmailIntent.putExtra(android.content.Intent.EXTRA_TEXT,
RingActivity.this.getString(R.string.share_sms1) + " " + title + " " +
RingActivity.this.getString(R.string.share_sms2) + "\n" +
key.substring(0, key.length() - 7) + "\n" +
RingActivity.this.getString(R.string.share_sms3));
startActivity(Intent.createChooser(mEmailIntent, artist));
break;
case 2:
Browser.sendString(RingActivity.this, RingActivity.this.getString(R.string.share_sms1) + title + RingActivity.this.getString(R.string.share_sms2) + artist);
}
}
}).create().show();
}
});
mPreview.setVisibility(View.GONE);
layoutMyReview = (LinearLayout) findViewById(R.id.layoutMyReview);
layoutMyReview.setVisibility(View.VISIBLE);
}
OnClickListener dlClick = new OnClickListener() {
@Override
public void onClick(View v) {
if(mPlayer != null && mPlayer.isPlaying()) {
mPlayer.pause();
isPaused = true;
dl.setText(R.string.play);
return;
}
if (mp3Location.startsWith("http:")) {
ringDownloadListener = new RingDownloadListener(RingActivity.this, notificationIntent, false);
download(ringDownloadListener);
saveArtist();
} else if(isPaused) {
isPaused = false;
dl.setText(R.string.pause);
mPlayer.start();
} else{
// TODO: play
try {
filePath = ring_.getString("filePath");
} catch (JSONException e1) {
// // Log.e(TAG, "error read mp3 file");
}
try {
mPlayer.setDataSource(filePath);
mPlayer.prepare();
mPlayer.start();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
isPaused = false;
dl.setText(R.string.play);
mPlayer.reset();
}
});
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
dl.setText(R.string.pause);
// // Log.e("mp3", mp3Location);
}
}
};
ProgressDialog mStreaming;
OnClickListener previewClick = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO play online
if(mp3Location.startsWith("http:")) {
if (mStreaming == null) {
mStreaming = new ProgressDialog(RingActivity.this);
mStreaming.setTitle(R.string.mStreaming_title);
mStreaming.setMessage(RingActivity.this.getString(R.string.mStreaming_message));
mStreaming.setIndeterminate(true);
mStreaming.setCancelable(true);
mStreaming.setButton(RingActivity.this.getString(R.string.stop), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
previewPlayer.stop();
}
});
}
mStreaming.show();
new Thread(new Runnable() {
@Override
public void run() {
try {
previewPlayer.setDataSource(mp3Location);
previewPlayer.prepare();
previewPlayer.start();
previewPlayer.setOnCompletionListener(new OnCompletionListener () {
@Override
public void onCompletion(MediaPlayer mp) {
try {
mStreaming.dismiss();
} catch (Exception e) {
}
}
});
} catch (IllegalArgumentException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
}
}).start();
}
}
};
private void saveArtist() {
if (this.artist.length() > 0) {
// TODO: save artist
SharedPreferences s = getSharedPreferences(Const.artist, 0);
Editor e = s.edit();
e.putBoolean(artist, true);
e.commit();
}
}
private int ring_button_type;
// private String[] ringTypes = {"Ringtone","Notification","Alarm"};
@Override
protected Dialog onCreateDialog(int id) {
if (id == RING_PICKER) {
return new AlertDialog.Builder(this)
.setIcon(android.R.drawable.ic_dialog_alert)
.setTitle(R.string.ring_picker_title)
.setSingleChoiceItems(R.array.ring_types, 0, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
ring_button_type = whichButton;
}
})
.setPositiveButton(R.string.alertdialog_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
int ring_type;
if (ring_button_type == 0) {
ring_type = RingtoneManager.TYPE_RINGTONE;
} else if (ring_button_type == 1) {
ring_type = RingtoneManager.TYPE_NOTIFICATION;
} else {
ring_type = RingtoneManager.TYPE_ALARM;
}
//String u;
try {
//u = Const.mp3dir + ring.getString(Const.mp3);
if (mCurrentFileUri == null) {
mCurrentFileUri = Uri.parse(ring_.getString(Const.mp3));
}
RingtoneManager.setActualDefaultRingtoneUri(RingActivity.this, ring_type, mCurrentFileUri);
//add to system library
if(ring_type == RingtoneManager.TYPE_RINGTONE) {
Settings.System.putString(getContentResolver(), Settings.System.RINGTONE, mCurrentFileUri.toString());
try {
ContentValues values = new ContentValues(2);
values.put(MediaStore.Audio.Media.IS_RINGTONE, "1");
values.put(MediaStore.Audio.Media.IS_ALARM, "1");
getContentResolver().update(mCurrentFileUri, values, null, null);
} catch (UnsupportedOperationException ex) {
// most likely the card just got unmounted
return;
}
}
if(ring_type == RingtoneManager.TYPE_NOTIFICATION) {
Settings.System.putString(getContentResolver(), Settings.System.NOTIFICATION_SOUND, mCurrentFileUri.toString());
try {
ContentValues values = new ContentValues(2);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, "1");
values.put(MediaStore.Audio.Media.IS_ALARM, "1");
getContentResolver().update(mCurrentFileUri, values, null, null);
} catch (UnsupportedOperationException ex) {
// most likely the card just got unmounted
return;
}
}
if(ring_type == RingtoneManager.TYPE_ALARM) {
Settings.System.putString(getContentResolver(), Settings.System.ALARM_ALERT, mCurrentFileUri.toString());
try {
ContentValues values = new ContentValues(2);
values.put(MediaStore.Audio.Media.IS_ALARM, "1");
getContentResolver().update(mCurrentFileUri, values, null, null);
} catch (UnsupportedOperationException ex) {
// most likely the card just got unmounted
return;
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
})
.setNegativeButton(R.string.alertdialog_cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
})
.create();
}
return null;
}
private static int[] fileKinds =
new int[]{Const.FILE_KIND_RINGTONE,Const.FILE_KIND_NOTIFICATION,Const.FILE_KIND_ALARM};
private void download(RingDownloadListener listerner) {
int lastPos = mp3Location.lastIndexOf('.');
String extension = mp3Location.substring(lastPos);
// // Log.e("path", fullpathame);
DownloadFile df = new RingDownloadFile(
listerner, 512,mp3Size, category, artist, title, this.getContentResolver(), fileKinds, ring_);
df.execute(mp3Location, Const.getMp3FilePath(artist, title, extension));
}
@Override
public void onStop() {
if(mPlayer != null && mPlayer.isPlaying()) {
mPlayer.pause();
isPaused = true;
dl.setText(R.string.play);
}
if(previewPlayer != null && previewPlayer.isPlaying())
previewPlayer.stop();
super.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
// TODO: cancel download
}
private class FetchJsonTask extends AsyncTask<String, Void, JSONObject> {
@Override
protected void onPreExecute() {
setProgressBarIndeterminateVisibility(true);
}
@Override
protected JSONObject doInBackground(String... params) {
String jsonLocation = params[0];
JSONObject ring = Search.getRingJson(jsonLocation);
if(ring == null)
finish();
return ring;
}
@Override
protected void onPostExecute(JSONObject ring) {
if (ring == null) return;
try {
ring_ = ring;
category = ring.getString(Const.category);
download = ring.getString(Const.download);
author = ring.getString(Const.author);
artist = ring.getString(Const.artist);
rating = ring.getString(Const.rating);
title = ring.getString(Const.title);
key = ring.getString(Const.key);
mp3Location = ring.getString(Const.mp3);
mp3Size = ring.getInt(Const.size);
titleTextView.setText(title);
artistTextView.setText(artist);
detailInfo.append(download + " " + RingActivity.this.getString(R.string.info_download_count) + "\n");
detailInfo.append(RingActivity.this.getString(R.string.info_auther) + " " + author + "\n");
detailInfo.append(RingActivity.this.getString(R.string.info_category) + " " + category);
if(rating.length()>0) {
int ratingNum = Integer.parseInt(rating);
if (ratingNum < 60){
ratingBar.setRating(1);
}else if (ratingNum < 70){
ratingBar.setRating(2);
}else if (ratingNum < 80){
ratingBar.setRating(3);
}else if (ratingNum < 90){
ratingBar.setRating(4);
}else
ratingBar.setRating(5);
}
String imgUrl = ring.getString(Const.image);
if (imgUrl != null && imgUrl.length() > 0)
new DownloadImg(iconImageView).execute(imgUrl);
} catch (JSONException e) {
return;
}
if(ring.has(Const.myRating)){
try {
myRating = ring.getString(Const.myRating);
largeRatingBar.setRating(Float.parseFloat(myRating));
} catch (JSONException e) {
e.printStackTrace();
}
}
ArrayList<HashMap<String, String>> ringlist = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map1 = new HashMap<String, String>();
HashMap<String, String> map2 = new HashMap<String, String>();
HashMap<String, String> map3 = new HashMap<String, String>();
HashMap<String, String> map4 = new HashMap<String, String>();
HashMap<String, String> map5 = new HashMap<String, String>();
map1.put("ItemTitle", RingActivity.this.getString(R.string.search_more) + " " + artist);
map2.put("ItemTitle", RingActivity.this.getString(R.string.search_more_by) + " " + author);
map3.put("ItemTitle", RingActivity.this.getString(R.string.search_more_in) + " " + category);
map4.put("ItemTitle", RingActivity.this.getString(R.string.search_more) + " " + title);
map5.put("ItemTitle", RingActivity.this.getString(R.string.view_more_about) + " " + artist);
ringlist.add(map1);
ringlist.add(map2);
ringlist.add(map3);
ringlist.add(map4);
ringlist.add(map5);
SimpleAdapter mSearchOthers = new SimpleAdapter(RingActivity.this,
ringlist,
R.layout.ring_list_item,
new String[] {"ItemTitle"},
new int[] {R.id.ringListItem1});
listSearchOthers.setAdapter(mSearchOthers);
listSearchOthers.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// TODO Auto-generated method stub
switch(position){
case 0: Search.getArtistRing(RingActivity.this, artist);
return;
case 1: Search.getAuthorRing(RingActivity.this, author);
return;
case 2: Search.getCate(RingActivity.this, category);
return;
case 3: Search.getTitleRing(RingActivity.this, title);
return;
case 4:
Intent intent = new Intent();
String url = "http://ggapp.appspot.com/mobile/artist/" + artist;
intent.putExtra("url", url);
intent.setClass(RingActivity.this, WebViewActivity.class);
startActivity(intent);
return;
}
}
});
if (!mp3Location.startsWith("http:")) {
initFinishDownloadButton();
} else {
queue.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// save json file
Toast.makeText(
RingActivity.this, R.string.queue, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RingActivity.this ,RingSelect.class);
ringDownloadListener = new RingDownloadListener(RingActivity.this, intent, true);
download(ringDownloadListener);
saveArtist();
finish();
//Const.downloadDb.insert(values);
// TODO: start new intent to launch download queue view
// pass json file to the download view, so that when download finish, it will get it
}
});
}
dl.setClickable(true);
mPreview.setClickable(true);
queue.setClickable(true);
setProgressBarIndeterminateVisibility(false);
}
}
private Uri mCurrentFileUri;
private JSONObject ring_;
private String mp3Location;
private String jsonLocation;
private Button mSet;
private Button mAssign;
private Button dl;
private Button queue;
private Button mEdit;
private Button mShare;
private Button mPreview;
private ImageView iconImageView;
private TextView titleTextView;
private TextView artistTextView;
private TextView detailInfo;
private ListView listSearchOthers;
private RatingBar ratingBar;
private RatingBar largeRatingBar;
private LinearLayout layoutMyReview;
MediaPlayer mPlayer = new MediaPlayer();;
MediaPlayer previewPlayer = new MediaPlayer();
boolean isPaused = false;
String category = "";
String download = "";
String artist = "";
String author = "";
String size = "";
String rating = "";
public String title = "";
String key = "";
String myRating = "";
String filePath = "";
int mp3Size;
private Intent notificationIntent;
RingDownloadListener ringDownloadListener;
}