package party.danyang.nationalgeographic.ui; import android.Manifest; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; import android.databinding.DataBindingUtil; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.design.widget.Snackbar; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.view.Menu; import android.view.MenuItem; import android.view.View; import com.squareup.picasso.Callback; import com.squareup.picasso.MemoryPolicy; import com.squareup.picasso.NetworkPolicy; import com.tbruyelle.rxpermissions.RxPermissions; import com.umeng.analytics.MobclickAgent; import me.yokeyword.swipebackfragment.SwipeBackActivity; import party.danyang.nationalgeographic.R; import party.danyang.nationalgeographic.databinding.ActivityRandomAlbumBinding; import party.danyang.nationalgeographic.model.random.Random; import party.danyang.nationalgeographic.net.random.NGApi_random; import party.danyang.nationalgeographic.net.random.RamdomImgParser; import party.danyang.nationalgeographic.utils.DownloadMangerResolver; import party.danyang.nationalgeographic.utils.NetUtils; import party.danyang.nationalgeographic.utils.SaveImage; import party.danyang.nationalgeographic.utils.SettingsModel; import party.danyang.nationalgeographic.utils.Utils; import party.danyang.nationalgeographic.utils.singleton.PicassoHelper; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; /** * Created by dream on 16-8-22. */ public class RandomAlbumActivity extends SwipeBackActivity { public static final String TAG_RANDOM = "tag.random"; private static final String TAG = "RandomAlbumActivity"; private static final String SAVED_INSTANCE_STATE_RANDOM_ID = "savedInstanceState.random_id"; private int randomId; private ActivityRandomAlbumBinding binding; private CompositeSubscription mSubscription; private String url; private Random random; public boolean mVisible = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_random_album); mSubscription = new CompositeSubscription(); randomId = savedInstanceState != null ? savedInstanceState.getInt(SAVED_INSTANCE_STATE_RANDOM_ID, getRandomInt()) : getRandomInt(); initViews(); } @Override public void onResume() { super.onResume(); MobclickAgent.onResume(this); PicassoHelper.getInstance(this).resumeTag(TAG_RANDOM); } @Override public void onPause() { super.onPause(); MobclickAgent.onPause(this); PicassoHelper.getInstance(this).pauseTag(TAG_RANDOM); } @Override protected void onDestroy() { super.onDestroy(); if (mSubscription != null) { mSubscription.unsubscribe(); } PicassoHelper.getInstance(this).cancelTag(TAG_RANDOM); } private void initViews() { binding.toolbar.setNavigationIcon(R.drawable.ic_arrow_back_grey_300_24dp); setSupportActionBar(binding.toolbar); setTitle(null); binding.toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { supportFinishAfterTransition(); } }); binding.toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { onToolbarMenuItemClicked(item); return true; } }); binding.setFullScreen(false); binding.imgTouch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { toggle(); } }); binding.imgTouch.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { showSaveImgDialog(); return true; } }); binding.refresh.setProgressViewOffset(true, 100, 300); binding.refresh.setColorSchemeResources(R.color.md_grey_600, R.color.md_grey_800); binding.refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { getPic(getRandomInt()); } }); getPic(randomId); } private int getRandomInt() { return new java.util.Random().nextInt(10000000); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(SAVED_INSTANCE_STATE_RANDOM_ID, randomId); } private void getPic(final int randomId) { if (!NetUtils.isConnected(this)) { Utils.makeSnackBar(binding.getRoot(), R.string.offline, true); return; } if (SettingsModel.getWifiOnly(this) && !NetUtils.isWiFi(this)) { Utils.makeSnackBar(binding.getRoot(), R.string.load_not_in_wifi_while_in_wifi_only, true); return; } Utils.setRefresher(binding.refresh, true); NGApi_random.loadRandomJson(randomId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .unsubscribeOn(Schedulers.io()) .subscribe(new Subscriber<Random>() { @Override public void onCompleted() { RandomAlbumActivity.this.randomId = randomId; loadImg(randomId); unsubscribe(); } @Override public void onError(Throwable e) { if (e != null && !TextUtils.isEmpty(e.getMessage()) && e.getMessage().trim().equals(getString(R.string.notfound404))) { getPic(getRandomInt()); } else { Utils.setRefresher(binding.refresh, false); String text; if (e == null || TextUtils.isEmpty(e.getMessage())) { text = getString(R.string.error); } else { text = e.getMessage(); } Snackbar.make(binding.getRoot(), text, Snackbar.LENGTH_LONG) .setAction(R.string.retry, new View.OnClickListener() { @Override public void onClick(View view) { getPic(getRandomInt()); } }).show(); } unsubscribe(); } @Override public void onNext(Random random) { if (random == null) { onError(new Exception(getString(R.string.notfound404))); } RandomAlbumActivity.this.random = random; setTitle(random.getTitle()); } }); } private void loadImg(int randomId) { NGApi_random.loadRandomHtml(randomId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .unsubscribeOn(Schedulers.io()) .subscribe(new Subscriber<String>() { @Override public void onCompleted() { // refresher false 在图片加载完后再设false unsubscribe(); } @Override public void onError(Throwable e) { Utils.setRefresher(binding.refresh, false); String text; if (e == null || TextUtils.isEmpty(e.getMessage())) { text = getString(R.string.error); } else { text = e.getMessage(); } Snackbar.make(binding.getRoot(), text, Snackbar.LENGTH_LONG) .setAction(R.string.retry, new View.OnClickListener() { @Override public void onClick(View view) { getPic(getRandomInt()); } }).show(); unsubscribe(); } @Override public void onNext(String s) { if (TextUtils.isEmpty(s)) { onError(new Exception(getString(R.string.exception_content_null))); } url = RamdomImgParser.parserImg(s); if (TextUtils.isEmpty(url)) { onError(new Exception(getString(R.string.exception_content_null))); } if (url.startsWith("/")) { url = "http://yourshot.nationalgeographic.com" + url; } PicassoHelper.getInstance(RandomAlbumActivity.this) .load(url) .memoryPolicy(MemoryPolicy.NO_CACHE) .networkPolicy(NetworkPolicy.NO_CACHE) .into(binding.imgTouch, new Callback() { @Override public void onSuccess() { Utils.setRefresher(binding.refresh, false); binding.imgTouch.setZoom(1); } @Override public void onError() { Utils.setRefresher(binding.refresh, false); } }); } }); } private void showSaveImgDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.AlertDialogTheme); builder.setMessage(R.string.save_img); builder.setPositiveButton(R.string.save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { RxPermissions rxPermissions = new RxPermissions(RandomAlbumActivity.this); rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if (aBoolean) { saveImg(); } else { Utils.makeSnackBar(binding.getRoot(), R.string.permission_denied, true); } } }); dialogInterface.dismiss(); } }); builder.setNegativeButton(R.string.cancel, null); builder.show(); } private void saveImg() { if (DownloadMangerResolver.resolve(this)) SaveImage.saveImg(this, binding.getRoot(), String.valueOf(randomId) + ".jpg", url); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_random, menu); return true; } private void onToolbarMenuItemClicked(MenuItem menuItem) { int id = menuItem.getItemId(); if (id == R.id.action_yourshotlink) { if (random == null || TextUtils.isEmpty(random.getWeb_page())) return; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(random.getWeb_page())); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Utils.makeSnackBar(binding.getRoot(), R.string.not_legal_yourshotlink, true); } } else if (id == R.id.action_refresh) { getPic(getRandomInt()); } else if (id == R.id.action_share) { if (random == null || TextUtils.isEmpty(random.getTitle()) || TextUtils.isEmpty(url)) return; Utils.shareItem(this, url, random.getTitle(), null, binding.getRoot()); } } //hide and show private void toggle() { if (mVisible) { hide(); } else { show(); } } private static final int UI_ANIMATION_DELAY = 300; private final Handler mHideHandler = new Handler(); private final Runnable mHidePart2Runnable = new Runnable() { @SuppressLint("InlinedApi") @Override public void run() { binding.imgTouch.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); } }; private final Runnable mShowPart2Runnable = new Runnable() { @Override public void run() { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.show(); } binding.setFullScreen(false); } }; public void hide() { ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.hide(); } binding.setFullScreen(true); mVisible = false; mHideHandler.removeCallbacks(mShowPart2Runnable); mHideHandler.postDelayed(mHidePart2Runnable, UI_ANIMATION_DELAY); } public void show() { binding.imgTouch.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); mVisible = true; mHideHandler.removeCallbacks(mHidePart2Runnable); mHideHandler.postDelayed(mShowPart2Runnable, UI_ANIMATION_DELAY); } @Override public void onBackPressed() { supportFinishAfterTransition(); } }