package party.danyang.nationalgeographic.ui; import android.Manifest; import android.app.SharedElementCallback; import android.content.Intent; import android.content.res.Configuration; import android.databinding.DataBindingUtil; import android.os.Build; import android.os.Bundle; import android.support.design.widget.Snackbar; import android.support.v4.app.ActivityCompat; import android.support.v4.app.ActivityOptionsCompat; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.text.TextUtils; import android.view.View; import android.view.ViewTreeObserver; import com.tbruyelle.rxpermissions.RxPermissions; import com.umeng.analytics.MobclickAgent; import java.util.ArrayList; import java.util.List; import java.util.Map; import io.realm.Realm; import party.danyang.nationalgeographic.R; import party.danyang.nationalgeographic.adapter.AlbumDetailAdapter; import party.danyang.nationalgeographic.adapter.base.BaseAdapter; import party.danyang.nationalgeographic.databinding.ActivityDetailBinding; import party.danyang.nationalgeographic.model.album.AlbumItem; import party.danyang.nationalgeographic.model.album.Picture; import party.danyang.nationalgeographic.net.NGApi; import party.danyang.nationalgeographic.ui.base.ToolbarActivity; 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.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; public class DetailActivity extends ToolbarActivity { public static final String TAG = DetailActivity.class.getSimpleName(); public static final String INTENT_ALBUM_ID = "party.danyang.ng.album.id"; public static final String INTENT_ALBUM_TITLE = "party.danyang.ng.album.title"; private ActivityDetailBinding binding; // private Album album; private String id; private String title; private Realm realm; private AlbumDetailAdapter adapter; private CompositeSubscription mSubscription; StaggeredGridLayoutManager layoutManager; private Bundle reenterState; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_detail); Intent intent = getIntent(); if (intent != null) { id = intent.getStringExtra(INTENT_ALBUM_ID); title = intent.getStringExtra(INTENT_ALBUM_TITLE); } mSubscription = new CompositeSubscription(); realm = Realm.getDefaultInstance(); initViews(); setExitAnimator(); } @Override public void onResume() { super.onResume(); MobclickAgent.onResume(this); PicassoHelper.getInstance(this).resumeTag(AlbumDetailAdapter.TAG_DETAIL); } @Override public void onPause() { super.onPause(); MobclickAgent.onPause(this); PicassoHelper.getInstance(this).pauseTag(AlbumDetailAdapter.TAG_DETAIL); } @Override protected void onDestroy() { super.onDestroy(); PicassoHelper.getInstance(this).cancelTag(AlbumDetailAdapter.TAG_DETAIL); if (mSubscription != null) { mSubscription.unsubscribe(); } realm.close(); } @Override public void onConfigurationChanged(Configuration newConfig) { layoutManager = new StaggeredGridLayoutManager( LayoutSpanCountUtils.getSpanCount(this, newConfig.orientation) , StaggeredGridLayoutManager.VERTICAL); binding.recyclerContent.recycler.setLayoutManager(layoutManager); super.onConfigurationChanged(newConfig); } private void initViews() { setupToolbar(binding.toolbarContent); binding.toolbarContent.toolbarLayout.setTitle(title); adapter = new AlbumDetailAdapter(new ArrayList<Picture>()); adapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { startAlbumActivity(view, position); } }); layoutManager = new StaggeredGridLayoutManager( LayoutSpanCountUtils.getSpanCount(this, getResources().getConfiguration().orientation) , StaggeredGridLayoutManager.VERTICAL); binding.recyclerContent.recycler.setAdapter(adapter); binding.recyclerContent.recycler.setLayoutManager(layoutManager); binding.recyclerContent.recycler.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { PicassoHelper.getInstance(DetailActivity.this).resumeTag(AlbumDetailAdapter.TAG_DETAIL); } else { PicassoHelper.getInstance(DetailActivity.this).pauseTag(AlbumDetailAdapter.TAG_DETAIL); } } }); load(); binding.fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { RxPermissions rxPermissions = new RxPermissions(DetailActivity.this); rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { if (aBoolean) {//拥有该权限 if (adapter.size() <= 0 || TextUtils.isEmpty(adapter.get(0).getUrl())) { Utils.makeSnackBar(binding.getRoot(), R.string.exception_content_null, true); return; } saveAllImg(); } else {//拒绝该权限 Utils.makeSnackBar(binding.getRoot(), R.string.permission_denied, true); } } }); } }); binding.recyclerContent.refresher.setEnabled(false); } private void saveAllImg() { if (!NetUtils.isConnected(this)) { Utils.makeSnackBar(binding.getRoot(), R.string.offline, true); return; } //if wifionly and not in wifi if (SettingsModel.getWifiOnly(this) && !NetUtils.isWiFi(this)) { Utils.makeSnackBar(binding.getRoot(), R.string.load_not_in_wifi_while_in_wifi_only, true); return; } if (DownloadMangerResolver.resolve(this)) for (int i = 0; i < adapter.size(); i++) { SaveImage.saveImg(this, binding.getRoot(), adapter.get(i).getAlbumid() + "_" + i + ".jpg", adapter.get(i).getUrl()); } } private void load() { getAlbumFromRealm(); } private void getAlbumFromRealm() { mSubscription.add(Observable.create(new Observable.OnSubscribe<List<Picture>>() { @Override public void call(Subscriber<? super List<Picture>> subscriber) { List<Picture> list = Picture.all(realm, id); subscriber.onNext(list); subscriber.onCompleted(); } }).subscribeOn(AndroidSchedulers.mainThread()) .unsubscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1<List<Picture>>() { @Override public void call(List<Picture> pictures) { if (pictures != null && pictures.size() > 0) { adapter.setNewData(pictures); } else { getAlbum(); } } })); } private void getAlbum() { if (!NetUtils.isConnected(this)) { Utils.makeSnackBar(binding.getRoot(), R.string.offline, true); return; } //if wifionly and not in wifi 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.recyclerContent.refresher, true); mSubscription.add(NGApi.loadAlbum(id) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .unsubscribeOn(Schedulers.io()) .subscribe(new Subscriber<AlbumItem>() { @Override public void onCompleted() { Utils.setRefresher(binding.recyclerContent.refresher, false); unsubscribe(); } @Override public void onError(Throwable e) { Utils.setRefresher(binding.recyclerContent.refresher, 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) { getAlbum(); } }).show(); unsubscribe(); } @Override public void onNext(AlbumItem albumItem) { if (albumItem == null || albumItem.getPicture() == null || albumItem.getPicture().size() == 0) { onError(new Exception(getString(R.string.exception_content_null))); } adapter.setNewData(albumItem.getPicture()); Picture.updateRealm(realm, albumItem.getPicture()); } })); } private void startAlbumActivity(View v, int i) { Intent intent = new Intent(DetailActivity.this, AlbumActivity.class); List<Picture> pictures = adapter.getList(); ArrayList<String> titles = new ArrayList<>(); ArrayList<String> contents = new ArrayList<>(); ArrayList<String> authors = new ArrayList<>(); ArrayList<String> urls = new ArrayList<>(); ArrayList<String> pageUrls = new ArrayList<>(); for (Picture p : pictures) { titles.add(p.getTitle()); contents.add(p.getContent()); authors.add(p.getAuthor()); urls.add(p.getUrl()); pageUrls.add(p.getYourshotlink()); } intent.putStringArrayListExtra(AlbumActivity.INTENT_TITLES, titles); intent.putStringArrayListExtra(AlbumActivity.INTENT_CONTENTS, contents); intent.putStringArrayListExtra(AlbumActivity.INTENT_AUTHORS, authors); intent.putStringArrayListExtra(AlbumActivity.INTENT_URLS, urls); intent.putStringArrayListExtra(AlbumActivity.INTENT_PAGE_URLS, pageUrls); intent.putExtra(AlbumActivity.INTENT_INDEX, i); ActivityOptionsCompat options = ActivityOptionsCompat .makeSceneTransitionAnimation(this, v, adapter.get(i).getUrl()); ActivityCompat.startActivity(this, intent, options.toBundle()); } private void setExitAnimator() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { setExitSharedElementCallback(new SharedElementCallback() { @Override public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) { if (reenterState != null) { int position = reenterState.getInt(AlbumActivity.INTENT_INDEX, 0); if (adapter == null || position >= adapter.size()) return; sharedElements.clear(); sharedElements.put(adapter.get(position).getUrl(), layoutManager.findViewByPosition(position)); reenterState = null; } } }); } } @Override public void onActivityReenter(int resultCode, Intent data) { super.onActivityReenter(resultCode, data); reenterState = new Bundle(data.getExtras()); int position = reenterState.getInt(AlbumActivity.INTENT_INDEX, 0); if (binding == null || position >= adapter.size()) return; supportPostponeEnterTransition(); binding.recyclerContent.recycler.scrollToPosition(position); binding.recyclerContent.recycler.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { binding.recyclerContent.recycler.getViewTreeObserver().removeOnPreDrawListener(this); binding.recyclerContent.recycler.requestLayout(); supportStartPostponedEnterTransition(); return true; } }); } @Override public void onBackPressed() { supportFinishAfterTransition(); } }