diff options
Diffstat (limited to 'app')
9 files changed, 140 insertions, 90 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4e7863730..9d7bbee67 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.danoeh.antennapod" - android:versionCode="1050003" - android:versionName="1.5.0.3"> + android:versionCode="1050004" + android:versionName="1.5.0.4"> <!-- Version code schema: "1.2.3-SNAPSHOT" -> 1020300 diff --git a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java index c1d4bc4fd..829a49a15 100644 --- a/app/src/main/java/de/danoeh/antennapod/PodcastApp.java +++ b/app/src/main/java/de/danoeh/antennapod/PodcastApp.java @@ -57,8 +57,8 @@ public class PodcastApp extends Application { singleton = this; PodDBAdapter.init(this); - UpdateManager.init(this); UserPreferences.init(this); + UpdateManager.init(this); PlaybackPreferences.init(this); NetworkUtils.init(this); EventDistributor.getInstance(); diff --git a/app/src/main/java/de/danoeh/antennapod/UpdateManager.java b/app/src/main/java/de/danoeh/antennapod/UpdateManager.java index b1d7fffc8..0b3c43381 100644 --- a/app/src/main/java/de/danoeh/antennapod/UpdateManager.java +++ b/app/src/main/java/de/danoeh/antennapod/UpdateManager.java @@ -5,14 +5,18 @@ import android.content.Context; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.os.Build; import android.util.Log; +import org.antennapod.audio.MediaPlayer; + import java.io.File; import java.util.List; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; @@ -83,6 +87,11 @@ public class UpdateManager { } }.start(); } + if(oldVersionCode < 1050004) { + if(MediaPlayer.isPrestoLibraryInstalled(context) && Build.VERSION.SDK_INT >= 16) { + UserPreferences.enableSonic(true); + } + } } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportBaseActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportBaseActivity.java index d974e0e1b..46dabec12 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportBaseActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportBaseActivity.java @@ -1,16 +1,27 @@ package de.danoeh.antennapod.activity; import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Environment; +import android.support.v4.app.ActivityCompat; import android.support.v7.app.ActionBarActivity; import android.util.Log; -import de.danoeh.antennapod.BuildConfig; -import de.danoeh.antennapod.asynctask.OpmlFeedQueuer; -import de.danoeh.antennapod.asynctask.OpmlImportWorker; -import de.danoeh.antennapod.core.opml.OpmlElement; +import com.afollestad.materialdialogs.MaterialDialog; + +import org.apache.commons.lang3.ArrayUtils; + +import java.io.InputStreamReader; import java.io.Reader; import java.util.ArrayList; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.asynctask.OpmlFeedQueuer; +import de.danoeh.antennapod.asynctask.OpmlImportWorker; +import de.danoeh.antennapod.core.opml.OpmlElement; +import de.danoeh.antennapod.core.util.LangUtils; + /** * Base activity for Opml Import - e.g. with code what to do afterwards * */ @@ -19,22 +30,23 @@ public class OpmlImportBaseActivity extends ActionBarActivity { private static final String TAG = "OpmlImportBaseActivity"; private OpmlImportWorker importWorker; - /** + private static final int PERMISSION_REQUEST_READ_EXTERNAL_STORAGE = 5; + private Uri uri; + + /** * Handles the choices made by the user in the OpmlFeedChooserActivity and * starts the OpmlFeedQueuer if necessary. */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Received result"); + Log.d(TAG, "Received result"); if (resultCode == RESULT_CANCELED) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Activity was cancelled"); - if (finishWhenCanceled()) - finish(); + Log.d(TAG, "Activity was cancelled"); + if (finishWhenCanceled()) { + finish(); + } } else { - int[] selected = data - .getIntArrayExtra(OpmlFeedChooserActivity.EXTRA_SELECTED_ITEMS); + int[] selected = data.getIntArrayExtra(OpmlFeedChooserActivity.EXTRA_SELECTED_ITEMS); if (selected != null && selected.length > 0) { OpmlFeedQueuer queuer = new OpmlFeedQueuer(this, selected) { @@ -50,35 +62,75 @@ public class OpmlImportBaseActivity extends ActionBarActivity { }; queuer.executeAsync(); } else { - if (BuildConfig.DEBUG) - Log.d(TAG, "No items were selected"); + Log.d(TAG, "No items were selected"); } } } - /** Starts the import process. */ - protected void startImport(Reader reader) { + protected void importUri(Uri uri) { + this.uri = uri; + if(uri.toString().contains(Environment.getExternalStorageDirectory().toString())) { + int permission = ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE); + if (permission != PackageManager.PERMISSION_GRANTED) { + requestPermission(); + return; + } + } + startImport(); + } + + private void requestPermission() { + String[] permissions = { android.Manifest.permission.READ_EXTERNAL_STORAGE }; + ActivityCompat.requestPermissions(this, permissions, PERMISSION_REQUEST_READ_EXTERNAL_STORAGE); + } - if (reader != null) { - importWorker = new OpmlImportWorker(this, reader) { + @Override + public void onRequestPermissionsResult(int requestCode, + String[] permissions, + int[] grantResults) { + if (requestCode != PERMISSION_REQUEST_READ_EXTERNAL_STORAGE) { + return; + } + if (grantResults.length > 0 && ArrayUtils.contains(grantResults, PackageManager.PERMISSION_GRANTED)) { + startImport(); + } else { + new MaterialDialog.Builder(this) + .content(R.string.opml_import_ask_read_permission) + .positiveText(android.R.string.ok) + .negativeText(R.string.cancel_label) + .onPositive((dialog, which) -> requestPermission()) + .onNegative((dialog, which) -> finish()) + .show(); + } + } + + /** Starts the import process. */ + protected void startImport() { + try { + Reader mReader = new InputStreamReader(getContentResolver().openInputStream(uri), LangUtils.UTF_8); + importWorker = new OpmlImportWorker(this, mReader) { @Override protected void onPostExecute(ArrayList<OpmlElement> result) { super.onPostExecute(result); if (result != null) { - if (BuildConfig.DEBUG) - Log.d(TAG, "Parsing was successful"); + Log.d(TAG, "Parsing was successful"); OpmlImportHolder.setReadElements(result); startActivityForResult(new Intent( OpmlImportBaseActivity.this, OpmlFeedChooserActivity.class), 0); } else { - if (BuildConfig.DEBUG) - Log.d(TAG, "Parser error occurred"); + Log.d(TAG, "Parser error occurred"); } } }; importWorker.executeAsync(); + } catch (Exception e) { + Log.d(TAG, Log.getStackTraceString(e)); + new MaterialDialog.Builder(this) + .content("Cannot open OPML file: " + e.getMessage()) + .positiveText(android.R.string.ok) + .show(); } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromIntentActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromIntentActivity.java index 46e5f0e8e..ab4b0d0ee 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromIntentActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromIntentActivity.java @@ -2,25 +2,14 @@ package de.danoeh.antennapod.activity; import android.net.Uri; import android.os.Bundle; -import android.support.v7.app.AlertDialog; -import android.util.Log; import de.danoeh.antennapod.core.preferences.UserPreferences; -import de.danoeh.antennapod.core.util.LangUtils; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.io.Reader; -import java.net.URL; /** Lets the user start the OPML-import process. */ public class OpmlImportFromIntentActivity extends OpmlImportBaseActivity { private static final String TAG = "OpmlImportFromIntentAct"; - @Override protected void onCreate(Bundle savedInstanceState) { setTheme(UserPreferences.getTheme()); @@ -28,15 +17,8 @@ public class OpmlImportFromIntentActivity extends OpmlImportBaseActivity { getSupportActionBar().setDisplayHomeAsUpEnabled(true); - try { - Uri uri = getIntent().getData(); - - Reader mReader = new InputStreamReader(getContentResolver().openInputStream(uri), LangUtils.UTF_8); - startImport(mReader); - } catch (Exception e) { - new AlertDialog.Builder(this).setMessage("Cannot open XML - Reason: " + e.getMessage()).show(); - } - + Uri uri = getIntent().getData(); + importUri(uri); } @Override diff --git a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java index 6e3991739..15d97cc2c 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/OpmlImportFromPathActivity.java @@ -11,16 +11,9 @@ import android.view.View; import android.widget.Button; import android.widget.TextView; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.io.Reader; - import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.util.IntentUtils; -import de.danoeh.antennapod.core.util.LangUtils; import de.danoeh.antennapod.core.util.StorageUtils; /** @@ -114,19 +107,6 @@ public class OpmlImportFromPathActivity extends OpmlImportBaseActivity { } } - private void startImport(File file) { - Reader mReader = null; - try { - mReader = new InputStreamReader(new FileInputStream(file), - LangUtils.UTF_8); - Log.d(TAG, "Parsing " + file.toString()); - startImport(mReader); - } catch (FileNotFoundException e) { - Log.d(TAG, "File not found which really should be there"); - // this should never happen as it is a file we have just chosen - } - } - /* * Creates an implicit intent to launch a file manager which lets * the user choose a specific OPML-file to import from. @@ -155,13 +135,7 @@ public class OpmlImportFromPathActivity extends OpmlImportBaseActivity { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && requestCode == CHOOSE_OPML_FILE) { Uri uri = data.getData(); - - try { - Reader mReader = new InputStreamReader(getContentResolver().openInputStream(uri), LangUtils.UTF_8); - startImport(mReader); - } catch (FileNotFoundException e) { - Log.d(TAG, "File not found"); - } + importUri(uri); } } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java index 9011c8b02..5b205e91f 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/FeedItemlistDescriptionAdapter.java @@ -6,11 +6,13 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.TextView; -import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.feed.FeedItem; import java.util.List; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.feed.FeedItem; +import de.danoeh.antennapod.core.util.DateUtils; + /** * List adapter for showing a list of FeedItems with their title and description. */ @@ -33,6 +35,7 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.itemdescription_listitem, parent, false); holder.title = (TextView) convertView.findViewById(R.id.txtvTitle); + holder.pubDate = (TextView) convertView.findViewById(R.id.txtvPubDate); holder.description = (TextView) convertView.findViewById(R.id.txtvDescription); convertView.setTag(holder); @@ -41,15 +44,20 @@ public class FeedItemlistDescriptionAdapter extends ArrayAdapter<FeedItem> { } holder.title.setText(item.getTitle()); + holder.pubDate.setText(DateUtils.formatAbbrev(getContext(), item.getPubDate())); if (item.getDescription() != null) { - holder.description.setText(item.getDescription()); + String description = item.getDescription() + .replaceAll("\n", " ") + .replaceAll("\\s+", " ") + .trim(); + holder.description.setText(description); } - return convertView; } static class Holder { TextView title; + TextView pubDate; TextView description; } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java index ce1d753e8..96abdd835 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ChaptersFragment.java @@ -68,7 +68,7 @@ public class ChaptersFragment extends ListFragment implements AudioplayerContent this.media = media; adapter.setMedia(media); adapter.notifyDataSetChanged(); - if(media.getChapters() == null) { + if(media == null || media.getChapters() == null || media.getChapters().size() == 0) { setEmptyText(getString(R.string.no_items_label)); } else { setEmptyText(null); diff --git a/app/src/main/res/layout/itemdescription_listitem.xml b/app/src/main/res/layout/itemdescription_listitem.xml index ca8f974bf..51bc9a5eb 100644 --- a/app/src/main/res/layout/itemdescription_listitem.xml +++ b/app/src/main/res/layout/itemdescription_listitem.xml @@ -1,30 +1,55 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout + xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" + android:layout_height="wrap_content" + android:paddingTop="8dp" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingBottom="8dp" tools:background="@android:color/holo_orange_light"> <TextView + android:id="@+id/txtvPubDate" + style="@android:style/TextAppearance.Small" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_alignParentTop="true" + android:layout_marginLeft="8dp" + android:textSize="14sp" + android:textColor="?android:textColorSecondary" + android:ellipsize="end" + android:lines="1" + tools:text="22 Jan 2016" + tools:background="@android:color/holo_green_dark" /> + + <TextView android:id="@+id/txtvTitle" - style="@style/AntennaPod.TextView.ListItemPrimaryTitle" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="16dp" + android:layout_alignParentLeft="true" + android:layout_alignParentTop="true" + android:layout_toLeftOf="@id/txtvPubDate" + android:textSize="16sp" + android:textColor="?android:attr/textColorPrimary" + android:ellipsize="end" + android:maxLines="2" tools:text="Feed item title" tools:background="@android:color/holo_green_dark" /> <TextView android:id="@+id/txtvDescription" - style="@style/AntennaPod.TextView.ListItemSecondaryTitle" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:lines="3" + android:layout_below="@id/txtvTitle" + android:textSize="14sp" + android:textColor="?android:attr/textColorSecondary" + android:ellipsize="end" + android:maxLines="3" tools:text="Feed item description" tools:background="@android:color/holo_green_dark" /> -</LinearLayout> + +</RelativeLayout> |