diff options
Diffstat (limited to 'app/src')
11 files changed, 171 insertions, 107 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java index fab84078e..62fd4b515 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MainActivity.java @@ -111,20 +111,13 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi private Toolbar toolbar; private ExternalPlayerFragment externalPlayerFragment; private DrawerLayout drawerLayout; - private View navDrawer; private ListView navList; private NavListAdapter navAdapter; private int mPosition = -1; - private ActionBarDrawerToggle drawerToggle; - private CharSequence currentTitle; - - private ProgressDialog pd; - private Disposable disposable; - private long lastBackButtonPressTime = 0; @NonNull @@ -282,10 +275,6 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi return drawerLayout != null && navDrawer != null && drawerLayout.isDrawerOpen(navDrawer); } - public List<Feed> getFeeds() { - return (navDrawerData != null) ? navDrawerData.feeds : null; - } - private void loadFragment(int index, Bundle args) { Log.d(TAG, "loadFragment(index: " + index + ", args: " + args + ")"); if (index < navAdapter.getSubscriptionOffset()) { @@ -518,9 +507,6 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi if (disposable != null) { disposable.dispose(); } - if(pd != null) { - pd.dismiss(); - } } @@ -849,9 +835,4 @@ public class MainActivity extends CastEnabledActivity implements NavDrawerActivi super.onNewIntent(intent); setIntent(intent); } - - @VisibleForTesting - public void updateNavDrawer() { - navAdapter.notifyDataSetChanged(); - } } diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java index 21f4ad5be..3b81dbd0b 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerInfoActivity.java @@ -28,8 +28,6 @@ import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; -import com.viewpagerindicator.CirclePageIndicator; - import java.util.List; import de.danoeh.antennapod.R; @@ -38,6 +36,7 @@ import de.danoeh.antennapod.core.asynctask.FeedRemover; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.event.FeedListUpdateEvent; import de.danoeh.antennapod.core.event.MessageEvent; +import de.danoeh.antennapod.core.feed.Chapter; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.preferences.UserPreferences; @@ -59,6 +58,7 @@ import de.danoeh.antennapod.fragment.PlaybackHistoryFragment; import de.danoeh.antennapod.fragment.QueueFragment; import de.danoeh.antennapod.fragment.SubscriptionFragment; import de.danoeh.antennapod.menuhandler.NavDrawerActivity; +import de.danoeh.antennapod.view.PagerIndicatorView; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; @@ -102,6 +102,7 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem private int mPosition = -1; private ViewPager pager; + private PagerIndicatorView pageIndicator; private MediaplayerInfoPagerAdapter pagerAdapter; private Disposable disposable; @@ -261,8 +262,10 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem pager.setOffscreenPageLimit(3); pagerAdapter = new MediaplayerInfoPagerAdapter(getSupportFragmentManager()); pager.setAdapter(pagerAdapter); - CirclePageIndicator pageIndicator = findViewById(R.id.page_indicator); + pageIndicator = findViewById(R.id.page_indicator); pageIndicator.setViewPager(pager); + pageIndicator.setOnClickListener(v + -> pager.setCurrentItem((pager.getCurrentItem() + 1) % pager.getChildCount())); loadLastFragment(); pager.onSaveInstanceState(); @@ -270,6 +273,16 @@ public abstract class MediaplayerInfoActivity extends MediaplayerActivity implem } @Override + boolean loadMediaInfo() { + if (controller != null) { + List<Chapter> chapters = controller.getMedia().getChapters(); + boolean hasChapters = chapters != null && !chapters.isEmpty(); + pageIndicator.setDisabledPage(hasChapters ? -1 : 2); + } + return super.loadMediaInfo(); + } + + @Override protected void onReloadNotification(int notificationCode) { if (notificationCode == PlaybackService.EXTRA_CODE_VIDEO) { Log.d(TAG, "ReloadNotification received, switching to Videoplayer now"); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java index 227eea6e0..c49d2f39d 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/DownloadStatisticsListAdapter.java @@ -3,10 +3,12 @@ package de.danoeh.antennapod.adapter; import android.content.Context; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.StatisticsItem; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.view.PieChartView; +import java.util.List; + /** * Adapter for the download statistics list. */ @@ -27,17 +29,17 @@ public class DownloadStatisticsListAdapter extends StatisticsListAdapter { } @Override - PieChartView.PieChartData generateChartData(DBReader.StatisticsData statisticsData) { - float[] dataValues = new float[statisticsData.feeds.size()]; - for (int i = 0; i < statisticsData.feeds.size(); i++) { - DBReader.StatisticsItem item = statisticsData.feeds.get(i); + PieChartView.PieChartData generateChartData(List<StatisticsItem> statisticsData) { + float[] dataValues = new float[statisticsData.size()]; + for (int i = 0; i < statisticsData.size(); i++) { + StatisticsItem item = statisticsData.get(i); dataValues[i] = item.totalDownloadSize; } return new PieChartView.PieChartData(dataValues); } @Override - void onBindFeedViewHolder(StatisticsHolder holder, DBReader.StatisticsItem item) { + void onBindFeedViewHolder(StatisticsHolder holder, StatisticsItem item) { holder.value.setText(Converter.byteToString(item.totalDownloadSize)); } diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/PlaybackStatisticsListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/PlaybackStatisticsListAdapter.java index 8471569d3..c5a73c53e 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/PlaybackStatisticsListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/PlaybackStatisticsListAdapter.java @@ -4,10 +4,12 @@ import android.content.Context; import androidx.appcompat.app.AlertDialog; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.StatisticsItem; import de.danoeh.antennapod.core.util.Converter; import de.danoeh.antennapod.view.PieChartView; +import java.util.List; + /** * Adapter for the playback statistics list. */ @@ -34,17 +36,17 @@ public class PlaybackStatisticsListAdapter extends StatisticsListAdapter { } @Override - PieChartView.PieChartData generateChartData(DBReader.StatisticsData statisticsData) { - float[] dataValues = new float[statisticsData.feeds.size()]; - for (int i = 0; i < statisticsData.feeds.size(); i++) { - DBReader.StatisticsItem item = statisticsData.feeds.get(i); + PieChartView.PieChartData generateChartData(List<StatisticsItem> statisticsData) { + float[] dataValues = new float[statisticsData.size()]; + for (int i = 0; i < statisticsData.size(); i++) { + StatisticsItem item = statisticsData.get(i); dataValues[i] = countAll ? item.timePlayedCountAll : item.timePlayed; } return new PieChartView.PieChartData(dataValues); } @Override - void onBindFeedViewHolder(StatisticsHolder holder, DBReader.StatisticsItem statsItem) { + void onBindFeedViewHolder(StatisticsHolder holder, StatisticsItem statsItem) { long time = countAll ? statsItem.timePlayedCountAll : statsItem.timePlayed; holder.value.setText(Converter.shortLocalizedDuration(context, time)); diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java b/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java index db65190f2..5f019d1db 100644 --- a/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java +++ b/app/src/main/java/de/danoeh/antennapod/adapter/StatisticsListAdapter.java @@ -14,9 +14,11 @@ import com.bumptech.glide.request.RequestOptions; import de.danoeh.antennapod.R; import de.danoeh.antennapod.core.glide.ApGlideSettings; -import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.StatisticsItem; import de.danoeh.antennapod.view.PieChartView; +import java.util.List; + /** * Parent Adapter for the playback and download statistics list. */ @@ -24,7 +26,7 @@ public abstract class StatisticsListAdapter extends RecyclerView.Adapter<Recycle private static final int TYPE_HEADER = 0; private static final int TYPE_FEED = 1; final Context context; - private DBReader.StatisticsData statisticsData; + private List<StatisticsItem> statisticsData; PieChartView.PieChartData pieChartData; StatisticsListAdapter(Context context) { @@ -33,14 +35,14 @@ public abstract class StatisticsListAdapter extends RecyclerView.Adapter<Recycle @Override public int getItemCount() { - return statisticsData.feeds.size() + 1; + return statisticsData.size() + 1; } - public DBReader.StatisticsItem getItem(int position) { + public StatisticsItem getItem(int position) { if (position == 0) { return null; } - return statisticsData.feeds.get(position - 1); + return statisticsData.get(position - 1); } @Override @@ -69,7 +71,7 @@ public abstract class StatisticsListAdapter extends RecyclerView.Adapter<Recycle holder.totalTime.setText(getHeaderValue()); } else { StatisticsHolder holder = (StatisticsHolder) h; - DBReader.StatisticsItem statsItem = statisticsData.feeds.get(position - 1); + StatisticsItem statsItem = statisticsData.get(position - 1); Glide.with(context) .load(statsItem.feed.getImageLocation()) .apply(new RequestOptions() @@ -86,8 +88,8 @@ public abstract class StatisticsListAdapter extends RecyclerView.Adapter<Recycle } } - public void update(DBReader.StatisticsData statistics) { - this.statisticsData = statistics; + public void update(List<StatisticsItem> statistics) { + statisticsData = statistics; pieChartData = generateChartData(statistics); notifyDataSetChanged(); } @@ -122,7 +124,7 @@ public abstract class StatisticsListAdapter extends RecyclerView.Adapter<Recycle abstract String getHeaderValue(); - abstract PieChartView.PieChartData generateChartData(DBReader.StatisticsData statisticsData); + abstract PieChartView.PieChartData generateChartData(List<StatisticsItem> statisticsData); - abstract void onBindFeedViewHolder(StatisticsHolder holder, DBReader.StatisticsItem item); + abstract void onBindFeedViewHolder(StatisticsHolder holder, StatisticsItem item); } diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadStatisticsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadStatisticsFragment.java index 34ea6d6e3..3059d7ad2 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadStatisticsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/DownloadStatisticsFragment.java @@ -16,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView; import de.danoeh.antennapod.R; import de.danoeh.antennapod.adapter.DownloadStatisticsListAdapter; import de.danoeh.antennapod.core.storage.DBReader; +import de.danoeh.antennapod.core.storage.StatisticsItem; import de.danoeh.antennapod.core.util.comparator.CompareCompat; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -23,6 +24,7 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import java.util.Collections; +import java.util.List; /** * Displays the 'download statistics' screen @@ -71,8 +73,8 @@ public class DownloadStatisticsFragment extends Fragment { disposable = Observable.fromCallable(() -> { - DBReader.StatisticsData statisticsData = DBReader.getStatistics(); - Collections.sort(statisticsData.feeds, (item1, item2) -> + List<StatisticsItem> statisticsData = DBReader.getStatistics(); + Collections.sort(statisticsData, (item1, item2) -> CompareCompat.compareLong(item1.totalDownloadSize, item2.totalDownloadSize)); return statisticsData; }) diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackStatisticsFragment.java b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackStatisticsFragment.java index bed767e8e..d25dff743 100644 --- a/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackStatisticsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/fragment/preferences/PlaybackStatisticsFragment.java @@ -27,6 +27,7 @@ import de.danoeh.antennapod.adapter.PlaybackStatisticsListAdapter; import de.danoeh.antennapod.core.dialog.ConfirmationDialog; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; +import de.danoeh.antennapod.core.storage.StatisticsItem; import de.danoeh.antennapod.core.util.comparator.CompareCompat; import io.reactivex.Completable; import io.reactivex.Observable; @@ -35,6 +36,7 @@ import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; import java.util.Collections; +import java.util.List; /** * Displays the 'playback statistics' screen @@ -180,13 +182,13 @@ public class PlaybackStatisticsFragment extends Fragment { }, error -> Log.e(TAG, Log.getStackTraceString(error))); } - private DBReader.StatisticsData fetchStatistics() { - DBReader.StatisticsData statisticsData = DBReader.getStatistics(); + private List<StatisticsItem> fetchStatistics() { + List<StatisticsItem> statisticsData = DBReader.getStatistics(); if (countAll) { - Collections.sort(statisticsData.feeds, (item1, item2) -> + Collections.sort(statisticsData, (item1, item2) -> CompareCompat.compareLong(item1.timePlayedCountAll, item2.timePlayedCountAll)); } else { - Collections.sort(statisticsData.feeds, (item1, item2) -> + Collections.sort(statisticsData, (item1, item2) -> CompareCompat.compareLong(item1.timePlayed, item2.timePlayed)); } return statisticsData; diff --git a/app/src/main/java/de/danoeh/antennapod/view/PagerIndicatorView.java b/app/src/main/java/de/danoeh/antennapod/view/PagerIndicatorView.java new file mode 100644 index 000000000..60ef820a9 --- /dev/null +++ b/app/src/main/java/de/danoeh/antennapod/view/PagerIndicatorView.java @@ -0,0 +1,105 @@ +package de.danoeh.antennapod.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; +import androidx.annotation.Nullable; +import androidx.vectordrawable.graphics.drawable.ArgbEvaluator; +import androidx.viewpager.widget.ViewPager; + +public class PagerIndicatorView extends View { + private final Paint paint = new Paint(); + private float position = 0; + private int numPages = 0; + private int disabledPage = -1; + private int circleColor = 0; + private int circleColorHighlight = -1; + + public PagerIndicatorView(Context context) { + super(context); + setup(); + } + + public PagerIndicatorView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + setup(); + } + + public PagerIndicatorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + setup(); + } + + private void setup() { + paint.setAntiAlias(true); + paint.setStyle(Paint.Style.FILL); + + int[] colorAttrs = new int[] { android.R.attr.textColorSecondary }; + TypedArray a = getContext().obtainStyledAttributes(colorAttrs); + circleColorHighlight = a.getColor(0, 0xffffffff); + circleColor = (Integer) new ArgbEvaluator().evaluate(0.8f, 0x00ffffff, circleColorHighlight); + a.recycle(); + } + + public void setViewPager(ViewPager pager) { + numPages = pager.getAdapter().getCount(); + pager.getAdapter().registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + numPages = pager.getAdapter().getCount(); + invalidate(); + } + }); + pager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + PagerIndicatorView.this.position = position + positionOffset; + invalidate(); + } + }); + } + + public void setDisabledPage(int disabledPage) { + this.disabledPage = disabledPage; + invalidate(); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + for (int i = 0; i < numPages; i++) { + if ((int) Math.floor(position) == i) { + // This is the current dot + drawCircle(canvas, i, (float) (1 - (position - Math.floor(position)))); + } else if ((int) Math.ceil(position) == i) { + // This is the next dot + drawCircle(canvas, i, (float) (position - Math.floor(position))); + } else { + drawCircle(canvas, i, 0); + } + } + } + + private void drawCircle(Canvas canvas, int position, float frac) { + float circleRadiusSmall = canvas.getHeight() * 0.26f; + float circleRadiusBig = canvas.getHeight() * 0.35f; + float circleRadiusDelta = (circleRadiusBig - circleRadiusSmall); + float start = 0.5f * (canvas.getWidth() - numPages * 1.5f * canvas.getHeight()); + paint.setStrokeWidth(canvas.getHeight() * 0.3f); + + if (position == disabledPage) { + paint.setStyle(Paint.Style.STROKE); + } else { + paint.setStyle(Paint.Style.FILL_AND_STROKE); + } + + paint.setColor((Integer) new ArgbEvaluator().evaluate(frac, circleColor, circleColorHighlight)); + canvas.drawCircle(start + (position * 1.5f + 0.75f) * canvas.getHeight(), 0.5f * canvas.getHeight(), + circleRadiusSmall + frac * circleRadiusDelta, paint); + } +}
\ No newline at end of file diff --git a/app/src/main/java/de/danoeh/antennapod/view/PieChartView.java b/app/src/main/java/de/danoeh/antennapod/view/PieChartView.java index c0c74c42c..ab4920119 100644 --- a/app/src/main/java/de/danoeh/antennapod/view/PieChartView.java +++ b/app/src/main/java/de/danoeh/antennapod/view/PieChartView.java @@ -81,7 +81,7 @@ public class PieChartView extends AppCompatImageView { } public boolean isLargeEnoughToDisplay(int index) { - return getPercentageOfItem(index) > 0.05; + return getPercentageOfItem(index) > 0.04; } public int getColorOfItem(int index) { @@ -94,7 +94,6 @@ public class PieChartView extends AppCompatImageView { private static class PieChartDrawable extends Drawable { private static final float PADDING_DEGREES = 3f; - private static final float STROKE_SIZE = 15f; private PieChartData data; private final Paint paint; @@ -104,14 +103,16 @@ public class PieChartView extends AppCompatImageView { paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); - paint.setStrokeWidth(STROKE_SIZE); } @Override public void draw(@NonNull Canvas canvas) { - float radius = getBounds().height() - STROKE_SIZE; + final float strokeSize = getBounds().height() / 30f; + paint.setStrokeWidth(strokeSize); + + float radius = getBounds().height() - strokeSize; float center = getBounds().width() / 2.f; - RectF arcBounds = new RectF(center - radius, STROKE_SIZE, center + radius, STROKE_SIZE + radius * 2); + RectF arcBounds = new RectF(center - radius, strokeSize, center + radius, strokeSize + radius * 2); float startAngle = 180; for (int i = 0; i < data.values.length; i++) { diff --git a/app/src/main/java/de/danoeh/antennapod/view/SwipeGestureDetector.java b/app/src/main/java/de/danoeh/antennapod/view/SwipeGestureDetector.java deleted file mode 100644 index f4ee092df..000000000 --- a/app/src/main/java/de/danoeh/antennapod/view/SwipeGestureDetector.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.danoeh.antennapod.view; - -import android.util.Log; -import android.view.GestureDetector; -import android.view.MotionEvent; - -public class SwipeGestureDetector extends GestureDetector.SimpleOnGestureListener { - - private static final String TAG = "SwipeGestureDetector"; - - private static final int SWIPE_MIN_DISTANCE = 120; - private static final int SWIPE_MAX_OFF_PATH = 250; - private static final int SWIPE_THRESHOLD_VELOCITY = 200; - - private final OnSwipeGesture callback; - - public SwipeGestureDetector(OnSwipeGesture callback) { - this.callback = callback; - } - - @Override - public boolean onDown(MotionEvent e) { - return true; - } - - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - try { - if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) - return false; - if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE - && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { - return callback.onSwipeRightToLeft(); - } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE - && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { - return callback.onSwipeLeftToRight(); - } - } catch (Exception e) { - Log.d(TAG, Log.getStackTraceString(e)); - } - return false; - } - -} diff --git a/app/src/main/res/layout/mediaplayerinfo_activity.xml b/app/src/main/res/layout/mediaplayerinfo_activity.xml index 636cbb015..0f6101795 100644 --- a/app/src/main/res/layout/mediaplayerinfo_activity.xml +++ b/app/src/main/res/layout/mediaplayerinfo_activity.xml @@ -26,16 +26,14 @@ android:minHeight="?attr/actionBarSize" tools:background="@android:color/darker_gray"/> - <com.viewpagerindicator.CirclePageIndicator + <de.danoeh.antennapod.view.PagerIndicatorView android:id="@+id/page_indicator" - android:layout_height="wrap_content" - android:layout_width="match_parent" + android:layout_height="8dp" + android:layout_width="40dp" android:layout_marginTop="-12dp" - android:layout_marginBottom="4dp" - android:background="@android:color/transparent" - app:fillColor="?android:attr/textColorSecondary" - app:strokeColor="?android:attr/textColorSecondary" - app:radius="4dp" /> + android:paddingBottom="4dp" + android:layout_gravity="center" + android:background="@android:color/transparent"/> </com.google.android.material.appbar.AppBarLayout> |