package com.cinla.ringtone; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import org.json.JSONException; import org.json.JSONObject; import com.cinla.imageloader.ImageLoader; import com.connect.facebook.Login; import com.facebook.android.AsyncFacebookRunner; import com.facebook.android.Facebook; import com.facebook.android.FacebookError; import com.ringdroid.R; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentValues; import android.content.DialogInterface; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; 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.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.RatingBar; import android.widget.RatingBar.OnRatingBarChangeListener; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; public class MusicPageActivity extends Activity { public static final int DLG_RING_PICKER = 0; private static PreviewMusic sPreviewMusic; private MusicInfo mMusicInfo; private DownloadMusicTask mDownloadTask; private Button mPreviewButton; private Button mDownloadButton; private Button mSetButton; private Button mAssignButton; private Button mShareButton; private Button mEditButton; private ImageButton mFacebookButton; private RatingBar mRatingBar; private Facebook mFacebook; private AsyncFacebookRunner mAsyncRunner; private ListView mSearchMoreList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.music_page); AdListener.createAds(this, R.id.button_group); mMusicInfo = (MusicInfo) getIntent().getSerializableExtra(Constant.MUSIC_INFO); ImageView imageView = (ImageView) findViewById(R.id.image); ImageLoader.initialize(MusicPageActivity.this); ImageLoader.start(mMusicInfo.getmImageUrl(), imageView); ((TextView)findViewById(R.id.title)).setText(mMusicInfo.getmTitle()); ((TextView)findViewById(R.id.artist)).setText(mMusicInfo.getmArtist()); ((TextView)findViewById(R.id.download_count)).setText(getString(R.string.download_count)+" "+Integer.toString(mMusicInfo.getmDownloadCount())); ((RatingBar)findViewById(R.id.avg_ratingbar)).setRating((int)mMusicInfo.getmRate()/20); mSearchMoreList = (ListView)findViewById(R.id.search_more_list); fillSearchMoreList(); mPreviewButton = ((Button)findViewById(R.id.preview_button)); mPreviewButton.setOnClickListener(new PreviewClickListener()); mDownloadButton = ((Button)findViewById(R.id.download_button)); mDownloadButton.setOnClickListener(new DownloadClickListener()); mSetButton = ((Button)findViewById(R.id.set_button)); mSetButton.setOnClickListener(new SetClickListener()); mShareButton = ((Button)findViewById(R.id.share_button)); mShareButton.setOnClickListener(new ShareClickListener()); mAssignButton = (Button)findViewById(R.id.assign_button); mAssignButton.setOnClickListener(new AssignClickListener()); mEditButton = (Button)findViewById(R.id.edit_button); mEditButton.setOnClickListener(new EditClickListener()); mRatingBar = (RatingBar)findViewById(R.id.user_ratingbar); mRatingBar.setOnRatingBarChangeListener(new UserRatingBarChangeListener()); mFacebookButton = (ImageButton) findViewById(R.id.shear_facebook_button); mFacebookButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mFacebook = new Facebook(); mAsyncRunner = new AsyncFacebookRunner(mFacebook); com.connect.facebook.SessionStore.restore(mFacebook, MusicPageActivity.this); if (!mFacebook.isSessionValid()) { final String[] PERMISSIONS = new String[] {"publish_stream", "read_stream", "offline_access"}; Login loginFacbook = new Login(mFacebook, PERMISSIONS, MusicPageActivity.this); loginFacbook.LoginFacebook(); } else { new AlertDialog.Builder(MusicPageActivity.this) .setMessage("Post ringtone to your Facebook?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Bundle params = new Bundle(); params.putString("method", "links.post"); params.putString("comment", "share a ringtone app for Android with you:"); //String realKey = key.substring(key.lastIndexOf("/")+1, key.indexOf("?")); params.putString("url", "https://market.android.com/details?id=com.latest.ringtone"); //params.putString("link", "http://ringtonepromote.appspot.com/?key=" + realKey); mAsyncRunner.request(null, params, "POST", new WallPostRequestListener()); } }) .setNeutralButton("No", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } } }); updateUI(); } private void fillSearchMoreList() { ArrayList<HashMap<String, String>> moreListItems = new ArrayList<HashMap<String,String>>(); HashMap<String, String> map1 = new HashMap<String, String>(); HashMap<String, String> map2 = new HashMap<String, String>(); map1.put(Constant.ITEM_TITLE, getString(R.string.search_more)+" "+mMusicInfo.getmArtist()); map2.put(Constant.ITEM_TITLE, getString(R.string.search_more_in)+" "+mMusicInfo.getmCategory()); moreListItems.add(map1); moreListItems.add(map2); SimpleAdapter simpleAdapter = new SimpleAdapter(this, moreListItems, R.layout.search_more_list_item, new String[] {Constant.ITEM_TITLE}, new int[] {R.id.search_more_item}); mSearchMoreList.setAdapter(simpleAdapter); simpleAdapter.notifyDataSetChanged(); mSearchMoreList.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { switch (arg2) { case 0: SearchListActivity.startQueryByArtist(MusicPageActivity.this, mMusicInfo.getmArtist()); break; case 1: SearchListActivity.startQueryByCategory(MusicPageActivity.this, mMusicInfo.getmCategory()); break; default: break; } } }); } public static void startMusicPageActivity(Activity activity, MusicInfo musicInfo) { Intent intent = new Intent(activity, MusicPageActivity.class); intent.putExtra(Constant.MUSIC_INFO, musicInfo); activity.startActivity(intent); } private class DownloadClickListener implements View.OnClickListener { @Override public void onClick(View v) { if (mDownloadTask == null) { mDownloadTask = new DownloadMusicTask(MusicPageActivity.this, mMusicInfo); mDownloadTask.execute(); } else { mDownloadTask.showProgressDialog(); } } } private class PreviewClickListener implements View.OnClickListener { @Override public void onClick(View v) { if (sPreviewMusic != null) { sPreviewMusic.stopPlay(); sPreviewMusic = null; sPreviewMusic = new PreviewMusic(MusicPageActivity.this, mMusicInfo, mMusicInfo.getmDownloadedPath()); } else { if (sPreviewMusic==null) sPreviewMusic = new PreviewMusic(MusicPageActivity.this, mMusicInfo, mMusicInfo.getmDownloadedPath()); } Utils.D("Downloaded path: "+mMusicInfo.getmDownloadedPath()); sPreviewMusic.startPlay(); } } private class SetClickListener implements View.OnClickListener { @Override public void onClick(View v) { showDialog(DLG_RING_PICKER); } } private class ShareClickListener implements View.OnClickListener { @Override public void onClick(View v) { new AlertDialog.Builder(MusicPageActivity.this) .setTitle(R.string.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", MusicPageActivity.this.getString(R.string.share_sms1) + " " + mMusicInfo.getmTitle()+ " " + MusicPageActivity.this.getString(R.string.share_sms2)+ "\n" + mMusicInfo.getmMp3Url()+ "\n" + MusicPageActivity.this.getString(R.string.share_sms3) ); sms.setType("vnd.android-dir/mms-sms"); startActivity(sms); break; case 1: Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("plain/text"); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, mMusicInfo.getmTitle()); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, MusicPageActivity.this.getString(R.string.share_sms1) + " " + mMusicInfo.getmTitle() + " " + MusicPageActivity.this.getString(R.string.share_sms2) + "\n" + mMusicInfo.getmMp3Url() + "\n" + MusicPageActivity.this.getString(R.string.share_sms3)); startActivity(Intent.createChooser(emailIntent, mMusicInfo.getmArtist())); break; case 2: Browser.sendString(MusicPageActivity.this, MusicPageActivity.this.getString(R.string.share_sms1) + mMusicInfo.getmTitle() + MusicPageActivity.this.getString(R.string.share_sms2) + mMusicInfo.getmArtist()); } } }).create().show(); } } private class AssignClickListener implements View.OnClickListener { @Override public void onClick(View v) { Intent intent = new Intent(MusicPageActivity.this, com.ringdroid.ChooseContactActivity.class); intent.setData(Uri.parse(mMusicInfo.getmDownloadedUri())); startActivity(intent); } } private class EditClickListener implements View.OnClickListener { @Override public void onClick(View v) { String filePath = mMusicInfo.getmDownloadedPath(); Intent intent = new Intent(Intent.ACTION_EDIT, Uri.parse(filePath)); intent.putExtra("was_get_content_intent",false); intent.setClassName(MusicPageActivity.this, "com.ringdroidlib.RingEditorActivity"); startActivity(intent); } } private class UserRatingBarChangeListener implements OnRatingBarChangeListener { @Override public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) { Utils.D("rate success?: "+Utils.rateSong(mMusicInfo.getmUuid(), rating)); } } public void onDownloadFinish(File downloadedFile, Uri downloadedUri) { if (mDownloadTask != null) { mDownloadTask.cancel(true); mDownloadTask = null; } if (downloadedFile != null) { mMusicInfo.setmDownloadedPath(downloadedFile.getAbsolutePath()); mMusicInfo.setmDownloadedUri(downloadedUri.toString()); mDownloadButton.setText(this.getString(R.string.edit)); } else { } updateUI(); } public void onHideProgressDialog() { mDownloadButton.setText(R.string.show); } private int ring_button_type; @Override protected Dialog onCreateDialog(int id) { switch (id) { case DLG_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.ok, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { final 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 { if(Utils.isCupcakeOrBefore()) { new Thread() { public void run() { //copy mp3 to ringtone directory File file = new File(mMusicInfo.getmDownloadedPath()); String newFileName; if(ring_type == RingtoneManager.TYPE_ALARM) newFileName = "/sdcard/media/audio/alarms/" + file.getName(); else if(ring_type == RingtoneManager.TYPE_NOTIFICATION) newFileName = "/sdcard/media/audio/notifications/" + file.getName(); else newFileName = "/sdcard/media/audio/ringtones/" + file.getName();; File newFile = new File(newFileName); try { java.io.FileInputStream in = new java.io.FileInputStream(file); java.io.FileOutputStream out = new java.io.FileOutputStream(newFile); byte bt[] = new byte[1024]; int c; while ( (c = in.read(bt)) > 0) { out.write(bt, 0, c); } in.close(); out.close(); }catch (Exception e) { } //set ringtone long fileSize = newFile.length(); String mimeType = "audio/mpeg"; String artist = "Ringtone"; ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DATA, newFile.getAbsolutePath()); values.put(MediaStore.MediaColumns.TITLE, mMusicInfo.getmTitle().toString()); values.put(MediaStore.MediaColumns.SIZE, fileSize); values.put(MediaStore.MediaColumns.MIME_TYPE, mimeType); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); // Insert it into the database Uri uri = MediaStore.Audio.Media.getContentUriForPath(newFile.getAbsolutePath()); final Uri newUri = getContentResolver().insert(uri, values); RingtoneManager.setActualDefaultRingtoneUri(MusicPageActivity.this, ring_type, newUri); } }.start(); } else { //Uri currentFileUri = MediaStore.Audio.Media.getContentUriForPath(mDownloadedPath); RingtoneManager.setActualDefaultRingtoneUri(MusicPageActivity.this, ring_type, Uri.parse(mMusicInfo.getmDownloadedUri())); //add to system library if(ring_type == RingtoneManager.TYPE_RINGTONE) { Settings.System.putString(getContentResolver(), Settings.System.RINGTONE, mMusicInfo.getmDownloadedUri()); try { ContentValues values = new ContentValues(2); values.put(MediaStore.Audio.Media.IS_RINGTONE, true); values.put(MediaStore.Audio.Media.IS_ALARM, true); getContentResolver().update(Uri.parse(mMusicInfo.getmDownloadedUri()), values, null, null); } catch (UnsupportedOperationException ex) { // most likely the card just got unmounted return; } catch (IllegalArgumentException e) { Toast.makeText(MusicPageActivity.this, R.string.notification_text_failed, Toast.LENGTH_SHORT); return; } } if(ring_type == RingtoneManager.TYPE_NOTIFICATION) { Settings.System.putString(getContentResolver(), Settings.System.NOTIFICATION_SOUND, mMusicInfo.getmDownloadedUri()); try { ContentValues values = new ContentValues(2); values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true); values.put(MediaStore.Audio.Media.IS_ALARM, true); getContentResolver().update(Uri.parse(mMusicInfo.getmDownloadedUri()), values, null, null); } catch (UnsupportedOperationException ex) { // most likely the card just got unmounted return; } catch (IllegalArgumentException e) { Toast.makeText(MusicPageActivity.this, R.string.notification_text_failed, Toast.LENGTH_SHORT); return; } } if(ring_type == RingtoneManager.TYPE_ALARM) { Settings.System.putString(getContentResolver(), Settings.System.ALARM_ALERT, mMusicInfo.getmDownloadedUri()); try { ContentValues values = new ContentValues(2); values.put(MediaStore.Audio.Media.IS_ALARM, true); getContentResolver().update(Uri.parse(mMusicInfo.getmDownloadedUri()), values, null, null); } catch (UnsupportedOperationException ex) { // most likely the card just got unmounted return; } catch (IllegalArgumentException e) { Toast.makeText(MusicPageActivity.this, R.string.notification_text_failed, Toast.LENGTH_SHORT); return; } } } } catch (Exception e) { Utils.D("exception in set"); Utils.D(e.getMessage()); e.printStackTrace(); } } }) .setNegativeButton(R.string.alertdialog_cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }) .create(); default: break; } return super.onCreateDialog(id); } private void updateUI() { if (mMusicInfo.getmDownloadedPath()!=null && mMusicInfo.getmDownloadedPath().length()>0) { mPreviewButton.setText(R.string.play); mDownloadButton.setVisibility(View.GONE); mEditButton.setVisibility(View.VISIBLE); mSetButton.setVisibility(View.VISIBLE); mAssignButton.setVisibility(View.VISIBLE); mFacebookButton.setVisibility(View.VISIBLE); } else { mPreviewButton.setText(R.string.preview); mDownloadButton.setVisibility(View.VISIBLE); mEditButton.setVisibility(View.GONE); mSetButton.setVisibility(View.GONE); mAssignButton.setVisibility(View.GONE); mFacebookButton.setVisibility(View.GONE); } } //facebook public class WallPostRequestListener extends com.connect.facebook.BaseRequestListener { public void onComplete(final String response) { Utils.D("Facebook-Example"+" Got response: " + response); String message = "<empty>"; try { JSONObject json = com.facebook.android.Util.parseJson(response); message = json.getString("message"); } catch (JSONException e) { Utils.D("Facebook-Example "+" JSON Error in response"); } catch (FacebookError e) { Utils.D("Facebook-Example" +" Facebook Error: " + e.getMessage()); } final String text = "Your Wall Post: " + message; Utils.D(text); } } }