package com.malmstein.yahnac; import android.app.ActivityOptions; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; 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.content.ContextCompat; import android.support.v4.util.Pair; import android.view.View; import com.malmstein.yahnac.bookmarks.BookmarksActivity; import com.malmstein.yahnac.comments.CommentsActivity; import com.malmstein.yahnac.comments.CommentsPresenter; import com.malmstein.yahnac.login.LoginActivity; import com.malmstein.yahnac.model.Story; import com.malmstein.yahnac.settings.SettingsActivity; import com.malmstein.yahnac.stories.NewsActivity; import com.malmstein.yahnac.story.StoryActivity; import com.malmstein.yahnac.views.transitions.TransitionHelper; import com.novoda.simplechromecustomtabs.SimpleChromeCustomTabs; import com.novoda.simplechromecustomtabs.navigation.IntentCustomizer; import com.novoda.simplechromecustomtabs.navigation.NavigationFallback; import com.novoda.simplechromecustomtabs.navigation.SimpleChromeCustomTabsIntentBuilder; import rx.Observable; import rx.Subscriber; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; public class Navigator { private final HNewsActivity activity; private CompositeSubscription mSubscriptions; public Navigator(HNewsActivity activity) { this.activity = activity; mSubscriptions = new CompositeSubscription(); } protected boolean isOnline() { return activity.isOnline(); } public void toExternalBrowser(Uri articleUri) { if (isOnline()) { Intent browserIntent = new Intent(Intent.ACTION_VIEW); browserIntent.setData(articleUri); ActivityCompat.startActivity(activity, browserIntent, null); } } public void toInnerBrowser(final Story story) { if (isOnline()) { mSubscriptions.add( prepareCustomTabsBuilder() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe( new Subscriber<IntentCustomizer>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(IntentCustomizer builder) { openCustomTabsIfPossible(story, builder); } } ) ); } } private Bitmap decodeCloseBitmap() { return BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_arrow_back); } private Observable<IntentCustomizer> prepareCustomTabsBuilder() { return Observable.create( new Observable.OnSubscribe<IntentCustomizer>() { @Override public void call(Subscriber<? super IntentCustomizer> subscriber) { IntentCustomizer intentCustomizer = new IntentCustomizer() { @Override public SimpleChromeCustomTabsIntentBuilder onCustomiseIntent(SimpleChromeCustomTabsIntentBuilder easyCustomTabsIntentBuilder) { return easyCustomTabsIntentBuilder.withToolbarColor(ContextCompat.getColor(activity, R.color.orange)) .showingTitle() .withUrlBarHiding() .withCloseButtonIcon(decodeCloseBitmap()); } }; subscriber.onNext(intentCustomizer); subscriber.onCompleted(); } } ); } private void openCustomTabsIfPossible(final Story story, IntentCustomizer intentCustomizer) { SimpleChromeCustomTabs.getInstance().withFallback( new NavigationFallback() { @Override public void onFallbackNavigateTo(Uri url) { Intent articleIntent = new Intent(activity, StoryActivity.class); articleIntent.putExtra(StoryActivity.ARG_STORY, story); ActivityCompat.startActivity(activity, articleIntent, null); } } ) .withIntentCustomizer(intentCustomizer) .navigateTo(Uri.parse(story.getUrl()), activity); } public void toComments(View v, Story story) { ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation( activity, new Pair<>(v, CommentsPresenter.VIEW_NAME_HEADER_TITLE) ); Intent commentIntent = new Intent(activity, CommentsActivity.class); commentIntent.putExtra(CommentsActivity.ARG_STORY, story); ActivityCompat.startActivity(activity, commentIntent, activityOptions.toBundle()); } public void toComments(Story story) { Intent commentIntent = new Intent(activity, CommentsActivity.class); commentIntent.putExtra(CommentsActivity.ARG_STORY, story); ActivityCompat.startActivity(activity, commentIntent, null); } public void toSettings() { Intent settingsIntent = new Intent(activity, SettingsActivity.class); ActivityCompat.startActivity(activity, settingsIntent, null); } public void toNews() { Intent newsIntent = new Intent(activity, NewsActivity.class); newsIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); ActivityCompat.startActivity(activity, newsIntent, null); activity.overridePendingTransition(0, 0); activity.finish(); } public void toBookmarks() { Intent bookmarksIntent = new Intent(activity, BookmarksActivity.class); ActivityCompat.startActivity(activity, bookmarksIntent, null); activity.overridePendingTransition(0, 0); activity.finish(); } public void toLogin(View v) { final android.util.Pair[] pairs = TransitionHelper.createSafeTransitionParticipants ( activity, false, new android.util.Pair<>(v, LoginActivity.VIEW_TOOLBAR_TITLE) ); if ((v != null) && (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP)) { ActivityOptions sceneTransitionAnimation = ActivityOptions .makeSceneTransitionAnimation(activity, pairs); final Bundle transitionBundle = sceneTransitionAnimation.toBundle(); Intent loginLollipopIntent = new Intent(activity, LoginActivity.class); ActivityCompat.startActivity(activity, loginLollipopIntent, transitionBundle); } else { Intent loginIntent = new Intent(activity, LoginActivity.class); ActivityCompat.startActivity(activity, loginIntent, null); activity.overridePendingTransition(0, 0); } } }