diff --git a/res/layout/storage_error.xml b/res/layout/storage_error.xml new file mode 100644 index 000000000..f2e412f46 --- /dev/null +++ b/res/layout/storage_error.xml @@ -0,0 +1,24 @@ + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index fc0438c86..fa33ea012 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -93,5 +93,6 @@ Allow updates over the mobile data connection All downloads completed Refresh + No external storage is available. Please make sure that external storage is mounted so that the app can work properly. \ No newline at end of file diff --git a/src/de/podfetcher/PodcastApp.java b/src/de/podfetcher/PodcastApp.java index 4ecc553ba..b8175f77c 100644 --- a/src/de/podfetcher/PodcastApp.java +++ b/src/de/podfetcher/PodcastApp.java @@ -13,6 +13,7 @@ import android.util.Log; import de.podfetcher.asynctask.FeedImageLoader; import de.podfetcher.feed.FeedManager; import de.podfetcher.receiver.FeedUpdateReceiver; +import de.podfetcher.util.StorageUtils; public class PodcastApp extends Application implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -39,8 +40,10 @@ public class PodcastApp extends Application implements SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); - FeedManager manager = FeedManager.getInstance(); - manager.loadDBData(getApplicationContext()); + if (StorageUtils.storageAvailable()) { + FeedManager manager = FeedManager.getInstance(); + manager.loadDBData(getApplicationContext()); + } } @Override @@ -63,9 +66,8 @@ public class PodcastApp extends Application implements alarmManager.cancel(updateIntent); if (hours != 0) { long newIntervall = TimeUnit.HOURS.toMillis(hours); - alarmManager.setRepeating( - AlarmManager.RTC_WAKEUP, newIntervall, - newIntervall, updateIntent); + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, + newIntervall, newIntervall, updateIntent); Log.d(TAG, "Changed alarm to new intervall"); } else { Log.d(TAG, "Automatic update was deactivated"); diff --git a/src/de/podfetcher/activity/AddFeedActivity.java b/src/de/podfetcher/activity/AddFeedActivity.java index 83fb073d0..994a8f102 100644 --- a/src/de/podfetcher/activity/AddFeedActivity.java +++ b/src/de/podfetcher/activity/AddFeedActivity.java @@ -20,6 +20,7 @@ import de.podfetcher.feed.FeedManager; import de.podfetcher.storage.DownloadRequester; import de.podfetcher.util.ConnectionTester; import de.podfetcher.util.DownloadError; +import de.podfetcher.util.StorageUtils; import de.podfetcher.util.URLChecker; import de.podfetcher.service.DownloadService; @@ -52,6 +53,7 @@ public class AddFeedActivity extends SherlockActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + StorageUtils.checkStorageAvailability(this); setContentView(R.layout.addfeed); requester = DownloadRequester.getInstance(); @@ -96,6 +98,13 @@ public class AddFeedActivity extends SherlockActivity { }); } + @Override + protected void onResume() { + super.onResume(); + StorageUtils.checkStorageAvailability(this); + + } + @Override protected void onStop() { super.onStop(); diff --git a/src/de/podfetcher/activity/FeedItemlistActivity.java b/src/de/podfetcher/activity/FeedItemlistActivity.java index e4642eb46..e6e673ac6 100644 --- a/src/de/podfetcher/activity/FeedItemlistActivity.java +++ b/src/de/podfetcher/activity/FeedItemlistActivity.java @@ -1,6 +1,5 @@ package de.podfetcher.activity; - import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.support.v4.app.FragmentManager; @@ -21,6 +20,7 @@ import de.podfetcher.feed.FeedManager; import de.podfetcher.fragment.ItemlistFragment; import de.podfetcher.fragment.FeedlistFragment; import de.podfetcher.util.FeedMenuHandler; +import de.podfetcher.util.StorageUtils; /** Displays a List of FeedItems */ public class FeedItemlistActivity extends SherlockFragmentActivity { @@ -35,30 +35,40 @@ public class FeedItemlistActivity extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + StorageUtils.checkStorageAvailability(this); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); getSupportActionBar().setDisplayHomeAsUpEnabled(true); setContentView(R.layout.feeditemlist_activity); - + manager = FeedManager.getInstance(); - long feedId = getIntent().getLongExtra(FeedlistFragment.EXTRA_SELECTED_FEED, -1); - if(feedId == -1) Log.e(TAG, "Received invalid feed selection."); + long feedId = getIntent().getLongExtra( + FeedlistFragment.EXTRA_SELECTED_FEED, -1); + if (feedId == -1) + Log.e(TAG, "Received invalid feed selection."); feed = manager.getFeed(feedId); setTitle(feed.getTitle()); - + FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fT = fragmentManager.beginTransaction(); - + filf = ItemlistFragment.newInstance(feed.getId()); fT.add(R.id.feeditemlistFragment, filf); fT.commit(); - + } - + + @Override + protected void onResume() { + super.onResume(); + StorageUtils.checkStorageAvailability(this); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { - return FeedMenuHandler.onCreateOptionsMenu(new MenuInflater(this), menu); + return FeedMenuHandler + .onCreateOptionsMenu(new MenuInflater(this), menu); } @Override @@ -71,7 +81,7 @@ public class FeedItemlistActivity extends SherlockFragmentActivity { if (FeedMenuHandler.onOptionsItemClicked(this, item, feed)) { filf.getListAdapter().notifyDataSetChanged(); } else { - switch(item.getItemId()) { + switch (item.getItemId()) { case R.id.remove_item: FeedRemover remover = new FeedRemover(this) { @Override @@ -88,5 +98,5 @@ public class FeedItemlistActivity extends SherlockFragmentActivity { } return true; } - + } diff --git a/src/de/podfetcher/activity/ItemviewActivity.java b/src/de/podfetcher/activity/ItemviewActivity.java index 72c3fecae..f98196a46 100644 --- a/src/de/podfetcher/activity/ItemviewActivity.java +++ b/src/de/podfetcher/activity/ItemviewActivity.java @@ -24,6 +24,7 @@ import de.podfetcher.fragment.FeedlistFragment; import de.podfetcher.fragment.ItemDescriptionFragment; import de.podfetcher.fragment.ItemlistFragment; import de.podfetcher.util.FeedItemMenuHandler; +import de.podfetcher.util.StorageUtils; /** Displays a single FeedItem and provides various actions */ public class ItemviewActivity extends SherlockFragmentActivity { @@ -39,12 +40,20 @@ public class ItemviewActivity extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + StorageUtils.checkStorageAvailability(this); manager = FeedManager.getInstance(); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); extractFeeditem(); populateUI(); } + @Override + protected void onResume() { + super.onResume(); + StorageUtils.checkStorageAvailability(this); + + } + @Override public void onStop() { super.onStop(); @@ -81,7 +90,8 @@ public class ItemviewActivity extends SherlockFragmentActivity { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager .beginTransaction(); - ItemDescriptionFragment fragment = ItemDescriptionFragment.newInstance(item); + ItemDescriptionFragment fragment = ItemDescriptionFragment + .newInstance(item); fragmentTransaction.add(R.id.description_fragment, fragment); fragmentTransaction.commit(); } diff --git a/src/de/podfetcher/activity/MediaplayerActivity.java b/src/de/podfetcher/activity/MediaplayerActivity.java index de8028d6f..0afbce1c9 100644 --- a/src/de/podfetcher/activity/MediaplayerActivity.java +++ b/src/de/podfetcher/activity/MediaplayerActivity.java @@ -54,6 +54,7 @@ import de.podfetcher.service.PlayerStatus; import de.podfetcher.util.Converter; import de.podfetcher.util.DownloadError; import de.podfetcher.util.MediaPlayerError; +import de.podfetcher.util.StorageUtils; public class MediaplayerActivity extends SherlockFragmentActivity implements SurfaceHolder.Callback { @@ -131,6 +132,7 @@ public class MediaplayerActivity extends SherlockFragmentActivity implements protected void onResume() { super.onResume(); Log.d(TAG, "Resuming Activity"); + StorageUtils.checkStorageAvailability(this); bindToService(); } @@ -170,6 +172,7 @@ public class MediaplayerActivity extends SherlockFragmentActivity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "Creating Activity"); + StorageUtils.checkStorageAvailability(this); orientation = getResources().getConfiguration().orientation; manager = FeedManager.getInstance(); diff --git a/src/de/podfetcher/activity/PodfetcherActivity.java b/src/de/podfetcher/activity/PodfetcherActivity.java index 4a7bad7e3..7db9b2e5d 100644 --- a/src/de/podfetcher/activity/PodfetcherActivity.java +++ b/src/de/podfetcher/activity/PodfetcherActivity.java @@ -34,6 +34,7 @@ import de.podfetcher.fragment.QueueFragment; import de.podfetcher.fragment.UnreadItemlistFragment; import de.podfetcher.service.DownloadService; import de.podfetcher.storage.DownloadRequester; +import de.podfetcher.util.StorageUtils; public class PodfetcherActivity extends SherlockFragmentActivity { private static final String TAG = "PodfetcherActivity"; @@ -46,6 +47,7 @@ public class PodfetcherActivity extends SherlockFragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + StorageUtils.checkStorageAvailability(this); manager = FeedManager.getInstance(); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); setContentView(R.layout.main); @@ -69,6 +71,7 @@ public class PodfetcherActivity extends SherlockFragmentActivity { @Override protected void onResume() { super.onResume(); + StorageUtils.checkStorageAvailability(this); updateProgressBarVisibility(); IntentFilter filter = new IntentFilter(); filter.addAction(DownloadService.ACTION_DOWNLOAD_HANDLED); diff --git a/src/de/podfetcher/activity/StorageErrorActivity.java b/src/de/podfetcher/activity/StorageErrorActivity.java new file mode 100644 index 000000000..830f03902 --- /dev/null +++ b/src/de/podfetcher/activity/StorageErrorActivity.java @@ -0,0 +1,51 @@ +package de.podfetcher.activity; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.Bundle; +import android.util.Log; + +import com.actionbarsherlock.app.SherlockActivity; + +import de.podfetcher.R; + +public class StorageErrorActivity extends SherlockActivity { + private static final String TAG = "StorageErrorActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.storage_error); + } + + @Override + protected void onPause() { + super.onPause(); + unregisterReceiver(mediaUpdate); + } + + @Override + protected void onResume() { + super.onResume(); + registerReceiver(mediaUpdate, new IntentFilter(Intent.ACTION_MEDIA_MOUNTED)); + } + + private BroadcastReceiver mediaUpdate = new BroadcastReceiver() { + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) { + if (intent.getBooleanExtra("read-only", true)) { + Log.d(TAG, "Media was mounted; Finishing activity"); + finish(); + } else { + Log.d(TAG, "Media seemed to have been mounted read only"); + } + } + } + + }; + +} diff --git a/src/de/podfetcher/util/StorageUtils.java b/src/de/podfetcher/util/StorageUtils.java new file mode 100644 index 000000000..6f2c44e26 --- /dev/null +++ b/src/de/podfetcher/util/StorageUtils.java @@ -0,0 +1,28 @@ +package de.podfetcher.util; + +import de.podfetcher.activity.StorageErrorActivity; +import android.app.Activity; +import android.content.Intent; +import android.os.Environment; + +/** Utility functions for handling storage errors */ +public class StorageUtils { + public static boolean storageAvailable() { + String state = Environment.getExternalStorageState(); + return state.equals(Environment.MEDIA_MOUNTED); + } + + /**Checks if external storage is available. If external storage isn't + * available, the current activity is finsished an an error activity is launched. + * @param activity the activity which would be finished if no storage is available + * @return true if external storage is available + */ + public static boolean checkStorageAvailability(Activity activity) { + boolean storageAvailable = storageAvailable(); + if (!storageAvailable) { + activity.finish(); + activity.startActivity(new Intent(activity, StorageErrorActivity.class)); + } + return storageAvailable; + } +}