From 8977192207cc9de859479c42d2845efe31d5bbd9 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Fri, 14 Oct 2011 23:17:09 -0500 Subject: [PATCH 01/10] Major stability changes: 1. Most all Force Close's are gone. Small Functional Changes: 1. Put the service in charge of going to the next song. 2. Added a custom broadcast and receiver to handle song changes a. Using the asynctask caused references to become "stale" when configurations changed Minor cosmetic changes: 1. Increased album imageview size 2. Added a custom landscape layout 3. Increased Text size. Bugs: 1. If you log out while in the player, restart the app, and log back in there's a bug in the pandora api that I can't seem to track down that causes getStations in PandoraRadio.java to return null from a XMLRPCFaultException. Only a complete kill/FC of the app seems to fix it. 2. Probably others --- res/layout-land/player.xml | 94 +++++++ res/layout/player.xml | 40 +-- res/layout/stations_item.xml | 2 +- res/menu/station_select_menu.xml | 4 + res/values/strings.xml | 2 + .../android/pandoid/PandoidPlayer.java | 259 +++++++++++++----- .../pandoid/PandoidStationCreator.java | 7 + .../android/pandoid/PandoidStationSelect.java | 17 +- .../aregner/android/pandoid/PandoraDB.java | 4 +- .../android/pandoid/PandoraRadioService.java | 44 +-- 10 files changed, 356 insertions(+), 117 deletions(-) create mode 100644 res/layout-land/player.xml create mode 100644 res/menu/station_select_menu.xml create mode 100644 src/com/aregner/android/pandoid/PandoidStationCreator.java diff --git a/res/layout-land/player.xml b/res/layout-land/player.xml new file mode 100644 index 0000000..f6ddd47 --- /dev/null +++ b/res/layout-land/player.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/player.xml b/res/layout/player.xml index ded3af9..5e6cf45 100644 --- a/res/layout/player.xml +++ b/res/layout/player.xml @@ -3,44 +3,50 @@ android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> - - - + - + + - + + + android:width="60dip" android:textSize="20sp" android:layout_toRightOf="@+id/station_list"> - + android:width="60dip" android:textSize="20sp"> - + android:width="60dip" android:textSize="20sp"> - + android:width="60dip" android:textSize="20sp"> diff --git a/res/layout/stations_item.xml b/res/layout/stations_item.xml index 96be11f..8cc04e6 100644 --- a/res/layout/stations_item.xml +++ b/res/layout/stations_item.xml @@ -8,6 +8,6 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:padding="10dp" - android:textSize="16sp" android:id="@+id/stations_name"> + android:textSize="8pt" android:id="@+id/stations_name"> \ No newline at end of file diff --git a/res/menu/station_select_menu.xml b/res/menu/station_select_menu.xml new file mode 100644 index 0000000..4e7757b --- /dev/null +++ b/res/menu/station_select_menu.xml @@ -0,0 +1,4 @@ + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index f4fd2d3..38c7837 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6,4 +6,6 @@ Loading %s... Buzz-kill... Rock on! + No song currently playing... + Loading next song... diff --git a/src/com/aregner/android/pandoid/PandoidPlayer.java b/src/com/aregner/android/pandoid/PandoidPlayer.java index 88e41c8..03ca169 100644 --- a/src/com/aregner/android/pandoid/PandoidPlayer.java +++ b/src/com/aregner/android/pandoid/PandoidPlayer.java @@ -17,28 +17,32 @@ */ package com.aregner.android.pandoid; +import com.aregner.android.pandoid.PandoraRadioService; import com.aregner.pandora.Song; import android.app.Activity; -import android.app.Dialog; import android.app.ProgressDialog; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.SharedPreferences; -import android.media.MediaPlayer; -import android.media.MediaPlayer.OnCompletionListener; -import android.media.MediaPlayer.OnPreparedListener; +import android.content.pm.ActivityInfo; import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; +import android.util.Log; +import android.view.Display; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.WindowManager; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; - public class PandoidPlayer extends Activity { public static final int REQUIRE_SELECT_STATION = 0x10; @@ -50,33 +54,48 @@ public class PandoidPlayer extends Activity { private static ProgressDialog waiting; private PandoraRadioService pandora; private SharedPreferences prefs; + private boolean initialLogin = false; private ImageDownloader imageDownloader = new ImageDownloader(); + + private static String LOG_TAG = "PandoidPlayer"; + private static String SETUP_TAG = "InitialSetupTask"; + private static String STATION_TAG = "PlayStationTask"; + + IntentFilter intentFilter = new IntentFilter(); + private BroadcastReceiver receiver = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + Log.i(LOG_TAG, "Song Change Broadcast Received"); + updateForNewSong(); + } + }; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { + Log.i(LOG_TAG, "Activity Created"); super.onCreate(savedInstanceState); setContentView(R.layout.player); - - if(PandoraRadioService.getInstance(false) == null) { - // handle for the preferences for us to use everywhere - prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); - + + // handle for the preferences for us to use everywhere + prefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); + + pandora = PandoraRadioService.getInstance(false); + if(pandora == null) { + Log.i(LOG_TAG, "Service is null. Getting credentials from prefs"); // look for what we need to continue with pandora auth String username = prefs.getString("pandora_username", null); String password = prefs.getString("pandora_password", null); if(username == null || password == null) { // bring them to the login screen so they can enter what we need + Log.i(LOG_TAG, "Calling PandoidLogin.class"); + initialLogin = true; startActivityForResult(new Intent(getApplicationContext(), PandoidLogin.class), REQUIRE_LOGIN_CREDS); } } - else { - pandora = PandoraRadioService.getInstance(false); - updateForNewSong(pandora.getCurrentSong()); - } } - @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); @@ -84,68 +103,122 @@ public boolean onCreateOptionsMenu(Menu menu) { return true; } - @Override - protected void onStart() { - super.onStart(); - } - @Override protected void onResume() { super.onResume(); - // The activity has become visible (it is now "resumed"). - serviceSetup(); + Log.i(LOG_TAG, "Resuming Activity..."); + + Log.i(LOG_TAG, "Registering Receiver..."); + intentFilter.addAction(PandoraRadioService.SONG_CHANGE); + registerReceiver(receiver, intentFilter); + + if(!initialLogin){ + serviceSetup(); + } + + updateForNewSong(); } private void serviceSetup() { if(pandora == null || !(pandora instanceof PandoraRadioService)) { - (new InitialSetupTask()).execute(); + Log.i(LOG_TAG, "Executing InitialSetupTask"); + new InitialSetupTask().execute(); } } - protected void updateForNewSong(Song song) { - TextView top = (TextView) findViewById(R.id.player_topText); - TextView bottom = (TextView) findViewById(R.id.player_bottomText); - ImageView image = (ImageView) findViewById(R.id.player_image); - - top.setText(String.format("%s by %s", song.getTitle(), song.getArtist())); - imageDownloader.download(song.getAlbumCoverUrl(), image); - bottom.setText(String.format("%s", song.getAlbum())); + protected void updateForNewSong() { + + if(pandora != null && pandora.isPlayable() && pandora.isPlaying()){ + + Log.i(LOG_TAG, "updateForNewSong() called.."); + + Song song = pandora.getCurrentSong(); + + TextView top = (TextView) findViewById(R.id.player_topText); + TextView bottom = (TextView) findViewById(R.id.player_bottomText); + ImageView image = (ImageView) findViewById(R.id.player_image); + + top.setText(String.format("%s by %s", song.getTitle(), song.getArtist())); + imageDownloader.download(song.getAlbumCoverUrl(), image); + bottom.setText(String.format("%s", song.getAlbum())); + } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == REQUIRE_SELECT_STATION && resultCode == RESULT_OK) { + Log.i(LOG_TAG, "PandoraStationSelect returned with result_ok"); pandora.setCurrentStationId(data.getLongExtra("stationId", -1)); - (new PlayStationTask()).execute(); + new PlayStationTask().execute(); } else if(requestCode == REQUIRE_LOGIN_CREDS && resultCode == RESULT_OK) { + Log.i(LOG_TAG, "PandoraLogin.class returned ok..."); serviceSetup(); } +/** else if(requestCode == REQUIRE_LOGIN_CREDS && resultCode != RESULT_OK ) { + Log.i(LOG_TAG, "PandoidLogin.class returned with bad result. finishing activity"); + finish(); + }*/ } public void controlButtonPressed(View button) { + String toastMessage; + switch(button.getId()) { - case R.id.player_ban: - pandora.rate(RATING_BAN); - Toast.makeText(getApplicationContext(), getString(R.string.baned_song), Toast.LENGTH_SHORT).show(); - if(prefs.getBoolean("behave_nextOnBan", true)) { - updateForNewSong(pandora.next()); - } - break; - - case R.id.player_love: - pandora.rate(RATING_LOVE); - Toast.makeText(getApplicationContext(), getString(R.string.loved_song), Toast.LENGTH_SHORT).show(); - break; - - case R.id.player_pause: - pandora.pause(); - break; + case R.id.station_list: + startActivityForResult(new Intent(getApplicationContext(), PandoidStationSelect.class), REQUIRE_SELECT_STATION); + break; + + case R.id.player_ban: + if(pandora.isPlaying()) { + pandora.rate(RATING_BAN); + toastMessage = getString(R.string.baned_song); + if(prefs.getBoolean("behave_nextOnBan", true)) { + new PlayNextTask().execute(); + } + } + else { + toastMessage = getString(R.string.no_song); + } + Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT).show(); + break; + + case R.id.player_love: + if(pandora.isPlaying()){ + pandora.rate(RATING_LOVE); + toastMessage = getString(R.string.loved_song); + } + else { + toastMessage = getString(R.string.no_song); + } + Toast.makeText(getApplicationContext(), toastMessage, Toast.LENGTH_SHORT).show(); + break; + + case R.id.player_pause: + if(pandora.isPlayable()){ + if(pandora.isPlaying()){ + ((Button)button).setText(">"); + } + else { + ((Button)button).setText("||"); + } + pandora.pause(); + } + else { + startActivityForResult(new Intent(PandoidPlayer.this, PandoidStationSelect.class), REQUIRE_SELECT_STATION); + } + break; - case R.id.player_next: - updateForNewSong(pandora.next()); - break; + + case R.id.player_next: + if(pandora.isPlayable()) { + new PlayNextTask().execute(); + } + else { + startActivityForResult(new Intent(PandoidPlayer.this, PandoidStationSelect.class), REQUIRE_SELECT_STATION); + } + break; } } @@ -163,7 +236,8 @@ public boolean onOptionsItemSelected(MenuItem item) { .putString("pandora_username", null) .putString("pandora_password", null) .commit(); - startActivityForResult(new Intent(getApplicationContext(), PandoidLogin.class), REQUIRE_LOGIN_CREDS); + finish(); + //startActivityForResult(new Intent(getApplicationContext(), PandoidLogin.class), REQUIRE_LOGIN_CREDS); return true; case R.id.menu_settings: @@ -177,23 +251,27 @@ public boolean onOptionsItemSelected(MenuItem item) { /** Signs in the user and loads their initial data * -> brings them toward a station */ - private class InitialSetupTask extends AsyncTask { + class InitialSetupTask extends AsyncTask{ @Override protected void onPreExecute() { - waiting = ProgressDialog.show(PandoidPlayer.this, "", getString(R.string.signing_in)); + Log.i(SETUP_TAG,"Starting task..."); + lockOrientation(); + waiting = ProgressDialog.show(PandoidPlayer.this, "", getString(R.string.signing_in)); } @Override protected Boolean doInBackground(Void... arg) { - PandoraRadioService.createPandoraRadioService(getApplicationContext()); + PandoraRadioService.createPandoraRadioService(PandoidPlayer.this); pandora = PandoraRadioService.getInstance(true); String username = prefs.getString("pandora_username", null); String password = prefs.getString("pandora_password", null); try { + Log.i(SETUP_TAG, "Attempting to sign in using prefs credentials..."); pandora.signIn(username, password); } catch(Exception ex) { + Log.e(SETUP_TAG, "Failed to sign in...", ex); ex.printStackTrace(); } return pandora.isAlive(); @@ -201,26 +279,32 @@ protected Boolean doInBackground(Void... arg) { @Override protected void onPostExecute(Boolean result) { - + + Log.i(SETUP_TAG, "Finished signin...checking results"); + Log.i(SETUP_TAG, "calling dismissWaiting()"); + unlockOrientation(); dismissWaiting(); - if(result.booleanValue()) { - + if(result.booleanValue() && result) { + Log.i(SETUP_TAG, "Sign in success..."); if(!pandora.isPlaying()) { if(pandora.isPlayable()) { // play it or resume playback or something smart like that + Log.i(SETUP_TAG, "Calling new PlayStationTask..."); (new PlayStationTask()).execute(); } else { // ask them to select a station - startActivityForResult(new Intent(getApplicationContext(), PandoidStationSelect.class), REQUIRE_SELECT_STATION); + Log.i(SETUP_TAG, "Need station. Calling PandoidStationSelect.class..."); + startActivityForResult(new Intent(PandoidPlayer.this, PandoidStationSelect.class), REQUIRE_SELECT_STATION); } } } else { // failed to sign in for some reason - Toast.makeText(getApplicationContext(), getString(R.string.signin_failed), Toast.LENGTH_SHORT).show(); + Log.e(SETUP_TAG, "Sign in failed...Calling PandoidLogin.class"); + Toast.makeText(PandoidPlayer.this, getString(R.string.signin_failed), Toast.LENGTH_SHORT).show(); startActivityForResult(new Intent(getApplicationContext(), PandoidLogin.class), REQUIRE_LOGIN_CREDS); } } @@ -230,46 +314,75 @@ protected void onPostExecute(Boolean result) { private class PlayStationTask extends AsyncTask { @Override protected void onPreExecute() { + Log.i(STATION_TAG, "Starting...ataching activity"); + lockOrientation(); waiting = ProgressDialog.show(PandoidPlayer.this, "", getString(R.string.loading, pandora.getCurrentStation().getName())); } @Override protected Void doInBackground(Void... arg0) { - pandora.setListener(OnCompletionListener.class, new OnCompletionListener() { - public void onCompletion(MediaPlayer mp) { - updateForNewSong(pandora.next()); - } - }); - pandora.setListener(OnPreparedListener.class, new OnPreparedListener() { - public void onPrepared(MediaPlayer mp) { - } - }); pandora.prepare(); - + return null; } @Override protected void onPostExecute(Void result) { - updateForNewSong(pandora.play()); + Log.i(STATION_TAG, "In postExecute"); + unlockOrientation(); + pandora.play(); dismissWaiting(); } + } + class PlayNextTask extends AsyncTask{ + + @Override + protected void onPreExecute() { + lockOrientation(); + waiting = ProgressDialog.show(PandoidPlayer.this, "", getString(R.string.next_song)); + } + @Override + protected Void doInBackground(Void ...voids) { + pandora.next(); + return null; + } + @Override + protected void onPostExecute(Void result) { + unlockOrientation(); + dismissWaiting(); + } } - public static void dismissWaiting() { if(waiting != null && waiting.isShowing()) { + Log.i(LOG_TAG, "Called dismissWaiting() with positive result."); waiting.dismiss(); } } + + public void lockOrientation() { + this.setRequestedOrientation(getResources().getConfiguration().orientation); + Log.i(LOG_TAG, "Locking orientation: " + getResources().getConfiguration().orientation ); + } + public void unlockOrientation() { + this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); + Log.i(LOG_TAG, "Unlocking orientation: " + getResources().getConfiguration().orientation); + } @Override protected void onPause() { super.onPause(); - // Another activity is taking focus (this activity is about to be "paused"). + unregisterReceiver(receiver); + dismissWaiting(); } @Override protected void onStop() { super.onStop(); + dismissWaiting(); + } + @Override + protected void onDestroy() { + super.onDestroy(); + dismissWaiting(); } } \ No newline at end of file diff --git a/src/com/aregner/android/pandoid/PandoidStationCreator.java b/src/com/aregner/android/pandoid/PandoidStationCreator.java new file mode 100644 index 0000000..e4d8ae1 --- /dev/null +++ b/src/com/aregner/android/pandoid/PandoidStationCreator.java @@ -0,0 +1,7 @@ +package com.aregner.android.pandoid; + +import android.app.Activity; + +public class PandoidStationCreator extends Activity { +//to-do +} diff --git a/src/com/aregner/android/pandoid/PandoidStationSelect.java b/src/com/aregner/android/pandoid/PandoidStationSelect.java index 62e7560..58e8f1e 100644 --- a/src/com/aregner/android/pandoid/PandoidStationSelect.java +++ b/src/com/aregner/android/pandoid/PandoidStationSelect.java @@ -32,8 +32,8 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; -import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; @@ -48,7 +48,7 @@ public void onCreate(Bundle savedInstanceState) { pandora = PandoraRadioService.getInstance(true); ArrayList stations = pandora.getStations(); - + ListView lv = getListView(); setListAdapter(new StationListAdapter(stations, this)); lv.setTextFilterEnabled(true); @@ -60,6 +60,17 @@ public void onItemClick(AdapterView parent, View view, int position, long id) //finishActivity(PandoidPlayer.REQUIRE_SELECT_STATION); } }); + + lv.setOnItemLongClickListener(new OnItemLongClickListener() { + + @Override + public boolean onItemLongClick(AdapterView parent, View view, + int position, long id) { + //delete station stuff here + return true; + } + + }); } @Override @@ -71,7 +82,7 @@ protected void onResume() { @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); - inflater.inflate(R.menu.player_menu, menu); + inflater.inflate(R.menu.station_select_menu, menu); return true; } diff --git a/src/com/aregner/android/pandoid/PandoraDB.java b/src/com/aregner/android/pandoid/PandoraDB.java index 3682aa6..9defb4c 100644 --- a/src/com/aregner/android/pandoid/PandoraDB.java +++ b/src/com/aregner/android/pandoid/PandoraDB.java @@ -28,6 +28,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; +import android.util.Log; public class PandoraDB extends SQLiteOpenHelper { @@ -57,7 +58,8 @@ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } /** */ - public void syncStations(ArrayList stations) { + public synchronized void syncStations(ArrayList stations) { + Log.i("PandoraDB", "syncstations called"); SQLiteDatabase write = getWritableDatabase(); Iterator stationIter = stations.iterator(); diff --git a/src/com/aregner/android/pandoid/PandoraRadioService.java b/src/com/aregner/android/pandoid/PandoraRadioService.java index c162351..76b746b 100644 --- a/src/com/aregner/android/pandoid/PandoraRadioService.java +++ b/src/com/aregner/android/pandoid/PandoraRadioService.java @@ -29,16 +29,12 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; -import android.app.ProgressDialog; import android.app.Service; -import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.database.sqlite.SQLiteDatabase; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; -import android.media.MediaPlayer.OnPreparedListener; import android.os.AsyncTask; import android.os.IBinder; import android.preference.PreferenceManager; @@ -62,7 +58,8 @@ public class PandoraRadioService extends Service { private Song[] currentPlaylist; private Song[] nextPlaylist; private int currentSongIndex; - private HashMap,Object> listeners = new HashMap,Object>(); + + public static final String SONG_CHANGE = "com.aregner.android.pandoid.PanoraRadioService.SONG_CHANGE"; protected PandoraDB db; @@ -149,10 +146,6 @@ public int onStartCommand(Intent intent, int flags, int startId) { return START_STICKY; } - public void setListener(Class klass, Object listener) { - listeners.put(klass, listener); - } - public void setNotification() { Notification notification = new Notification(R.drawable.icon, "Pandoroid Radio", System.currentTimeMillis()); Intent notificationIntent = new Intent(this, PandoidPlayer.class); @@ -212,22 +205,15 @@ public ArrayList getStations(boolean forceDownload) { return stations; } } - @SuppressWarnings("unchecked") public ArrayList getStations() { ArrayList stations; stations = pandora.getStations(); - (new AsyncTask, Void, Void>() { - @Override - protected Void doInBackground(ArrayList... params) { - db = new PandoraDB(getBaseContext()); - db.syncStations(params[0]); - db.close(); - return null; - } - }).execute(stations); - + db = new PandoraDB(getBaseContext()); + db.syncStations(stations); + db.close(); + return stations; } public void setCurrentStationId(long sid) { @@ -254,8 +240,15 @@ public void prepare(int i) { currentSongIndex = i; media.reset(); - media.setOnCompletionListener((OnCompletionListener)listeners.get(OnCompletionListener.class)); - media.setOnPreparedListener((OnPreparedListener)listeners.get(OnPreparedListener.class)); + media.setOnCompletionListener(new OnCompletionListener(){ + @Override + public void onCompletion(MediaPlayer mp) { + next(); + } + }); + + // media.setOnCompletionListener((OnCompletionListener)listeners.get(OnCompletionListener.class)); + // media.setOnPreparedListener((OnPreparedListener)listeners.get(OnPreparedListener.class)); try { media.setDataSource( currentPlaylist[i].getAudioUrl() ); } catch (IllegalArgumentException e1) { @@ -284,6 +277,7 @@ public Song play() { public Song play(int i) { media.start(); setNotification(); + songChangeEvent(); return currentPlaylist[i]; } public void pause() { @@ -332,4 +326,10 @@ public void rate(String rating) { pandora.rate(currentStation, currentPlaylist[currentSongIndex], ratingBool); } + + private void songChangeEvent() { + Intent i = new Intent(); + i.setAction(SONG_CHANGE); + sendBroadcast(i); + } } From 7c4c6f59ddb350cedbf1977bf70e3a36843e5e35 Mon Sep 17 00:00:00 2001 From: putnam Date: Sat, 15 Oct 2011 19:13:21 -0500 Subject: [PATCH 02/10] Added high-res artwork using LastFM api, implemented image caching for album artwork for faster reloading when screen rotates, play button bug fix --- .classpath | 14 ++-- AndroidManifest.xml | 3 +- res/layout-land/player.xml | 2 +- res/layout/player.xml | 2 +- .../android/pandoid/AlbumArtDownloader.java | 77 +++++++++++++++++++ .../android/pandoid/PandoidPlayer.java | 57 ++++++++++++-- .../android/pandoid/PandoraRadioService.java | 10 ++- 7 files changed, 146 insertions(+), 19 deletions(-) create mode 100644 src/com/aregner/android/pandoid/AlbumArtDownloader.java diff --git a/.classpath b/.classpath index 609aa00..6e9239f 100644 --- a/.classpath +++ b/.classpath @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 8847d89..1ae3024 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -7,7 +7,8 @@ - + diff --git a/res/layout-land/player.xml b/res/layout-land/player.xml index f6ddd47..7d69cc9 100644 --- a/res/layout-land/player.xml +++ b/res/layout-land/player.xml @@ -78,7 +78,7 @@ android:onClick="controlButtonPressed" android:typeface="monospace" android:textStyle="bold" android:width="60dip" android:textSize="20sp"> - -