package de.luhmer.owncloudnewsreader; import android.content.Context; import android.net.Uri; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import android.widget.ViewSwitcher; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.ImageLoader; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import java.io.File; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import de.luhmer.owncloudnewsreader.ListView.PodcastArrayAdapter; import de.luhmer.owncloudnewsreader.ListView.PodcastFeedArrayAdapter; import de.luhmer.owncloudnewsreader.events.podcast.StartDownloadPodcast; import de.luhmer.owncloudnewsreader.events.podcast.TogglePlayerStateEvent; import de.luhmer.owncloudnewsreader.events.podcast.UpdatePodcastStatusEvent; import de.luhmer.owncloudnewsreader.events.podcast.WindPodcast; import de.luhmer.owncloudnewsreader.model.MediaItem; import de.luhmer.owncloudnewsreader.model.PodcastFeedItem; import de.luhmer.owncloudnewsreader.model.PodcastItem; import de.luhmer.owncloudnewsreader.services.PodcastDownloadService; import de.luhmer.owncloudnewsreader.services.podcast.PlaybackService; import de.luhmer.owncloudnewsreader.view.PodcastSlidingUpPanelLayout; /** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link PodcastFragment.OnFragmentInteractionListener} interface * to handle interaction events. * Use the {@link PodcastFragment#newInstance} factory method to * create an instance of this fragment. * */ public class PodcastFragment extends Fragment { private static final String TAG = PodcastFragment.class.getCanonicalName(); private UpdatePodcastStatusEvent podcast; private int lastDrawableId; private OnFragmentInteractionListener mListener; /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @return A new instance of fragment PodcastFragment. */ public static PodcastFragment newInstance() { return new PodcastFragment(); } public PodcastFragment() { // Required empty public constructor } //Your created method public boolean onBackPressed() //returns if the event was handled { return false; } EventBus eventBus; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); eventBus = EventBus.getDefault(); } @Override public void onResume() { eventBus.register(this); super.onResume(); } @Override public void onPause() { eventBus.unregister(this); super.onPause(); } @Subscribe public void onEvent(StartDownloadPodcast podcast) { PodcastDownloadService.startPodcastDownload(getActivity(), podcast.podcast);//, new DownloadReceiver(new Handler(), new WeakReference<ProgressBar>(holder.pbDownloadPodcast))); } @Subscribe public void onEvent(PodcastDownloadService.DownloadProgressUpdate downloadProgress) { PodcastArrayAdapter podcastArrayAdapter = (PodcastArrayAdapter) podcastTitleGrid.getAdapter(); for(int i = 0; i < podcastTitleGrid.getCount(); i++) { if(podcastArrayAdapter.getItem(i).link.equals(downloadProgress.podcast.link)) { if(!podcastArrayAdapter.getItem(i).downloadProgress.equals(downloadProgress.podcast.downloadProgress)) { //If Progress changed PodcastItem pItem = podcastArrayAdapter.getItem(i); if (downloadProgress.podcast.downloadProgress == 100) { pItem.downloadProgress = PodcastItem.DOWNLOAD_COMPLETED; File file = new File(PodcastDownloadService.getUrlToPodcastFile(getActivity(), pItem.link, false)); pItem.offlineCached = file.exists(); } else pItem.downloadProgress = downloadProgress.podcast.downloadProgress; podcastTitleGrid.invalidateViews(); } return; } } } long lastPodcastRssItemId = -1; @Subscribe public void onEvent(UpdatePodcastStatusEvent podcast) { this.podcast = podcast; hasTitleInCache = true; int drawableId = podcast.isPlaying() ? R.drawable.ic_action_pause : R.drawable.ic_action_play_arrow; int contentDescriptionId = podcast.isPlaying() ? R.string.content_desc_pause : R.string.content_desc_play; if(lastDrawableId != drawableId) { lastDrawableId = drawableId; btnPlayPausePodcast.setImageResource(drawableId); btnPlayPausePodcast.setContentDescription(getString(contentDescriptionId)); btnPlayPausePodcastSlider.setImageResource(drawableId); } if(lastPodcastRssItemId != podcast.getRssItemId() && imgFavIcon != null) { if(loadPodcastFavIcon()) { //Returns false if PodcastItem is not found (e.g. Service is not connected to Activity yet) lastPodcastRssItemId = podcast.getRssItemId(); } } int hours = (int)(podcast.getCurrent() / (1000*60*60)); int minutes = (int)(podcast.getCurrent() % (1000*60*60)) / (1000*60); int seconds = (int) ((podcast.getCurrent() % (1000*60*60)) % (1000*60) / 1000); minutes += hours * 60; tvFrom.setText(String.format("%02d:%02d", minutes, seconds)); tvFromSlider.setText(String.format("%02d:%02d", minutes, seconds)); hours = (int)( podcast.getMax() / (1000*60*60)); minutes = (int)(podcast.getMax() % (1000*60*60)) / (1000*60); seconds = (int) ((podcast.getMax() % (1000*60*60)) % (1000*60) / 1000); minutes += hours * 60; tvTo.setText(String.format("%02d:%02d", minutes, seconds)); tvToSlider.setText(String.format("%02d:%02d", minutes, seconds)); tvTitle.setText(podcast.getTitle()); tvTitleSlider.setText(podcast.getTitle()); if(podcast.getStatus() == PlaybackService.Status.PREPARING) { sb_progress.setVisibility(View.INVISIBLE); pb_progress2.setVisibility(View.VISIBLE); pb_progress.setIndeterminate(true); } else { double progress = ((double) podcast.getCurrent() / (double) podcast.getMax()) * 100d; if(!blockSeekbarUpdate) { sb_progress.setVisibility(View.VISIBLE); pb_progress2.setVisibility(View.INVISIBLE); sb_progress.setProgress((int) progress); } pb_progress.setIndeterminate(false); pb_progress.setProgress((int) progress); } } private boolean loadPodcastFavIcon() { MediaItem podcastItem = ((PodcastFragmentActivity) getActivity()).getCurrentPlayingPodcast(); if(podcastItem != null) { String favIconUrl = podcastItem.favIcon; DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder(). showImageOnLoading(R.drawable.default_feed_icon_light). showImageForEmptyUri(R.drawable.default_feed_icon_light). showImageOnFail(R.drawable.default_feed_icon_light). build(); ImageLoader.getInstance().displayImage(favIconUrl, imgFavIcon, displayImageOptions); } return podcastItem != null; } @Bind(R.id.btn_playPausePodcast) ImageButton btnPlayPausePodcast; @Bind(R.id.btn_playPausePodcastSlider) ImageButton btnPlayPausePodcastSlider; @Bind(R.id.btn_nextPodcastSlider) ImageButton btnNextPodcastSlider; @Bind(R.id.btn_previousPodcastSlider) ImageButton btnPreviousPodcastSlider; @Bind(R.id.img_feed_favicon) ImageView imgFavIcon; @Bind(R.id.tv_title) TextView tvTitle; @Bind(R.id.tv_titleSlider) TextView tvTitleSlider; @Bind(R.id.tv_from) TextView tvFrom; @Bind(R.id.tv_to) TextView tvTo; @Bind(R.id.tv_fromSlider) TextView tvFromSlider; @Bind(R.id.tv_ToSlider) TextView tvToSlider; @Bind(R.id.sb_progress) SeekBar sb_progress; @Bind(R.id.pb_progress) ProgressBar pb_progress; @Bind(R.id.pb_progress2) ProgressBar pb_progress2; @Bind(R.id.podcastFeedList) ListView /* CardGridView CardListView*/ podcastFeedList; @Bind(R.id.rlPodcast) RelativeLayout rlPodcast; @Bind(R.id.ll_podcast_header) LinearLayout rlPodcastHeader; @Bind(R.id.fl_playPausePodcastWrapper) FrameLayout playPausePodcastWrapper; @Bind(R.id.podcastTitleGrid) ListView /*CardGridView*/ podcastTitleGrid; @Bind(R.id.viewSwitcherProgress) ViewSwitcher /*CardGridView*/ viewSwitcherProgress; boolean hasTitleInCache = false; @OnClick(R.id.fl_playPausePodcastWrapper) void playPause() { if(!hasTitleInCache) Toast.makeText(getActivity(), "Please select a title first", Toast.LENGTH_SHORT).show(); else eventBus.post(new TogglePlayerStateEvent()); } @OnClick(R.id.btn_playPausePodcastSlider) void playPauseSlider() { playPause(); } @OnClick(R.id.btn_nextPodcastSlider) void nextChapter() { eventBus.post(new WindPodcast() {{ long position = podcast.getCurrent() + 30000; toPositionInPercent = ((double) position / (double) podcast.getMax()) * 100d; }}); //Toast.makeText(getActivity(), "This feature is not supported yet :(", Toast.LENGTH_SHORT).show(); } @OnClick(R.id.btn_previousPodcastSlider) void previousChapter() { eventBus.post(new WindPodcast() {{ long position = podcast.getCurrent() - 10000; toPositionInPercent = ((double) position / (double) podcast.getMax()) * 100d; }}); } PodcastSlidingUpPanelLayout sliding_layout; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // create ContextThemeWrapper from the original Activity Context with the custom theme Context context = new ContextThemeWrapper(getActivity(), R.style.Theme_AppCompat_Light_DarkActionBar); // clone the inflater using the ContextThemeWrapper LayoutInflater localInflater = inflater.cloneInContext(context); // inflate using the cloned inflater, not the passed in default View view = localInflater.inflate(R.layout.fragment_podcast, container, false); //View view = inflater.inflate(R.layout.fragment_podcast, container, false); ButterKnife.bind(this, view); if(getActivity() instanceof PodcastFragmentActivity) { sliding_layout = ((PodcastFragmentActivity) getActivity()).getSlidingLayout(); } if(sliding_layout != null) { sliding_layout.setSlideableView(rlPodcast); sliding_layout.setDragView(rlPodcastHeader); //sliding_layout.setEnableDragViewTouchEvents(true); sliding_layout.setPanelSlideListener(onPanelSlideListener); } PodcastFeedArrayAdapter mArrayAdapter = new PodcastFeedArrayAdapter(getActivity(), new PodcastFeedItem[0]); if(mArrayAdapter.getCount() > 0) { view.findViewById(R.id.tv_no_podcasts_available).setVisibility(View.GONE); } podcastTitleGrid.setVisibility(View.GONE); podcastFeedList.setVisibility(View.VISIBLE); sb_progress.setOnSeekBarChangeListener(onSeekBarChangeListener); return view; } public void onButtonPressed(Uri uri) { if (mListener != null) { mListener.onFragmentInteraction(uri); } } @Override public void onDetach() { super.onDetach(); mListener = null; } /** * This interface must be implemented by activities that contain this * fragment to allow an interaction in this fragment to be communicated * to the activity and potentially other fragments contained in that * activity. * <p> * See the Android Training lesson <a href= * "http://developer.android.com/training/basics/fragments/communicating.html" * >Communicating with Other Fragments</a> for more information. */ public interface OnFragmentInteractionListener { void onFragmentInteraction(Uri uri); } private SlidingUpPanelLayout.PanelSlideListener onPanelSlideListener = new SlidingUpPanelLayout.PanelSlideListener() { @Override public void onPanelSlide(View view, float v) { } @Override public void onPanelCollapsed(View view) { if(sliding_layout != null) sliding_layout.setDragView(rlPodcastHeader); viewSwitcherProgress.setDisplayedChild(0); if(getActivity() instanceof PodcastFragmentActivity) ((PodcastFragmentActivity)getActivity()).togglePodcastVideoViewAnimation(); } @Override public void onPanelExpanded(View view) { if(sliding_layout != null) sliding_layout.setDragView(viewSwitcherProgress); viewSwitcherProgress.setDisplayedChild(1); if(getActivity() instanceof PodcastFragmentActivity) ((PodcastFragmentActivity)getActivity()).togglePodcastVideoViewAnimation(); } @Override public void onPanelAnchored(View view) { } @Override public void onPanelHidden(View view) { } }; boolean blockSeekbarUpdate = false; private SeekBar.OnSeekBarChangeListener onSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int i, boolean b) { //Log.v(TAG, "onProgressChanged"); } @Override public void onStartTrackingTouch(SeekBar seekBar) { blockSeekbarUpdate = true; Log.v(TAG, "onStartTrackingTouch"); } @Override public void onStopTrackingTouch(final SeekBar seekBar) { if(hasTitleInCache) { eventBus.post(new WindPodcast() {{ toPositionInPercent = seekBar.getProgress(); }}); blockSeekbarUpdate = false; } Log.v(TAG, "onStopTrackingTouch"); } }; }