From 1eafe4cbfd45117b22d1852540a9fa803a8500a0 Mon Sep 17 00:00:00 2001 From: Florens Douwes Date: Wed, 30 Apr 2014 15:55:39 +0200 Subject: [PATCH] Fixed quotes not notifying count... Fixed sharing Cancel image load when view is destroyed Pause video when it isn't visible. --- Chan/src/org/floens/chan/core/model/Pin.java | 8 +- .../floens/chan/core/watch/PinWatcher.java | 11 +- .../floens/chan/ui/activity/BaseActivity.java | 14 +- .../chan/ui/activity/BoardActivity.java | 13 +- .../chan/ui/activity/ImageViewActivity.java | 27 +++- .../chan/ui/fragment/ImageViewFragment.java | 15 ++ .../chan/ui/view/ThumbnailImageView.java | 152 ++++++++++-------- 7 files changed, 150 insertions(+), 90 deletions(-) diff --git a/Chan/src/org/floens/chan/core/model/Pin.java b/Chan/src/org/floens/chan/core/model/Pin.java index 1c652196..282399e9 100644 --- a/Chan/src/org/floens/chan/core/model/Pin.java +++ b/Chan/src/org/floens/chan/core/model/Pin.java @@ -29,16 +29,16 @@ public class Pin { public boolean watching = true; @DatabaseField - public int watchLastCount; + public int watchLastCount = -1; @DatabaseField - public int watchNewCount; + public int watchNewCount = -1; @DatabaseField - public int quoteLastCount; + public int quoteLastCount = -1; @DatabaseField - public int quoteNewCount; + public int quoteNewCount = -1; public boolean isError = false; diff --git a/Chan/src/org/floens/chan/core/watch/PinWatcher.java b/Chan/src/org/floens/chan/core/watch/PinWatcher.java index 4d927d7f..11f831e5 100644 --- a/Chan/src/org/floens/chan/core/watch/PinWatcher.java +++ b/Chan/src/org/floens/chan/core/watch/PinWatcher.java @@ -53,13 +53,14 @@ public class PinWatcher implements Loader.LoaderListener { } } + /* Currently not used public List getNewQuotes() { if (posts.size() == 0) { return posts; } else { return posts.subList(Math.max(0, posts.size() - pin.getNewQuoteCount()), posts.size()); } - } + }*/ public boolean getWereNewQuotes() { if (wereNewQuotes) { @@ -94,10 +95,10 @@ public class PinWatcher implements Loader.LoaderListener { posts.clear(); posts.addAll(result); - if (pin.watchLastCount <= 0) + if (pin.watchLastCount < 0) pin.watchLastCount = pin.watchNewCount; - if (pin.quoteLastCount <= 0) + if (pin.quoteLastCount < 0) pin.quoteLastCount = pin.quoteNewCount; pin.watchNewCount = result.size(); @@ -110,7 +111,7 @@ public class PinWatcher implements Loader.LoaderListener { } } - int lastQuoteCount = pin.quoteNewCount; + int lastCount = pin.quoteNewCount; // Find posts quoting these saved posts pin.quoteNewCount = 0; @@ -123,7 +124,7 @@ public class PinWatcher implements Loader.LoaderListener { } } - if (pin.quoteNewCount > lastQuoteCount) { + if (pin.quoteNewCount > lastCount) { wereNewQuotes = true; } diff --git a/Chan/src/org/floens/chan/ui/activity/BaseActivity.java b/Chan/src/org/floens/chan/ui/activity/BaseActivity.java index 1a1ba411..42c7aa62 100644 --- a/Chan/src/org/floens/chan/ui/activity/BaseActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/BaseActivity.java @@ -52,6 +52,7 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene protected SlidingPaneLayout threadPane; private ShareActionProvider shareActionProvider; + private Intent pendingShareActionProviderIntent; /** * Called when a post has been clicked in the pinned drawer @@ -248,6 +249,10 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.base, menu); shareActionProvider = (ShareActionProvider) menu.findItem(R.id.action_share).getActionProvider(); + if (pendingShareActionProviderIntent != null) { + shareActionProvider.setShareIntent(pendingShareActionProviderIntent); + pendingShareActionProviderIntent = null; + } return true; } @@ -285,11 +290,14 @@ public abstract class BaseActivity extends Activity implements PanelSlideListene adapter.setNdefPushMessage(message, this); } + Intent share = new Intent(android.content.Intent.ACTION_SEND); + share.putExtra(android.content.Intent.EXTRA_TEXT, url); + share.setType("text/plain"); + if (shareActionProvider != null) { - Intent share = new Intent(android.content.Intent.ACTION_SEND); - share.putExtra(android.content.Intent.EXTRA_TEXT, url); - share.setType("text/plain"); shareActionProvider.setShareIntent(share); + } else { + pendingShareActionProviderIntent = share; } } diff --git a/Chan/src/org/floens/chan/ui/activity/BoardActivity.java b/Chan/src/org/floens/chan/ui/activity/BoardActivity.java index 300f45ea..060a2fca 100644 --- a/Chan/src/org/floens/chan/ui/activity/BoardActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/BoardActivity.java @@ -239,10 +239,16 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio actionBar.setHomeButtonEnabled(true); pinDrawerListener.setDrawerIndicatorEnabled(true); + + if (boardLoadable.isBoardMode()) + setShareUrl(ChanUrls.getBoardUrlDesktop(boardLoadable.board)); } else { actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); actionBar.setTitle(threadLoadable.title); pinDrawerListener.setDrawerIndicatorEnabled(false); + + if (threadLoadable.isThreadMode()) + setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no)); } actionBar.setDisplayHomeAsUpEnabled(true); @@ -253,6 +259,9 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio actionBar.setTitle(threadLoadable.title); actionBar.setDisplayHomeAsUpEnabled(true); + + if (threadLoadable.isThreadMode()) + setShareUrl(ChanUrls.getThreadUrlDesktop(threadLoadable.board, threadLoadable.no)); } actionBar.setDisplayShowTitleEnabled(true); @@ -406,8 +415,6 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio boardFragment.bindLoadable(loadable); boardFragment.requestData(); - setShareUrl(ChanUrls.getBoardUrlDesktop(loadable.board)); - updateActionBarState(); } @@ -428,8 +435,6 @@ public class BoardActivity extends BaseActivity implements ActionBar.OnNavigatio threadFragment.bindLoadable(loadable); threadFragment.requestData(); - setShareUrl(ChanUrls.getThreadUrlDesktop(loadable.board, loadable.no)); - if (TextUtils.isEmpty(loadable.title)) { loadable.title = "/" + loadable.board + "/" + loadable.no; } diff --git a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java index 9f244602..9fb92b88 100644 --- a/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java +++ b/Chan/src/org/floens/chan/ui/activity/ImageViewActivity.java @@ -111,7 +111,14 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang public void onPageSelected(int position) { currentPosition = position; - ImageViewFragment fragment = getCurrentFragment(); + for (int i = -1; i <= 1; i++) { + ImageViewFragment fragment = getFragment(i); + if (fragment != null) { + fragment.onDeselected(); + } + } + + ImageViewFragment fragment = getFragment(currentPosition); if (fragment != null) { fragment.onSelected(adapter, position); } @@ -127,7 +134,7 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang } public void callOnSelect() { - ImageViewFragment fragment = getCurrentFragment(); + ImageViewFragment fragment = getFragment(currentPosition); if (fragment != null) { fragment.onSelected(adapter, currentPosition); } @@ -144,7 +151,7 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang return true; } else { - ImageViewFragment fragment = getCurrentFragment(); + ImageViewFragment fragment = getFragment(currentPosition); if (fragment != null) { fragment.customOnOptionsItemSelected(item); } @@ -162,7 +169,7 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang @Override public boolean onPrepareOptionsMenu(Menu menu) { - ImageViewFragment fragment = getCurrentFragment(); + ImageViewFragment fragment = getFragment(currentPosition); if (fragment != null) { fragment.onPrepareOptionsMenu(currentPosition, adapter, menu); } @@ -170,10 +177,14 @@ public class ImageViewActivity extends Activity implements ViewPager.OnPageChang return super.onPrepareOptionsMenu(menu); } - private ImageViewFragment getCurrentFragment() { - Object o = adapter.instantiateItem(viewPager, currentPosition); - if (o instanceof ImageViewFragment) { - return (ImageViewFragment) o; + private ImageViewFragment getFragment(int i) { + if (i >= 0 && i < adapter.getCount()) { + Object o = adapter.instantiateItem(viewPager, i); + if (o instanceof ImageViewFragment) { + return (ImageViewFragment) o; + } else { + return null; + } } else { return null; } diff --git a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java index 60d63ce9..46f51041 100644 --- a/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java +++ b/Chan/src/org/floens/chan/ui/fragment/ImageViewFragment.java @@ -91,6 +91,15 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal super.onSaveInstanceState(bundle); } + @Override + public void onDestroy() { + super.onDestroy(); + + if (imageView != null) { + imageView.cancelLoad(); + } + } + public void onSelected(ImageViewAdapter adapter, int position) { activity.setProgressBarIndeterminateVisibility(showProgressBar); @@ -103,6 +112,12 @@ public class ImageViewFragment extends Fragment implements ThumbnailImageViewCal activity.invalidateActionBar(); } + public void onDeselected() { + if (imageView != null && imageView.getVideoView() != null && imageView.getVideoView().isPlaying()) { + imageView.getVideoView().pause(); + } + } + public void onPrepareOptionsMenu(int position, ImageViewAdapter adapter, Menu menu) { MenuItem item = menu.findItem(R.id.action_image_play_state); item.setVisible(isVideo); diff --git a/Chan/src/org/floens/chan/ui/view/ThumbnailImageView.java b/Chan/src/org/floens/chan/ui/view/ThumbnailImageView.java index c0ad8337..4564ee26 100644 --- a/Chan/src/org/floens/chan/ui/view/ThumbnailImageView.java +++ b/Chan/src/org/floens/chan/ui/view/ThumbnailImageView.java @@ -6,6 +6,7 @@ import org.floens.chan.ChanApplication; import org.floens.chan.R; import org.floens.chan.core.net.FileRequest; import org.floens.chan.core.net.GIFRequest; +import org.floens.chan.utils.Logger; import org.floens.chan.utils.Utils; import uk.co.senab.photoview.PhotoViewAttacher; @@ -20,6 +21,7 @@ import android.widget.ImageView; import android.widget.Toast; import android.widget.VideoView; +import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.ImageLoader.ImageContainer; @@ -36,6 +38,8 @@ public class ThumbnailImageView extends LoadView implements OnViewTapListener, V private boolean thumbnailNeeded = true; private boolean tapDismiss = false; + private ImageContainer imageContainerRequest; + private Request imageRequest; private VideoView videoView; public ThumbnailImageView(Context context) { @@ -83,7 +87,7 @@ public class ThumbnailImageView extends LoadView implements OnViewTapListener, V public void setBigImage(String imageUrl) { callback.setProgress(true); - ChanApplication.getImageLoader().get(imageUrl, new ImageListener() { + imageContainerRequest = ChanApplication.getImageLoader().get(imageUrl, new ImageListener() { @Override public void onErrorResponse(VolleyError error) { onError(); @@ -113,77 +117,80 @@ public class ThumbnailImageView extends LoadView implements OnViewTapListener, V public void setGif(String gifUrl) { callback.setProgress(true); - ChanApplication.getVolleyRequestQueue().add(new GIFRequest(gifUrl, new Response.Listener() { - @Override - public void onResponse(GIFView view) { - view.setLayoutParams(Utils.MATCH_PARAMS); - - setView(view, false); - callback.setProgress(false); - thumbnailNeeded = false; - tapDismiss = true; - } - }, new Response.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - onError(); - } - }, getContext())); + imageRequest = ChanApplication.getVolleyRequestQueue().add( + new GIFRequest(gifUrl, new Response.Listener() { + @Override + public void onResponse(GIFView view) { + view.setLayoutParams(Utils.MATCH_PARAMS); + + setView(view, false); + callback.setProgress(false); + thumbnailNeeded = false; + tapDismiss = true; + } + }, new Response.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + onError(); + } + }, getContext())); } public void setVideo(String videoUrl) { callback.setProgress(true); - ChanApplication.getVolleyRequestQueue().add(new FileRequest(videoUrl, new Response.Listener() { - @Override - public void onResponse(final File file) { - if (file != null) { - videoView = new VideoView(getContext()); - videoView.setZOrderOnTop(true); - videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - videoView.setLayoutParams(Utils.MATCH_PARAMS); - LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); - par.gravity = Gravity.CENTER; - videoView.setLayoutParams(par); - - videoView.setOnPreparedListener(new OnPreparedListener() { - @Override - public void onPrepared(MediaPlayer mp) { - mp.setLooping(true); - callback.onVideoLoaded(); - } - }); - - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - videoView.start(); + imageRequest = ChanApplication.getVolleyRequestQueue().add( + new FileRequest(videoUrl, new Response.Listener() { + @Override + public void onResponse(final File file) { + if (file != null) { + videoView = new VideoView(getContext()); + videoView.setZOrderOnTop(true); + videoView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, + LayoutParams.MATCH_PARENT)); + videoView.setLayoutParams(Utils.MATCH_PARAMS); + LayoutParams par = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); + par.gravity = Gravity.CENTER; + videoView.setLayoutParams(par); + + videoView.setOnPreparedListener(new OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + mp.setLooping(true); + callback.onVideoLoaded(); + } + }); + + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + videoView.start(); + } + }).start(); + + videoView.setVideoPath(file.getAbsolutePath()); + + setView(videoView, false); + callback.setProgress(false); + thumbnailNeeded = false; + tapDismiss = true; + } else { + onError(); } - }).start(); - - videoView.setVideoPath(file.getAbsolutePath()); - - setView(videoView, false); - callback.setProgress(false); - thumbnailNeeded = false; - tapDismiss = true; - } else { - onError(); - } - } - }, new Response.ErrorListener() { - - @Override - public void onErrorResponse(VolleyError error) { - onError(); - } - })); + } + }, new Response.ErrorListener() { + + @Override + public void onErrorResponse(VolleyError error) { + onError(); + } + })); } @Override @@ -200,6 +207,19 @@ public class ThumbnailImageView extends LoadView implements OnViewTapListener, V callback.setProgress(false); } + public void cancelLoad() { + Logger.test("Cancelling load!"); + if (imageRequest != null) { + imageRequest.cancel(); + imageRequest = null; + } + + if (imageContainerRequest != null) { + imageContainerRequest.cancelRequest(); + imageContainerRequest = null; + } + } + @Override public void onViewTap(View view, float x, float y) { if (tapDismiss) {