package io.jari.dumpert.activities; import android.app.Activity; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.media.MediaPlayer; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.graphics.Palette; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.ProgressBar; import android.widget.VideoView; import com.nispok.snackbar.Snackbar; import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; import io.jari.dumpert.AudioHandler; import io.jari.dumpert.FullscreenMediaController; import io.jari.dumpert.R; import io.jari.dumpert.Utils; import io.jari.dumpert.adapters.CommentsAdapter; import io.jari.dumpert.animators.SlideInOutBottomItemAnimator; import io.jari.dumpert.api.API; import io.jari.dumpert.api.Comment; import io.jari.dumpert.api.Item; import io.jari.dumpert.api.ItemInfo; import java.io.IOException; import java.security.InvalidParameterException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * JARI.IO * Date: 12-12-14 * Time: 14:50 */ public class ViewItemActivity extends BaseActivity { Item item; ItemInfo itemInfo; RecyclerView comments; CommentsAdapter commentsAdapter; SwipeRefreshLayout swipeRefreshLayout; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.itemview); item = (Item) getIntent().getSerializableExtra("item"); comments = (RecyclerView) findViewById(R.id.comments); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView comments.setHasFixedSize(true); comments.setItemAnimator(new SlideInOutBottomItemAnimator(comments)); // use a linear layout manager final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); comments.setLayoutManager(linearLayoutManager); this.loadComments(false); this.initHeader(); ViewCompat.setTransitionName(findViewById(R.id.item_frame), "item"); getSupportActionBar().setTitle(item.title); getSupportActionBar().setDisplayHomeAsUpEnabled(true); this.tip(); //set up ze refresh swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swiperefresh); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { swipeRefreshLayout.setRefreshing(true); commentsAdapter.removeAll(); loadComments(true); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.itemview, menu); return true; } @Override public void onBackPressed() { if(item.video) { final VideoView videoView = (VideoView) findViewById(R.id.item_video); videoView.suspend(); videoView.setVisibility(View.GONE); //paranoia findViewById(R.id.item_video_frame).setVisibility(View.GONE); findViewById(R.id.item_frame).setVisibility(View.VISIBLE); findViewById(R.id.item_loading).setVisibility(View.GONE); } else if(item.audio) { findViewById(R.id.item_frame).setVisibility(View.VISIBLE); findViewById(R.id.item_video_frame).setAlpha(0f); if(audioHandler != null && audioHandler.controller != null) audioHandler.controller.hide(); } super.onBackPressed(); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == android.R.id.home) { this.onBackPressed(); return true; } else if(id == R.id.share) { Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_TEXT, this.item.title + " - " + this.item.url + " - gedeeld via Dumpert Reader http://is.gd/jXgC7D"); intent.setType("text/plain"); startActivity(intent); return true; } return super.onOptionsItemSelected(item); } @Override protected void onPause() { if(!preferences.getBoolean("autoplay_vids", true) || item == null || (!item.video && !item.audio)) { super.onPause(); return; } if(item.video) { //videoview starts tripping once activity gets paused, so stop the thing, hide it, show progressbar final VideoView videoView = (VideoView) findViewById(R.id.item_video); final View videoViewFrame = findViewById(R.id.item_video_frame); findViewById(R.id.item_loading).setVisibility(View.VISIBLE); findViewById(R.id.item_type).setVisibility(View.GONE); findViewById(R.id.item_frame).setVisibility(View.VISIBLE); videoViewFrame.setAlpha(0f); videoView.stopPlayback(); } else { if(audioHandler != null) audioHandler.pause(); } super.onPause(); } @Override protected void onResume() { if(preferences.getBoolean("autoplay_vids", true) && itemInfo != null && (item != null) && (item.video || item.audio)) { if(item.video) { //when we return to the activity, restart the video startMedia(itemInfo, item); } else { if(audioHandler != null) audioHandler.start(); } } super.onResume(); } AudioHandler audioHandler; public void startMedia(final ItemInfo itemInfo, final Item item) { final View cardFrame = findViewById(R.id.item_frame); final View videoViewFrame = findViewById(R.id.item_video_frame); final VideoView videoView = (VideoView) findViewById(R.id.item_video); if(item.video) { videoView.setVideoURI(Uri.parse(itemInfo.media)); final FullscreenMediaController mediaController = new FullscreenMediaController(this); mediaController.setListener(new FullscreenMediaController.OnMediaControllerInteractionListener() { @Override public void onRequestFullScreen() { VideoActivity.launch(ViewItemActivity.this, itemInfo.media); } }); mediaController.setAnchorView(videoViewFrame); videoView.setMediaController(mediaController); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { Log.d("dumpert.viewitem", "onPrepared"); cardFrame.setVisibility(View.GONE); videoViewFrame.setAlpha(1f); // ViewCompat.setTransitionName(videoViewFrame, "item"); } }); videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { findViewById(R.id.item_loading).setVisibility(View.GONE); findViewById(R.id.item_type).setVisibility(View.VISIBLE); videoViewFrame.setAlpha(0f); Snackbar.with(ViewItemActivity.this) .text(R.string.video_failed) .textColor(Color.parseColor("#FFCDD2")) .show(ViewItemActivity.this); return true; } }); videoView.start(); } if(item.audio) { //audiohandler is sync, so don't call from main thread new Thread(new Runnable() { @Override public void run() { try { final FrameLayout master = (FrameLayout)findViewById(R.id.item_master_frame); audioHandler = new AudioHandler() { @Override public void onPrepared(MediaPlayer mediaplayer) { super.onPrepared(mediaplayer); //hide progressbar etc cardFrame.setVisibility(View.GONE); findViewById(R.id.item_loading).setVisibility(View.GONE); videoViewFrame.setAlpha(1f); } }; audioHandler.playAudio(itemInfo.media, ViewItemActivity.this, master); } catch(Exception e) { e.printStackTrace(); Snackbar.with(ViewItemActivity.this) .text(R.string.audio_failed) .textColor(Color.parseColor("#FFCDD2")) .show(ViewItemActivity.this); } } }).start(); } } public void initHeader() { final ImageView itemImage = (ImageView)findViewById(R.id.item_image); item = (Item)getIntent().getSerializableExtra("item"); Picasso.with(this).load(item.imageUrls == null ? null : item.imageUrls[0]) .into(itemImage, new Callback.EmptyCallback() { @Override public void onSuccess() { if (preferences.getBoolean("dynamiccolors", false)) { Bitmap bitmap = ((BitmapDrawable) itemImage.getDrawable()).getBitmap(); Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() { public void onGenerated(Palette palette) { Palette.Swatch swatch = palette.getVibrantSwatch(); Palette.Swatch swatchDark = palette.getDarkVibrantSwatch(); if (swatch != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) getWindow().setStatusBarColor(swatchDark.getRgb()); getSupportActionBar() .setBackgroundDrawable(new ColorDrawable(swatch.getRgb())); } } }); } } }); final ImageView itemType = (ImageView)findViewById(R.id.item_type); if(item.photo) itemType.setImageResource(R.drawable.ic_photo); else if(item.video) itemType.setImageResource(R.drawable.ic_play_circle_fill); else if(item.audio) itemType.setImageResource(R.drawable.ic_audiotrack); int gray = getResources().getColor(R.color.gray_bg); if(item.audio) { FrameLayout itemFrame = (FrameLayout)findViewById(R.id.item_frame); FrameLayout master = (FrameLayout)findViewById(R.id.item_master_frame); ViewGroup.LayoutParams layoutParams = master.getLayoutParams(); ViewGroup.LayoutParams layoutParams2 = itemFrame.getLayoutParams(); layoutParams.height = layoutParams2.height = Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics())); master.setLayoutParams(layoutParams); itemFrame.setLayoutParams(layoutParams2); itemImage.setBackgroundColor(obtainStyledAttributes(new int[]{R.attr.colorPrimaryDark}).getColor(0, gray)); } else { itemImage.setBackgroundColor(gray); } final ProgressBar progressBar = (ProgressBar)findViewById(R.id.item_loading); if(item.video || item.audio) { progressBar.setVisibility(View.VISIBLE); itemType.setVisibility(View.GONE); new Thread(new Runnable() { @Override public void run() { boolean error = false; try { if(!Utils.isOffline(ViewItemActivity.this)) itemInfo = API.getItemInfo(item, ViewItemActivity.this); } catch (Exception e) { error = true; runOnUiThread(new Runnable() { @Override public void run() { Snackbar.with(ViewItemActivity.this) .text(R.string.video_failed) .textColor(Color.parseColor("#FFCDD2")) .show(ViewItemActivity.this); } }); } final boolean err = error; runOnUiThread(new Runnable() { @Override public void run() { if (!err && !Utils.isOffline(ViewItemActivity.this) && preferences.getBoolean("autoplay_vids", true)) { startMedia(itemInfo, item); } else { progressBar.setVisibility(View.GONE); itemType.setVisibility(View.VISIBLE); } } }); } }).start(); } item = (Item)getIntent().getSerializableExtra("item"); ViewCompat.setTransitionName(itemImage, "item"); itemImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(item.photo) ImageActivity.launch(ViewItemActivity.this, itemImage, item.imageUrls); else if(item.video && itemInfo != null && progressBar.getVisibility() != View.VISIBLE) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(itemInfo.media))); } } }); } public void loadComments(final boolean refresh) { if(!refresh) { commentsAdapter = new CommentsAdapter(new Comment[0], this); comments.setAdapter(commentsAdapter); } //get id from url Pattern pattern = Pattern.compile("/mediabase/([0-9]*)/([a-z0-9]*)/"); Matcher matcher = pattern.matcher(item.url); if (!matcher.find()) throw new InvalidParameterException("ViewItem got a invalid url passed to it :("); final String id = matcher.group(1) + "_" + matcher.group(2); new Thread(new Runnable() { @Override public void run() { try { final Comment[] commentsData = API.getComments(id, ViewItemActivity.this); runOnUiThread(new Runnable() { @Override public void run() { commentsAdapter.addItems(commentsData); if(refresh) swipeRefreshLayout.setRefreshing(false); else { comments.setVisibility(View.VISIBLE); findViewById(R.id.comments_loader).setVisibility(View.GONE); } } }); } catch (IOException e) { e.printStackTrace(); runOnUiThread(new Runnable() { @Override public void run() { Snackbar.with(ViewItemActivity.this) .text(R.string.comments_failed) .textColor(Color.parseColor("#FFCDD2")) .show(ViewItemActivity.this); } }); } } }).start(); } public void tip() { if (!item.photo) return; SharedPreferences sharedPreferences = getSharedPreferences("dumpert", 0); if (!sharedPreferences.getBoolean("seenItemTip", false)) { sharedPreferences.edit().putBoolean("seenItemTip", true).apply(); Snackbar.with(getApplicationContext()) .text(getResources().getText(R.string.tip_touch_to_enlarge)) .actionLabel("Sluit") .actionColor(Color.parseColor("#66BB6A")) .duration(4000) .show(this); } } public static void launch(Activity activity, View transitionView, Item item) { ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, transitionView, "item"); Intent intent = new Intent(activity, ViewItemActivity.class); intent.putExtra("item", item); ActivityCompat.startActivity(activity, intent, options.toBundle()); // Intent intent = new Intent(activity, ViewItem.class); // intent.putExtra("item", item); // activity.startActivity(intent); } }