diff options
author | ByteHamster <info@bytehamster.com> | 2018-04-22 10:01:46 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2018-04-22 10:01:46 +0200 |
commit | 56aa64725c5beb1fed1951826b91f8632b42cf92 (patch) | |
tree | b0c713f8ecc5d2e99d14d58cd9dc48825938be71 /app | |
parent | b1622fa6bef985f11474e60f103474180c642bda (diff) | |
parent | c9a2bbc2c9709a0c1f0d20ea8168bd7a7a1b95d5 (diff) | |
download | AntennaPod-56aa64725c5beb1fed1951826b91f8632b42cf92.zip |
Merge branch 'develop' into preference-rework
Diffstat (limited to 'app')
44 files changed, 826 insertions, 517 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b457aa4e9..c84b0110b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,8 +2,8 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="de.danoeh.antennapod" android:installLocation="auto" - android:versionCode="1060501" - android:versionName="1.6.5-RC1"> + android:versionCode="1060595" + android:versionName="1.6.5"> <!-- Version code schema: "1.2.3-SNAPSHOT" -> 1020300 @@ -105,7 +105,15 @@ android:value="de.danoeh.antennapod.activity.MainActivity"/> </activity> - <activity android:name=".activity.FeedInfoActivity"> + <activity + android:name=".activity.FeedInfoActivity" + android:label="@string/feed_info_label"> + </activity> + + <activity + android:name=".activity.FeedSettingsActivity" + android:windowSoftInputMode="stateHidden" + android:label="@string/feed_settings_label"> </activity> <service @@ -222,7 +230,8 @@ <activity android:name=".activity.VideoplayerActivity" - android:configChanges="keyboardHidden|orientation" + android:configChanges="keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize" + android:supportsPictureInPicture="true" android:screenOrientation="sensorLandscape"> <meta-data android:name="android.support.PARENT_ACTIVITY" diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java index 8dea41b7c..6b1272b01 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedInfoActivity.java @@ -2,51 +2,37 @@ package de.danoeh.antennapod.activity; import android.content.ClipData; import android.content.Context; -import android.content.DialogInterface; import android.content.Intent; +import android.graphics.LightingColorFilter; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; -import android.text.Editable; import android.text.TextUtils; -import android.text.TextWatcher; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.CheckBox; -import android.widget.EditText; import android.widget.ImageView; -import android.widget.RadioButton; -import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; - import com.bumptech.glide.Glide; import com.joanzapata.iconify.Iconify; - -import org.apache.commons.lang3.StringUtils; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; - import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; import de.danoeh.antennapod.core.feed.Feed; -import de.danoeh.antennapod.core.feed.FeedFilter; -import de.danoeh.antennapod.core.feed.FeedPreferences; import de.danoeh.antennapod.core.glide.ApGlideSettings; +import de.danoeh.antennapod.core.glide.FastBlurTransformation; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBReader; -import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.LangUtils; import de.danoeh.antennapod.core.util.syndication.HtmlToPlainText; import de.danoeh.antennapod.menuhandler.FeedMenuHandler; +import org.apache.commons.lang3.StringUtils; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; import rx.Observable; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; @@ -59,7 +45,6 @@ public class FeedInfoActivity extends AppCompatActivity { public static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId"; private static final String TAG = "FeedInfoActivity"; - private boolean autoDeleteChanged = false; private Feed feed; private ImageView imgvCover; @@ -70,15 +55,6 @@ public class FeedInfoActivity extends AppCompatActivity { private TextView lblAuthor; private TextView txtvAuthor; private TextView txtvUrl; - private EditText etxtUsername; - private EditText etxtPassword; - private EditText etxtFilterText; - private RadioButton rdoFilterInclude; - private RadioButton rdoFilterExclude; - private CheckBox cbxAutoDownload; - private CheckBox cbxKeepUpdated; - private Spinner spnAutoDelete; - private boolean filterInclude = true; private Subscription subscription; @@ -98,40 +74,6 @@ public class FeedInfoActivity extends AppCompatActivity { } }; - private boolean authInfoChanged = false; - - private final TextWatcher authTextWatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - authInfoChanged = true; - } - }; - - private boolean filterTextChanged = false; - - private final TextWatcher filterTextWatcher = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - } - - @Override - public void afterTextChanged(Editable s) { - filterTextChanged = true; - } - }; - @Override protected void onCreate(Bundle savedInstanceState) { setTheme(UserPreferences.getTheme()); @@ -142,28 +84,20 @@ public class FeedInfoActivity extends AppCompatActivity { imgvCover = (ImageView) findViewById(R.id.imgvCover); txtvTitle = (TextView) findViewById(R.id.txtvTitle); + TextView txtvAuthorHeader = (TextView) findViewById(R.id.txtvAuthor); + ImageView imgvBackground = (ImageView) findViewById(R.id.imgvBackground); + findViewById(R.id.butShowInfo).setVisibility(View.INVISIBLE); + findViewById(R.id.butShowSettings).setVisibility(View.INVISIBLE); + // https://github.com/bumptech/glide/issues/529 + imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000)); + + txtvDescription = (TextView) findViewById(R.id.txtvDescription); lblLanguage = (TextView) findViewById(R.id.lblLanguage); txtvLanguage = (TextView) findViewById(R.id.txtvLanguage); lblAuthor = (TextView) findViewById(R.id.lblAuthor); - txtvAuthor = (TextView) findViewById(R.id.txtvAuthor); + txtvAuthor = (TextView) findViewById(R.id.txtvDetailsAuthor); txtvUrl = (TextView) findViewById(R.id.txtvUrl); - cbxAutoDownload = (CheckBox) findViewById(R.id.cbxAutoDownload); - cbxKeepUpdated = (CheckBox) findViewById(R.id.cbxKeepUpdated); - spnAutoDelete = (Spinner) findViewById(R.id.spnAutoDelete); - etxtUsername = (EditText) findViewById(R.id.etxtUsername); - etxtPassword = (EditText) findViewById(R.id.etxtPassword); - etxtFilterText = (EditText) findViewById(R.id.etxtEpisodeFilterText); - rdoFilterInclude = (RadioButton) findViewById(R.id.radio_filter_include); - rdoFilterInclude.setOnClickListener(v -> { - filterInclude = true; - filterTextChanged = true; - }); - rdoFilterExclude = (RadioButton) findViewById(R.id.radio_filter_exclude); - rdoFilterExclude.setOnClickListener(v -> { - filterInclude = false; - filterTextChanged = true; - }); txtvUrl.setOnClickListener(copyUrlToClipboard); @@ -179,7 +113,6 @@ public class FeedInfoActivity extends AppCompatActivity { Log.d(TAG, "Language is " + feed.getLanguage()); Log.d(TAG, "Author is " + feed.getAuthor()); Log.d(TAG, "URL is " + feed.getDownload_url()); - FeedPreferences prefs = feed.getPreferences(); Glide.with(FeedInfoActivity.this) .load(feed.getImageLocation()) .placeholder(R.color.light_gray) @@ -188,6 +121,14 @@ public class FeedInfoActivity extends AppCompatActivity { .fitCenter() .dontAnimate() .into(imgvCover); + Glide.with(FeedInfoActivity.this) + .load(feed.getImageLocation()) + .placeholder(R.color.image_readability_tint) + .error(R.color.image_readability_tint) + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .transform(new FastBlurTransformation(FeedInfoActivity.this)) + .dontAnimate() + .into(imgvBackground); txtvTitle.setText(feed.getTitle()); @@ -205,6 +146,7 @@ public class FeedInfoActivity extends AppCompatActivity { if (!TextUtils.isEmpty(feed.getAuthor())) { txtvAuthor.setText(feed.getAuthor()); + txtvAuthorHeader.setText(feed.getAuthor()); } else { lblAuthor.setVisibility(View.GONE); txtvAuthor.setVisibility(View.GONE); @@ -218,76 +160,7 @@ public class FeedInfoActivity extends AppCompatActivity { txtvUrl.setText(feed.getDownload_url() + " {fa-paperclip}"); Iconify.addIcons(txtvUrl); - cbxAutoDownload.setEnabled(UserPreferences.isEnableAutodownload()); - cbxAutoDownload.setChecked(prefs.getAutoDownload()); - cbxAutoDownload.setOnCheckedChangeListener((compoundButton, checked) -> { - feed.getPreferences().setAutoDownload(checked); - feed.savePreferences(); - updateAutoDownloadSettings(); - ApplyToEpisodesDialog dialog = new ApplyToEpisodesDialog(FeedInfoActivity.this, - feed, checked); - dialog.createNewDialog().show(); - }); - cbxKeepUpdated.setChecked(prefs.getKeepUpdated()); - cbxKeepUpdated.setOnCheckedChangeListener((compoundButton, checked) -> { - feed.getPreferences().setKeepUpdated(checked); - feed.savePreferences(); - }); - spnAutoDelete.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { - FeedPreferences.AutoDeleteAction auto_delete_action; - switch (parent.getSelectedItemPosition()) { - case 0: - auto_delete_action = FeedPreferences.AutoDeleteAction.GLOBAL; - break; - case 1: - auto_delete_action = FeedPreferences.AutoDeleteAction.YES; - break; - case 2: - auto_delete_action = FeedPreferences.AutoDeleteAction.NO; - break; - default: // TODO - add exceptions here - return; - } - feed.getPreferences().setAutoDeleteAction(auto_delete_action);// p - autoDeleteChanged = true; - } - - @Override - public void onNothingSelected(AdapterView<?> parent) { - // Another interface callback - } - }); - spnAutoDelete.setSelection(prefs.getAutoDeleteAction().ordinal()); - - etxtUsername.setText(prefs.getUsername()); - etxtPassword.setText(prefs.getPassword()); - - etxtUsername.addTextChangedListener(authTextWatcher); - etxtPassword.addTextChangedListener(authTextWatcher); - - FeedFilter filter = prefs.getFilter(); - if (filter.includeOnly()) { - etxtFilterText.setText(filter.getIncludeFilter()); - rdoFilterInclude.setChecked(true); - rdoFilterExclude.setChecked(false); - filterInclude = true; - } else if (filter.excludeOnly()) { - etxtFilterText.setText(filter.getExcludeFilter()); - rdoFilterInclude.setChecked(false); - rdoFilterExclude.setChecked(true); - filterInclude = false; - } else { - Log.d(TAG, "No filter set"); - rdoFilterInclude.setChecked(false); - rdoFilterExclude.setChecked(false); - etxtFilterText.setText(""); - } - etxtFilterText.addTextChangedListener(filterTextWatcher); - supportInvalidateOptionsMenu(); - updateAutoDownloadSettings(); }, error -> { Log.d(TAG, Log.getStackTraceString(error)); finish(); @@ -295,37 +168,6 @@ public class FeedInfoActivity extends AppCompatActivity { } @Override - protected void onPause() { - super.onPause(); - if (feed != null) { - FeedPreferences prefs = feed.getPreferences(); - if (authInfoChanged) { - Log.d(TAG, "Auth info changed, saving credentials"); - prefs.setUsername(etxtUsername.getText().toString()); - prefs.setPassword(etxtPassword.getText().toString()); - } - if (filterTextChanged) { - Log.d(TAG, "Filter info changed, saving..."); - String filterText = etxtFilterText.getText().toString(); - String includeString = ""; - String excludeString = ""; - if (filterInclude) { - includeString = filterText; - } else { - excludeString = filterText; - } - prefs.setFilter(new FeedFilter(includeString, excludeString)); - } - if (authInfoChanged || autoDeleteChanged || filterTextChanged) { - DBWriter.setFeedPreferences(prefs); - } - authInfoChanged = false; - autoDeleteChanged = false; - filterTextChanged = false; - } - } - - @Override public void onDestroy() { super.onDestroy(); if(subscription != null) { @@ -369,34 +211,4 @@ public class FeedInfoActivity extends AppCompatActivity { return super.onOptionsItemSelected(item); } } - - private void updateAutoDownloadSettings() { - if (feed != null && feed.getPreferences() != null) { - boolean enabled = feed.getPreferences().getAutoDownload() && UserPreferences.isEnableAutodownload(); - rdoFilterInclude.setEnabled(enabled); - rdoFilterExclude.setEnabled(enabled); - etxtFilterText.setEnabled(enabled); - } - } - - private static class ApplyToEpisodesDialog extends ConfirmationDialog { - - private final Feed feed; - private final boolean autoDownload; - - ApplyToEpisodesDialog(Context context, Feed feed, boolean autoDownload) { - super(context, R.string.auto_download_apply_to_items_title, - R.string.auto_download_apply_to_items_message); - this.feed = feed; - this.autoDownload = autoDownload; - setPositiveText(R.string.yes); - setNegativeText(R.string.no); - } - - @Override - public void onConfirmButtonPressed(DialogInterface dialog) { - DBWriter.setFeedsItemsAutoDownload(feed, autoDownload); - } - } - } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java new file mode 100644 index 000000000..5e15585a5 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/activity/FeedSettingsActivity.java @@ -0,0 +1,370 @@ +package de.danoeh.antennapod.activity; + +import android.content.ClipData; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.graphics.LightingColorFilter; +import android.net.Uri; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.text.Editable; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.RadioButton; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.Toast; +import com.bumptech.glide.Glide; +import de.danoeh.antennapod.R; +import de.danoeh.antennapod.core.dialog.ConfirmationDialog; +import de.danoeh.antennapod.core.dialog.DownloadRequestErrorDialogCreator; +import de.danoeh.antennapod.core.feed.Feed; +import de.danoeh.antennapod.core.feed.FeedFilter; +import de.danoeh.antennapod.core.feed.FeedPreferences; +import de.danoeh.antennapod.core.glide.ApGlideSettings; +import de.danoeh.antennapod.core.glide.FastBlurTransformation; +import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.DownloadRequestException; +import de.danoeh.antennapod.core.util.IntentUtils; +import de.danoeh.antennapod.menuhandler.FeedMenuHandler; +import rx.Observable; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; + +/** + * Displays information about a feed. + */ +public class FeedSettingsActivity extends AppCompatActivity { + + public static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feedId"; + private static final String TAG = "FeedSettingsActivity"; + private boolean autoDeleteChanged = false; + private Feed feed; + + private ImageView imgvCover; + private TextView txtvTitle; + private EditText etxtUsername; + private EditText etxtPassword; + private EditText etxtFilterText; + private RadioButton rdoFilterInclude; + private RadioButton rdoFilterExclude; + private CheckBox cbxAutoDownload; + private CheckBox cbxKeepUpdated; + private Spinner spnAutoDelete; + private boolean filterInclude = true; + + private Subscription subscription; + + + private final View.OnClickListener copyUrlToClipboard = new View.OnClickListener() { + @Override + public void onClick(View v) { + if(feed != null && feed.getDownload_url() != null) { + String url = feed.getDownload_url(); + ClipData clipData = ClipData.newPlainText(url, url); + android.content.ClipboardManager cm = (android.content.ClipboardManager) FeedSettingsActivity.this + .getSystemService(Context.CLIPBOARD_SERVICE); + cm.setPrimaryClip(clipData); + Toast t = Toast.makeText(FeedSettingsActivity.this, R.string.copied_url_msg, Toast.LENGTH_SHORT); + t.show(); + } + } + }; + + private boolean authInfoChanged = false; + + private final TextWatcher authTextWatcher = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + authInfoChanged = true; + } + }; + + private boolean filterTextChanged = false; + + private final TextWatcher filterTextWatcher = new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + filterTextChanged = true; + } + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + setTheme(UserPreferences.getTheme()); + super.onCreate(savedInstanceState); + setContentView(R.layout.feedsettings); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + long feedId = getIntent().getLongExtra(EXTRA_FEED_ID, -1); + + imgvCover = (ImageView) findViewById(R.id.imgvCover); + txtvTitle = (TextView) findViewById(R.id.txtvTitle); + TextView txtvAuthorHeader = (TextView) findViewById(R.id.txtvAuthor); + ImageView imgvBackground = (ImageView) findViewById(R.id.imgvBackground); + findViewById(R.id.butShowInfo).setVisibility(View.INVISIBLE); + findViewById(R.id.butShowSettings).setVisibility(View.INVISIBLE); + // https://github.com/bumptech/glide/issues/529 + imgvBackground.setColorFilter(new LightingColorFilter(0xff828282, 0x000000)); + + cbxAutoDownload = (CheckBox) findViewById(R.id.cbxAutoDownload); + cbxKeepUpdated = (CheckBox) findViewById(R.id.cbxKeepUpdated); + spnAutoDelete = (Spinner) findViewById(R.id.spnAutoDelete); + etxtUsername = (EditText) findViewById(R.id.etxtUsername); + etxtPassword = (EditText) findViewById(R.id.etxtPassword); + etxtFilterText = (EditText) findViewById(R.id.etxtEpisodeFilterText); + rdoFilterInclude = (RadioButton) findViewById(R.id.radio_filter_include); + rdoFilterInclude.setOnClickListener(v -> { + filterInclude = true; + filterTextChanged = true; + }); + rdoFilterExclude = (RadioButton) findViewById(R.id.radio_filter_exclude); + rdoFilterExclude.setOnClickListener(v -> { + filterInclude = false; + filterTextChanged = true; + }); + + subscription = Observable.fromCallable(()-> DBReader.getFeed(feedId)) + .subscribeOn(Schedulers.newThread()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(result -> { + if (result == null) { + Log.e(TAG, "Activity was started with invalid arguments"); + finish(); + } + feed = result; + FeedPreferences prefs = feed.getPreferences(); + Glide.with(FeedSettingsActivity.this) + .load(feed.getImageLocation()) + .placeholder(R.color.light_gray) + .error(R.color.light_gray) + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .fitCenter() + .dontAnimate() + .into(imgvCover); + Glide.with(FeedSettingsActivity.this) + .load(feed.getImageLocation()) + .placeholder(R.color.image_readability_tint) + .error(R.color.image_readability_tint) + .diskCacheStrategy(ApGlideSettings.AP_DISK_CACHE_STRATEGY) + .transform(new FastBlurTransformation(FeedSettingsActivity.this)) + .dontAnimate() + .into(imgvBackground); + + txtvTitle.setText(feed.getTitle()); + + if (!TextUtils.isEmpty(feed.getAuthor())) { + txtvAuthorHeader.setText(feed.getAuthor()); + } + + cbxAutoDownload.setEnabled(UserPreferences.isEnableAutodownload()); + cbxAutoDownload.setChecked(prefs.getAutoDownload()); + cbxAutoDownload.setOnCheckedChangeListener((compoundButton, checked) -> { + feed.getPreferences().setAutoDownload(checked); + feed.savePreferences(); + updateAutoDownloadSettings(); + ApplyToEpisodesDialog dialog = new ApplyToEpisodesDialog(FeedSettingsActivity.this, + feed, checked); + dialog.createNewDialog().show(); + }); + cbxKeepUpdated.setChecked(prefs.getKeepUpdated()); + cbxKeepUpdated.setOnCheckedChangeListener((compoundButton, checked) -> { + feed.getPreferences().setKeepUpdated(checked); + feed.savePreferences(); + }); + spnAutoDelete.setOnItemSelectedListener(new OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { + FeedPreferences.AutoDeleteAction auto_delete_action; + switch (parent.getSelectedItemPosition()) { + case 0: + auto_delete_action = FeedPreferences.AutoDeleteAction.GLOBAL; + break; + case 1: + auto_delete_action = FeedPreferences.AutoDeleteAction.YES; + break; + case 2: + auto_delete_action = FeedPreferences.AutoDeleteAction.NO; + break; + default: // TODO - add exceptions here + return; + } + feed.getPreferences().setAutoDeleteAction(auto_delete_action);// p + autoDeleteChanged = true; + } + + @Override + public void onNothingSelected(AdapterView<?> parent) { + // Another interface callback + } + }); + spnAutoDelete.setSelection(prefs.getAutoDeleteAction().ordinal()); + + etxtUsername.setText(prefs.getUsername()); + etxtPassword.setText(prefs.getPassword()); + + etxtUsername.addTextChangedListener(authTextWatcher); + etxtPassword.addTextChangedListener(authTextWatcher); + + FeedFilter filter = prefs.getFilter(); + if (filter.includeOnly()) { + etxtFilterText.setText(filter.getIncludeFilter()); + rdoFilterInclude.setChecked(true); + rdoFilterExclude.setChecked(false); + filterInclude = true; + } else if (filter.excludeOnly()) { + etxtFilterText.setText(filter.getExcludeFilter()); + rdoFilterInclude.setChecked(false); + rdoFilterExclude.setChecked(true); + filterInclude = false; + } else { + Log.d(TAG, "No filter set"); + rdoFilterInclude.setChecked(false); + rdoFilterExclude.setChecked(false); + etxtFilterText.setText(""); + } + etxtFilterText.addTextChangedListener(filterTextWatcher); + + supportInvalidateOptionsMenu(); + updateAutoDownloadSettings(); + }, error -> { + Log.d(TAG, Log.getStackTraceString(error)); + finish(); + }); + } + + @Override + protected void onPause() { + super.onPause(); + if (feed != null) { + FeedPreferences prefs = feed.getPreferences(); + if (authInfoChanged) { + Log.d(TAG, "Auth info changed, saving credentials"); + prefs.setUsername(etxtUsername.getText().toString()); + prefs.setPassword(etxtPassword.getText().toString()); + } + if (filterTextChanged) { + Log.d(TAG, "Filter info changed, saving..."); + String filterText = etxtFilterText.getText().toString(); + String includeString = ""; + String excludeString = ""; + if (filterInclude) { + includeString = filterText; + } else { + excludeString = filterText; + } + prefs.setFilter(new FeedFilter(includeString, excludeString)); + } + if (authInfoChanged || autoDeleteChanged || filterTextChanged) { + DBWriter.setFeedPreferences(prefs); + } + authInfoChanged = false; + autoDeleteChanged = false; + filterTextChanged = false; + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if(subscription != null) { + subscription.unsubscribe(); + } + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + super.onCreateOptionsMenu(menu); + MenuInflater inflater = getMenuInflater(); + inflater.inflate(R.menu.feedinfo, menu); + return true; + } + + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + menu.findItem(R.id.support_item).setVisible( + feed != null && feed.getPaymentLink() != null); + menu.findItem(R.id.share_link_item).setVisible(feed != null && feed.getLink() != null); + menu.findItem(R.id.visit_website_item).setVisible(feed != null && feed.getLink() != null && + IntentUtils.isCallable(this, new Intent(Intent.ACTION_VIEW, Uri.parse(feed.getLink())))); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + finish(); + return true; + default: + try { + return FeedMenuHandler.onOptionsItemClicked(this, item, feed); + } catch (DownloadRequestException e) { + e.printStackTrace(); + DownloadRequestErrorDialogCreator.newRequestErrorDialog(this, + e.getMessage()); + } + return super.onOptionsItemSelected(item); + } + } + + private void updateAutoDownloadSettings() { + if (feed != null && feed.getPreferences() != null) { + boolean enabled = feed.getPreferences().getAutoDownload() && UserPreferences.isEnableAutodownload(); + rdoFilterInclude.setEnabled(enabled); + rdoFilterExclude.setEnabled(enabled); + etxtFilterText.setEnabled(enabled); + } + } + + private static class ApplyToEpisodesDialog extends ConfirmationDialog { + + private final Feed feed; + private final boolean autoDownload; + + ApplyToEpisodesDialog(Context context, Feed feed, boolean autoDownload) { + super(context, R.string.auto_download_apply_to_items_title, + R.string.auto_download_apply_to_items_message); + this.feed = feed; + this.autoDownload = autoDownload; + setPositiveText(R.string.yes); + setNegativeText(R.string.no); + } + + @Override + public void onConfirmButtonPressed(DialogInterface dialog) { + DBWriter.setFeedsItemsAutoDownload(feed, autoDownload); + } + } + +} diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 232ff4311..21e375435 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -46,6 +46,7 @@ import de.danoeh.antennapod.core.util.Flavors; import de.danoeh.antennapod.core.util.ShareUtils; import de.danoeh.antennapod.core.util.StorageUtils; import de.danoeh.antennapod.core.util.Supplier; +import de.danoeh.antennapod.core.util.gui.PictureInPictureUtil; import de.danoeh.antennapod.core.util.playback.MediaPlayerError; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.core.util.playback.PlaybackController; @@ -225,9 +226,11 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements @Override protected void onPause() { - if(controller != null) { - controller.reinitServiceIfPaused(); - controller.pause(); + if (!PictureInPictureUtil.isInPictureInPictureMode(this)) { + if (controller != null) { + controller.reinitServiceIfPaused(); + controller.pause(); + } } super.onPause(); } @@ -379,6 +382,7 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements } else { startActivity(intent); } + finish(); return true; } else { if (media != null) { diff --git a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java index 54758acf4..733f39b63 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/VideoplayerActivity.java @@ -10,27 +10,31 @@ import android.support.v4.view.WindowCompat; import android.support.v7.app.ActionBar; import android.util.Log; import android.util.Pair; +import android.view.Menu; +import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.View; import android.view.WindowManager; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.SeekBar; - -import java.lang.ref.WeakReference; -import java.util.concurrent.atomic.AtomicBoolean; - import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.feed.MediaType; +import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.playback.PlaybackService; import de.danoeh.antennapod.core.service.playback.PlayerStatus; +import de.danoeh.antennapod.core.util.gui.PictureInPictureUtil; import de.danoeh.antennapod.core.util.playback.ExternalMedia; import de.danoeh.antennapod.core.util.playback.Playable; import de.danoeh.antennapod.view.AspectRatioVideoView; +import java.lang.ref.WeakReference; +import java.util.concurrent.atomic.AtomicBoolean; + /** * Activity for playing video files. */ @@ -52,6 +56,7 @@ public class VideoplayerActivity extends MediaplayerActivity { private LinearLayout videoOverlay; private AspectRatioVideoView videoview; private ProgressBar progressIndicator; + private FrameLayout videoframe; @Override protected void chooseTheme() { @@ -96,10 +101,27 @@ public class VideoplayerActivity extends MediaplayerActivity { } @Override + protected void onStop() { + super.onStop(); + if (!PictureInPictureUtil.isInPictureInPictureMode(this)) { + videoControlsHider.stop(); + } + } + + @Override + public void onUserLeaveHint () { + if (!PictureInPictureUtil.isInPictureInPictureMode(this) && UserPreferences.getVideoBackgroundBehavior() + == UserPreferences.VideoBackgroundBehavior.PICTURE_IN_PICTURE) { + compatEnterPictureInPicture(); + } + } + + @Override protected void onPause() { - videoControlsHider.stop(); - if (controller != null && controller.getStatus() == PlayerStatus.PLAYING) { - controller.pause(); + if (!PictureInPictureUtil.isInPictureInPictureMode(this)) { + if (controller != null && controller.getStatus() == PlayerStatus.PLAYING) { + controller.pause(); + } } super.onPause(); } @@ -127,7 +149,7 @@ public class VideoplayerActivity extends MediaplayerActivity { @Override protected void setupGUI() { - if(isSetup.getAndSet(true)) { + if (isSetup.getAndSet(true)) { return; } super.setupGUI(); @@ -135,20 +157,23 @@ public class VideoplayerActivity extends MediaplayerActivity { controls = (LinearLayout) findViewById(R.id.controls); videoOverlay = (LinearLayout) findViewById(R.id.overlay); videoview = (AspectRatioVideoView) findViewById(R.id.videoview); + videoframe = (FrameLayout) findViewById(R.id.videoframe); progressIndicator = (ProgressBar) findViewById(R.id.progressIndicator); videoview.getHolder().addCallback(surfaceHolderCallback); - videoview.setOnTouchListener(onVideoviewTouched); + videoframe.setOnTouchListener(onVideoviewTouched); + videoOverlay.setOnTouchListener((view, motionEvent) -> true); // To suppress touches directly below the slider if (Build.VERSION.SDK_INT >= 16) { videoview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } - if (Build.VERSION.SDK_INT >= 14) { - videoOverlay.setFitsSystemWindows(true); - } + videoOverlay.setFitsSystemWindows(true); setupVideoControlsToggler(); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + videoframe.getViewTreeObserver().addOnGlobalLayoutListener(() -> + videoview.setAvailableSize(videoframe.getWidth(), videoframe.getHeight())); } @Override @@ -176,6 +201,9 @@ public class VideoplayerActivity extends MediaplayerActivity { private final View.OnTouchListener onVideoviewTouched = (v, event) -> { if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (PictureInPictureUtil.isInPictureInPictureMode(this)) { + return true; + } videoControlsHider.stop(); toggleVideoControlsVisibility(); if (videoControlsShowing) { @@ -260,7 +288,9 @@ public class VideoplayerActivity extends MediaplayerActivity { public void surfaceDestroyed(SurfaceHolder holder) { Log.d(TAG, "Videosurface was destroyed"); videoSurfaceCreated = false; - if (controller != null && !destroyingDueToReload) { + if (controller != null && !destroyingDueToReload + && UserPreferences.getVideoBackgroundBehavior() + != UserPreferences.VideoBackgroundBehavior.CONTINUE_PLAYING) { controller.notifyVideoSurfaceAbandoned(); } } @@ -269,6 +299,13 @@ public class VideoplayerActivity extends MediaplayerActivity { @Override protected void onReloadNotification(int notificationCode) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && PictureInPictureUtil.isInPictureInPictureMode(this)) { + if (notificationCode == PlaybackService.EXTRA_CODE_AUDIO + || notificationCode == PlaybackService.EXTRA_CODE_CAST) { + finish(); + } + return; + } if (notificationCode == PlaybackService.EXTRA_CODE_AUDIO) { Log.d(TAG, "ReloadNotification received, switching to Audioplayer now"); destroyingDueToReload = true; @@ -313,28 +350,31 @@ public class VideoplayerActivity extends MediaplayerActivity { videoOverlay.startAnimation(animation); controls.startAnimation(animation); } - if (Build.VERSION.SDK_INT >= 14) { - videoview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); - } + videoview.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); } @SuppressLint("NewApi") - private void hideVideoControls() { - final Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_out); - if (animation != null) { - videoOverlay.startAnimation(animation); - controls.startAnimation(animation); - } - if (Build.VERSION.SDK_INT >= 14) { - int videoviewFlag = (Build.VERSION.SDK_INT >= 16) ? View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION : 0; - getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN - | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | videoviewFlag); - videoOverlay.setFitsSystemWindows(true); + private void hideVideoControls(boolean showAnimation) { + if (showAnimation) { + final Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_out); + if (animation != null) { + videoOverlay.startAnimation(animation); + controls.startAnimation(animation); + } } + int videoviewFlag = (Build.VERSION.SDK_INT >= 16) ? View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION : 0; + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | videoviewFlag); + videoOverlay.setFitsSystemWindows(true); + videoOverlay.setVisibility(View.GONE); controls.setVisibility(View.GONE); } + private void hideVideoControls() { + hideVideoControls(true); + } + @Override protected int getContentViewResourceId() { return R.layout.videoplayer_activity; @@ -350,6 +390,32 @@ public class VideoplayerActivity extends MediaplayerActivity { } } + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + if (PictureInPictureUtil.supportsPictureInPicture(this)) { + menu.findItem(R.id.player_go_to_picture_in_picture).setVisible(true); + } + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId() == R.id.player_go_to_picture_in_picture) { + compatEnterPictureInPicture(); + return true; + } + return super.onOptionsItemSelected(item); + } + + private void compatEnterPictureInPicture() { + if (PictureInPictureUtil.supportsPictureInPicture(this) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + getSupportActionBar().hide(); + hideVideoControls(false); + enterPictureInPictureMode(); + } + } + private static class VideoControlsHider extends Handler { private static final int DELAY = 2500; @@ -362,7 +428,7 @@ public class VideoplayerActivity extends MediaplayerActivity { private final Runnable hideVideoControls = () -> { VideoplayerActivity vpa = activity != null ? activity.get() : null; - if(vpa == null) { + if (vpa == null) { return; } if (vpa.videoControlsShowing) { diff --git a/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java b/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java index 1ab60ef61..83dd3fe9c 100644 --- a/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java +++ b/app/src/main/java/de/danoeh/antennapod/config/PlaybackServiceCallbacksImpl.java @@ -3,6 +3,7 @@ package de.danoeh.antennapod.config; import android.content.Context; import android.content.Intent; +import android.os.Build; import de.danoeh.antennapod.R; import de.danoeh.antennapod.activity.AudioplayerActivity; import de.danoeh.antennapod.activity.CastplayerActivity; @@ -18,7 +19,11 @@ public class PlaybackServiceCallbacksImpl implements PlaybackServiceCallbacks { return new Intent(context, CastplayerActivity.class); } if (mediaType == MediaType.VIDEO) { - return new Intent(context, VideoplayerActivity.class); + Intent i = new Intent(context, VideoplayerActivity.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + i.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + } + return i; } else { return new Intent(context, AudioplayerActivity.class); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java index f37ecd5e7..f59bc88bf 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/CompletedDownloadsFragment.java @@ -140,18 +140,7 @@ public class CompletedDownloadsFragment extends ListFragment { super.onCreateOptionsMenu(menu, inflater); if(items != null) { inflater.inflate(R.menu.downloads_completed, menu); - MenuItem episodeActions = menu.findItem(R.id.episode_actions); - if(items.size() > 0) { - int[] attrs = {R.attr.action_bar_icon_color}; - TypedArray ta = getActivity().obtainStyledAttributes(UserPreferences.getTheme(), attrs); - int textColor = ta.getColor(0, Color.GRAY); - ta.recycle(); - episodeActions.setIcon(new IconDrawable(getActivity(), - FontAwesomeIcons.fa_gears).color(textColor).actionBarSize()); - episodeActions.setVisible(true); - } else { - episodeActions.setVisible(false); - } + menu.findItem(R.id.episode_actions).setVisible(items.size() > 0); } } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java index 8928d2bf3..417ecff89 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/EpisodesFragment.java @@ -106,7 +106,7 @@ public class EpisodesFragment extends Fragment { case POS_ALL_EPISODES: return resources.getString(R.string.all_episodes_short_label); case POS_NEW_EPISODES: - return resources.getString(R.string.new_label); + return resources.getString(R.string.new_episodes_label); case POS_FAV_EPISODES: return resources.getString(R.string.favorite_episodes_label); default: diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java index a9bf39632..4ef26ad6c 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ExternalPlayerFragment.java @@ -209,6 +209,10 @@ public class ExternalPlayerFragment extends Fragment { } private void onPositionObserverUpdate() { + if (controller.getPosition() == PlaybackService.INVALID_TIME + || controller.getDuration() == PlaybackService.INVALID_TIME) { + return; + } mProgressBar.setProgress((int) ((double) controller.getPosition() / controller.getDuration() * 100)); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java index 890f31f57..83d6f9615 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/ItemlistFragment.java @@ -31,6 +31,7 @@ import com.joanzapata.iconify.Iconify; import com.joanzapata.iconify.fonts.FontAwesomeIcons; import com.joanzapata.iconify.widget.IconTextView; +import de.danoeh.antennapod.activity.FeedSettingsActivity; import org.apache.commons.lang3.Validate; import java.util.List; @@ -221,13 +222,6 @@ public class ItemlistFragment extends ListFragment { menu.findItem(R.id.share_link_item).setVisible(false); menu.findItem(R.id.visit_website_item).setVisible(false); } - int[] attrs = { R.attr.action_bar_icon_color }; - TypedArray ta = getActivity().obtainStyledAttributes(UserPreferences.getTheme(), attrs); - int textColor = ta.getColor(0, Color.GRAY); - ta.recycle(); - - menu.findItem(R.id.episode_actions).setIcon(new IconDrawable(getActivity(), - FontAwesomeIcons.fa_gears).color(textColor).actionBarSize()); isUpdatingFeed = MenuItemUtils.updateRefreshMenuItem(menu, R.id.refresh_item, updateRefreshMenuItemChecker); } @@ -497,6 +491,7 @@ public class ItemlistFragment extends ListFragment { imgvBackground = (ImageView) header.findViewById(R.id.imgvBackground); imgvCover = (ImageView) header.findViewById(R.id.imgvCover); ImageButton butShowInfo = (ImageButton) header.findViewById(R.id.butShowInfo); + ImageButton butShowSettings = (ImageButton) header.findViewById(R.id.butShowSettings); txtvInformation = (TextView) header.findViewById(R.id.txtvInformation); txtvFailure = (IconTextView) header.findViewById(R.id.txtvFailure); @@ -509,10 +504,12 @@ public class ItemlistFragment extends ListFragment { loadFeedImage(); - butShowInfo.setOnClickListener(v -> { + butShowInfo.setOnClickListener(v -> showFeedInfo()); + imgvCover.setOnClickListener(v -> showFeedInfo()); + butShowSettings.setOnClickListener(v -> { if (viewsCreated && itemsLoaded) { - Intent startIntent = new Intent(getActivity(), FeedInfoActivity.class); - startIntent.putExtra(FeedInfoActivity.EXTRA_FEED_ID, + Intent startIntent = new Intent(getActivity(), FeedSettingsActivity.class); + startIntent.putExtra(FeedSettingsActivity.EXTRA_FEED_ID, feed.getId()); startActivity(startIntent); } @@ -520,6 +517,15 @@ public class ItemlistFragment extends ListFragment { headerCreated = true; } + private void showFeedInfo() { + if (viewsCreated && itemsLoaded) { + Intent startIntent = new Intent(getActivity(), FeedInfoActivity.class); + startIntent.putExtra(FeedInfoActivity.EXTRA_FEED_ID, + feed.getId()); + startActivity(startIntent); + } + } + private void loadFeedImage() { Glide.with(getActivity()) .load(feed.getImageLocation()) diff --git a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java index 06d88156c..407ab0bdb 100644 --- a/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java +++ b/app/src/main/java/de/danoeh/antennapod/preferences/PreferenceController.java @@ -42,6 +42,7 @@ import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import de.danoeh.antennapod.activity.AboutActivity; +import com.afollestad.materialdialogs.prefs.MaterialListPreference; import de.danoeh.antennapod.activity.ImportExportActivity; import de.danoeh.antennapod.activity.MediaplayerActivity; import de.danoeh.antennapod.activity.OpmlImportFromPathActivity; @@ -55,6 +56,7 @@ import de.danoeh.antennapod.dialog.AutoFlattrPreferenceDialog; import de.danoeh.antennapod.dialog.GpodnetSetHostnameDialog; import de.danoeh.antennapod.dialog.ProxyDialog; import de.danoeh.antennapod.dialog.VariableSpeedDialog; +import de.danoeh.antennapod.core.util.gui.PictureInPictureUtil; import org.apache.commons.lang3.ArrayUtils; import java.io.File; @@ -389,6 +391,11 @@ public class PreferenceController implements SharedPreferences.OnSharedPreferenc MediaplayerActivity.showSkipPreference(activity, MediaplayerActivity.SkipDirection.SKIP_FORWARD); return true; }); + if (!PictureInPictureUtil.supportsPictureInPicture(activity)) { + MaterialListPreference behaviour = (MaterialListPreference) ui.findPreference(UserPreferences.PREF_VIDEO_BEHAVIOR); + behaviour.setEntries(R.array.video_background_behavior_options_without_pip); + behaviour.setEntryValues(R.array.video_background_behavior_values_without_pip); + } } private void setupDownloadsScreen() { diff --git a/app/src/main/java/de/danoeh/antennapod/view/AspectRatioVideoView.java b/app/src/main/java/de/danoeh/antennapod/view/AspectRatioVideoView.java index f930c912a..e79389fb3 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/AspectRatioVideoView.java +++ b/app/src/main/java/de/danoeh/antennapod/view/AspectRatioVideoView.java @@ -25,6 +25,8 @@ public class AspectRatioVideoView extends VideoView { private int mVideoWidth; private int mVideoHeight; + private float mAvailableWidth = -1; + private float mAvailableHeight = -1; public AspectRatioVideoView(Context context) { this(context, null); @@ -48,8 +50,13 @@ public class AspectRatioVideoView extends VideoView { return; } - float heightRatio = (float) mVideoHeight / (float) getHeight(); - float widthRatio = (float) mVideoWidth / (float) getWidth(); + if (mAvailableWidth < 0 || mAvailableHeight < 0) { + mAvailableWidth = getWidth(); + mAvailableHeight = getHeight(); + } + + float heightRatio = (float) mVideoHeight / mAvailableHeight; + float widthRatio = (float) mVideoWidth / mAvailableWidth; int scaledHeight; int scaledWidth; @@ -94,4 +101,15 @@ public class AspectRatioVideoView extends VideoView { invalidate(); } + /** + * Sets the maximum size that the view might expand to + * @param width + * @param height + */ + public void setAvailableSize(float width, float height) { + mAvailableWidth = width; + mAvailableHeight = height; + requestLayout(); + } + } diff --git a/app/src/main/play/ca/listing/video b/app/src/main/play/ca/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/ca/listing/video +++ /dev/null diff --git a/app/src/main/play/contactPhone b/app/src/main/play/contactPhone deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/contactPhone +++ /dev/null diff --git a/app/src/main/play/cs-CZ/listing/video b/app/src/main/play/cs-CZ/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/cs-CZ/listing/video +++ /dev/null diff --git a/app/src/main/play/da-DK/listing/video b/app/src/main/play/da-DK/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/da-DK/listing/video +++ /dev/null diff --git a/app/src/main/play/de-DE/listing/video b/app/src/main/play/de-DE/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/de-DE/listing/video +++ /dev/null diff --git a/app/src/main/play/en-US/listing/featureGraphic/feature-graphic.png b/app/src/main/play/en-US/listing/featureGraphic/feature-graphic.png Binary files differnew file mode 100644 index 000000000..3b5261b28 --- /dev/null +++ b/app/src/main/play/en-US/listing/featureGraphic/feature-graphic.png diff --git a/app/src/main/play/en-US/listing/video b/app/src/main/play/en-US/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/en-US/listing/video +++ /dev/null diff --git a/app/src/main/play/es-ES/listing/video b/app/src/main/play/es-ES/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/es-ES/listing/video +++ /dev/null diff --git a/app/src/main/play/fr-FR/listing/video b/app/src/main/play/fr-FR/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/fr-FR/listing/video +++ /dev/null diff --git a/app/src/main/play/hi-IN/listing/video b/app/src/main/play/hi-IN/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/hi-IN/listing/video +++ /dev/null diff --git a/app/src/main/play/it-IT/listing/video b/app/src/main/play/it-IT/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/it-IT/listing/video +++ /dev/null diff --git a/app/src/main/play/iw-IL/listing/video b/app/src/main/play/iw-IL/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/iw-IL/listing/video +++ /dev/null diff --git a/app/src/main/play/ja-JP/listing/video b/app/src/main/play/ja-JP/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/ja-JP/listing/video +++ /dev/null diff --git a/app/src/main/play/ko-KR/listing/video b/app/src/main/play/ko-KR/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/ko-KR/listing/video +++ /dev/null diff --git a/app/src/main/play/nl-NL/listing/video b/app/src/main/play/nl-NL/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/nl-NL/listing/video +++ /dev/null diff --git a/app/src/main/play/pl-PL/listing/video b/app/src/main/play/pl-PL/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/pl-PL/listing/video +++ /dev/null diff --git a/app/src/main/play/pt-BR/listing/video b/app/src/main/play/pt-BR/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/pt-BR/listing/video +++ /dev/null diff --git a/app/src/main/play/pt-PT/listing/video b/app/src/main/play/pt-PT/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/pt-PT/listing/video +++ /dev/null diff --git a/app/src/main/play/ro/listing/video b/app/src/main/play/ro/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/ro/listing/video +++ /dev/null diff --git a/app/src/main/play/ru-RU/listing/video b/app/src/main/play/ru-RU/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/ru-RU/listing/video +++ /dev/null diff --git a/app/src/main/play/sv-SE/listing/video b/app/src/main/play/sv-SE/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/sv-SE/listing/video +++ /dev/null diff --git a/app/src/main/play/tr-TR/listing/video b/app/src/main/play/tr-TR/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/tr-TR/listing/video +++ /dev/null diff --git a/app/src/main/play/uk/listing/video b/app/src/main/play/uk/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/uk/listing/video +++ /dev/null diff --git a/app/src/main/play/zh-CN/listing/video b/app/src/main/play/zh-CN/listing/video deleted file mode 100644 index e69de29bb..000000000 --- a/app/src/main/play/zh-CN/listing/video +++ /dev/null diff --git a/app/src/main/res/layout/feedinfo.xml b/app/src/main/res/layout/feedinfo.xml index 549c8ce22..bb544d289 100644 --- a/app/src/main/res/layout/feedinfo.xml +++ b/app/src/main/res/layout/feedinfo.xml @@ -6,48 +6,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - <RelativeLayout - android:id="@+id/header" - android:focusable="true" - android:focusableInTouchMode="true" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:gravity="center_vertical" - android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" - android:layout_marginTop="8dp"> - - <ImageView - android:id="@+id/imgvCover" - android:contentDescription="@string/cover_label" - android:layout_width="80dp" - android:layout_height="80dp" - android:layout_alignParentLeft="true" - android:layout_alignParentTop="true" - tools:src="@drawable/ic_stat_antenna_default" - tools:background="@android:color/holo_green_dark"/> - - <TextView - android:id="@+id/txtvTitle" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - android:layout_marginLeft="8dp" - android:layout_alignTop="@id/imgvCover" - android:layout_toRightOf="@id/imgvCover" - android:layout_alignBottom="@id/imgvCover" - style="@style/AntennaPod.TextView.Heading" - tools:text="Feed title" - tools:background="@android:color/holo_green_dark"/> - - <View - android:id="@+id/divider" - android:layout_width="match_parent" - android:layout_height="1dp" - android:layout_below="@id/imgvCover" - android:layout_marginTop="8dp" - android:background="@color/holo_blue_light"/> - </RelativeLayout> + <include layout="@layout/feeditemlist_header" /> <ScrollView android:id="@+id/scrollView" @@ -57,7 +16,8 @@ android:scrollbarStyle="outsideOverlay" android:paddingLeft="16dp" android:paddingRight="16dp" - android:paddingBottom="8dp"> + android:paddingBottom="8dp" + android:clipToPadding="false"> <LinearLayout android:layout_width="match_parent" @@ -86,9 +46,10 @@ tools:background="@android:color/holo_red_light"/> <TextView - android:id="@+id/txtvAuthor" + android:id="@+id/txtvDetailsAuthor" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textIsSelectable="true" app:layout_row="0" app:layout_column="1" tools:text="Daniel Oeh" @@ -111,6 +72,7 @@ android:id="@+id/txtvLanguage" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textIsSelectable="true" app:layout_row="1" app:layout_column="1" tools:text="English" @@ -133,6 +95,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:paddingBottom="4dp" + android:background="?attr/selectableItemBackground" app:layout_row="2" app:layout_column="1" app:layout_gravity="fill" @@ -143,198 +106,6 @@ </android.support.v7.widget.GridLayout> <TextView - android:id="@+id/txtvSettings" - style="@style/AntennaPod.TextView.Heading" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/podcast_settings_label" - android:layout_marginTop="8dp"/> - - <android.support.v7.widget.GridLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - app:columnCount="2" - app:rowCount="1"> - - <TextView - android:id="@+id/txtvFeedAutoDelete" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/auto_delete_label" - app:layout_row="0" - app:layout_column="0" - app:layout_gravity="center_vertical" - android:layout_marginRight="10dp" /> - - <Spinner - android:layout_width="wrap_content" - android:layout_height="match_parent" - android:id="@+id/spnAutoDelete" - android:entries="@array/spnAutoDeleteItems" - android:layout_marginTop="8dp" - app:layout_row="0" - app:layout_column="1" - android:spinnerMode="dropdown" - app:layout_gravity="center" - android:dropDownWidth="wrap_content" - android:clickable="true" /> - </android.support.v7.widget.GridLayout> - - <CheckBox - android:id="@+id/cbxKeepUpdated" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/keep_updated" - android:enabled="true" - android:textColor="?android:attr/textColorPrimary" - tools:background="@android:color/holo_red_light" - android:checked="true" /> - - <TextView - android:id="@+id/txtvAuthentication" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/authentication_label" - android:textSize="@dimen/text_size_medium" - android:textColor="?android:attr/textColorPrimary"/> - - <TextView - android:id="@+id/txtvAuthenticationDescr" - android:text="@string/authentication_descr" - android:textSize="@dimen/text_size_small" - android:textColor="?android:attr/textColorPrimary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp"/> - - <android.support.v7.widget.GridLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - app:columnCount="2" - app:rowCount="3" - android:layout_gravity="center_horizontal"> - - <TextView - android:id="@+id/txtvUsername" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="8dp" - android:layout_marginBottom="8dp" - app:layout_row="0" - app:layout_column="0" - android:text="@string/username_label" - android:textColor="?android:attr/textColorPrimary"/> - - <EditText - android:id="@+id/etxtUsername" - android:layout_width="140sp" - android:layout_height="wrap_content" - app:layout_row="0" - app:layout_column="1" - android:hint="@string/username_label" - android:focusable="true" - android:focusableInTouchMode="true" - android:cursorVisible="true"/> - - <TextView - android:id="@+id/txtvPassword" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_marginRight="8dp" - android:layout_marginBottom="8dp" - app:layout_row="1" - app:layout_column="0" - android:text="@string/password_label" - android:textColor="?android:attr/textColorPrimary" /> - - <EditText - android:id="@+id/etxtPassword" - android:layout_width="140sp" - android:layout_height="wrap_content" - app:layout_row="1" - app:layout_column="1" - android:hint="@string/password_label" - android:inputType="textPassword" - android:focusable="true" - android:focusableInTouchMode="true" - android:cursorVisible="true"/> - - </android.support.v7.widget.GridLayout> - - <TextView - android:id="@+id/txtvAutoDownloadSettings" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/auto_download_settings_label" - android:textSize="@dimen/text_size_medium" - android:textColor="?android:attr/textColorPrimary"/> - - <CheckBox - android:id="@+id/cbxAutoDownload" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/auto_download_label" - android:enabled="false" - android:textColor="?android:attr/textColorPrimary" - tools:background="@android:color/holo_red_light" - android:checked="false" /> - - <TextView - android:id="@+id/txtvEpisodeFilters" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:text="@string/episode_filters_label" - android:textSize="@dimen/text_size_medium" - android:textColor="?android:attr/textColorPrimary"/> - - <TextView - android:id="@+id/txtvEpisodeFiltersDescription" - android:text="@string/episode_filters_description" - android:textSize="@dimen/text_size_small" - android:textColor="?android:attr/textColorPrimary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="8dp"/> - - <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/radio_filter_group" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:gravity="center" - android:orientation="horizontal"> - <RadioButton android:id="@+id/radio_filter_include" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/episode_filters_include" /> - <RadioButton android:id="@+id/radio_filter_exclude" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/episode_filters_exclude" /> - </RadioGroup> - - <EditText - android:id="@+id/etxtEpisodeFilterText" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_gravity="center" - android:lines="8" - android:minLines="1" - android:maxLines="20" - android:scrollbars="vertical" - android:hint="@string/episode_filters_hint" - android:focusable="true" - android:focusableInTouchMode="true" - android:cursorVisible="true"/> - - <TextView style="@style/AntennaPod.TextView.Heading" android:layout_width="match_parent" android:layout_height="wrap_content" @@ -346,6 +117,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" + android:textIsSelectable="true" android:text="@string/design_time_lorem_ipsum" tools:background="@android:color/holo_green_dark"/> diff --git a/app/src/main/res/layout/feeditemlist_header.xml b/app/src/main/res/layout/feeditemlist_header.xml index c6ba80e2a..1478e35d7 100644 --- a/app/src/main/res/layout/feeditemlist_header.xml +++ b/app/src/main/res/layout/feeditemlist_header.xml @@ -30,11 +30,10 @@ <ImageButton android:id="@+id/butShowInfo" - android:layout_width="48dp" - android:layout_height="48dp" + android:layout_width="40dp" + android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" - android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" android:layout_marginTop="8dp" android:background="?attr/selectableItemBackground" @@ -42,6 +41,19 @@ android:src="@drawable/ic_info_white_24dp" tools:background="@android:color/holo_green_dark"/> + <ImageButton + android:id="@+id/butShowSettings" + android:layout_width="40dp" + android:layout_height="40dp" + android:background="?attr/selectableItemBackground" + android:contentDescription="@string/show_feed_settings_label" + android:src="@drawable/ic_settings_white_24dp" + tools:background="@android:color/holo_green_dark" + android:layout_below="@+id/butShowInfo" + android:layout_marginBottom="16dp" + android:layout_alignParentRight="true" + android:layout_alignParentEnd="true"/> + <TextView android:id="@+id/txtvTitle" style="@style/AntennaPod.TextView.Heading" @@ -63,12 +75,12 @@ <TextView android:id="@+id/txtvAuthor" - android:layout_width="wrap_content" + android:layout_width="0dip" android:layout_height="wrap_content" android:layout_below="@id/txtvTitle" android:layout_marginBottom="16dp" android:layout_marginLeft="16dp" - android:layout_marginRight="16dp" + android:layout_toLeftOf="@id/butShowSettings" android:layout_toRightOf="@id/imgvCover" android:ellipsize="end" android:lines="1" @@ -77,7 +89,7 @@ android:textColor="@color/white" android:textSize="@dimen/text_size_small" tools:text="Podcast author" - tools:background="@android:color/holo_green_dark" /> + tools:background="@android:color/holo_green_dark"/> <com.joanzapata.iconify.widget.IconTextView android:id="@+id/txtvFailure" diff --git a/app/src/main/res/layout/feedsettings.xml b/app/src/main/res/layout/feedsettings.xml new file mode 100644 index 000000000..23d116d4c --- /dev/null +++ b/app/src/main/res/layout/feedsettings.xml @@ -0,0 +1,215 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <include layout="@layout/feeditemlist_header" /> + + <ScrollView + android:id="@+id/scrollView" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1" + android:scrollbarStyle="outsideOverlay" + android:paddingLeft="16dp" + android:paddingRight="16dp" + android:paddingBottom="8dp" + android:clipToPadding="false"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical"> + + <android.support.v7.widget.GridLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:columnCount="2" + app:rowCount="1"> + + <TextView + android:id="@+id/txtvFeedAutoDelete" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/auto_delete_label" + app:layout_row="0" + app:layout_column="0" + app:layout_gravity="center_vertical" + android:layout_marginRight="10dp" /> + + <Spinner + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:id="@+id/spnAutoDelete" + android:entries="@array/spnAutoDeleteItems" + android:layout_marginTop="8dp" + app:layout_row="0" + app:layout_column="1" + android:spinnerMode="dropdown" + app:layout_gravity="center" + android:dropDownWidth="wrap_content" + android:clickable="true" /> + </android.support.v7.widget.GridLayout> + + <CheckBox + android:id="@+id/cbxKeepUpdated" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/keep_updated" + android:enabled="true" + android:textColor="?android:attr/textColorPrimary" + tools:background="@android:color/holo_red_light" + android:checked="true" /> + + <TextView + android:id="@+id/txtvAuthentication" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/authentication_label" + android:textSize="@dimen/text_size_medium" + android:textColor="?android:attr/textColorPrimary"/> + + <TextView + android:id="@+id/txtvAuthenticationDescr" + android:text="@string/authentication_descr" + android:textSize="@dimen/text_size_small" + android:textColor="?android:attr/textColorPrimary" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp"/> + + <android.support.v7.widget.GridLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + app:columnCount="2" + app:rowCount="3" + android:layout_gravity="center_horizontal"> + + <TextView + android:id="@+id/txtvUsername" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="8dp" + android:layout_marginBottom="8dp" + app:layout_row="0" + app:layout_column="0" + android:text="@string/username_label" + android:textColor="?android:attr/textColorPrimary"/> + + <EditText + android:id="@+id/etxtUsername" + android:layout_width="140sp" + android:layout_height="wrap_content" + app:layout_row="0" + app:layout_column="1" + android:hint="@string/username_label" + android:focusable="true" + android:focusableInTouchMode="true" + android:cursorVisible="true"/> + + <TextView + android:id="@+id/txtvPassword" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginRight="8dp" + android:layout_marginBottom="8dp" + app:layout_row="1" + app:layout_column="0" + android:text="@string/password_label" + android:textColor="?android:attr/textColorPrimary" /> + + <EditText + android:id="@+id/etxtPassword" + android:layout_width="140sp" + android:layout_height="wrap_content" + app:layout_row="1" + app:layout_column="1" + android:hint="@string/password_label" + android:inputType="textPassword" + android:focusable="true" + android:focusableInTouchMode="true" + android:cursorVisible="true"/> + + </android.support.v7.widget.GridLayout> + + <TextView + android:id="@+id/txtvAutoDownloadSettings" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/auto_download_settings_label" + android:textSize="@dimen/text_size_medium" + android:textColor="?android:attr/textColorPrimary"/> + + <CheckBox + android:id="@+id/cbxAutoDownload" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/auto_download_label" + android:enabled="false" + android:textColor="?android:attr/textColorPrimary" + tools:background="@android:color/holo_red_light" + android:checked="false" /> + + <TextView + android:id="@+id/txtvEpisodeFilters" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/episode_filters_label" + android:textSize="@dimen/text_size_medium" + android:textColor="?android:attr/textColorPrimary"/> + + <TextView + android:id="@+id/txtvEpisodeFiltersDescription" + android:text="@string/episode_filters_description" + android:textSize="@dimen/text_size_small" + android:textColor="?android:attr/textColorPrimary" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_marginTop="8dp"/> + + <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/radio_filter_group" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:gravity="center" + android:orientation="horizontal"> + <RadioButton android:id="@+id/radio_filter_include" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/episode_filters_include" /> + <RadioButton android:id="@+id/radio_filter_exclude" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="@string/episode_filters_exclude" /> + </RadioGroup> + + <EditText + android:id="@+id/etxtEpisodeFilterText" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:lines="8" + android:minLines="1" + android:maxLines="20" + android:scrollbars="vertical" + android:hint="@string/episode_filters_hint" + android:focusable="true" + android:focusableInTouchMode="true" + android:cursorVisible="true"/> + + </LinearLayout> + + </ScrollView> + +</LinearLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/videoplayer_activity.xml b/app/src/main/res/layout/videoplayer_activity.xml index 4db663e19..10fbf8f49 100644 --- a/app/src/main/res/layout/videoplayer_activity.xml +++ b/app/src/main/res/layout/videoplayer_activity.xml @@ -3,7 +3,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" - android:orientation="vertical"> + android:orientation="vertical" + android:id="@+id/videoframe"> <de.danoeh.antennapod.view.AspectRatioVideoView android:id="@+id/videoview" @@ -103,6 +104,7 @@ android:layout_height="wrap_content" android:layout_toLeftOf="@+id/txtvLength" android:layout_toRightOf="@+id/txtvPosition" + android:layout_centerInParent="true" android:max="500" /> </RelativeLayout> diff --git a/app/src/main/res/menu/downloads_completed.xml b/app/src/main/res/menu/downloads_completed.xml index dc2996893..a88d93913 100644 --- a/app/src/main/res/menu/downloads_completed.xml +++ b/app/src/main/res/menu/downloads_completed.xml @@ -6,7 +6,8 @@ <item android:id="@+id/episode_actions" android:menuCategory="container" - android:title="@string/episode_actions" + android:title="@string/batch_edit" + android:icon="?attr/checkbox_multiple" custom:showAsAction="always"> </item> diff --git a/app/src/main/res/menu/feedlist.xml b/app/src/main/res/menu/feedlist.xml index 0646dc70f..3882cdff1 100644 --- a/app/src/main/res/menu/feedlist.xml +++ b/app/src/main/res/menu/feedlist.xml @@ -12,7 +12,8 @@ <item android:id="@+id/episode_actions" android:menuCategory="container" - android:title="@string/episode_actions" + android:icon="?attr/checkbox_multiple" + android:title="@string/batch_edit" custom:showAsAction="always"> </item> <item diff --git a/app/src/main/res/menu/mediaplayer.xml b/app/src/main/res/menu/mediaplayer.xml index 530eb3400..98c7478a6 100644 --- a/app/src/main/res/menu/mediaplayer.xml +++ b/app/src/main/res/menu/mediaplayer.xml @@ -41,6 +41,14 @@ android:title="@string/visit_website_label" android:visible="false"> </item> + + <item + android:id="@+id/player_go_to_picture_in_picture" + custom:showAsAction="collapseActionView" + android:title="@string/player_go_to_picture_in_picture" + android:visible="false"> + </item> + <item android:id="@+id/share_item" android:icon="?attr/social_share" diff --git a/app/src/main/res/xml/preferences_playback.xml b/app/src/main/res/xml/preferences_playback.xml index 96bb7379a..49a53726c 100644 --- a/app/src/main/res/xml/preferences_playback.xml +++ b/app/src/main/res/xml/preferences_playback.xml @@ -36,6 +36,14 @@ android:key="prefResumeAfterCall" android:summary="@string/pref_resumeAfterCall_sum" android:title="@string/pref_resumeAfterCall_title"/> + <com.afollestad.materialdialogs.prefs.MaterialListPreference + android:defaultValue="stop" + android:entries="@array/video_background_behavior_options" + android:entryValues="@array/video_background_behavior_values" + android:key="prefVideoBehavior" + android:summary="@string/pref_videoBehavior_sum" + android:title="@string/pref_videoBehavior_title" + app:useStockLayout="true"/> </PreferenceCategory> <PreferenceCategory android:title="@string/buttons"> |