blob: db4ef649349bd98ba3d479a3c2f3b1993cedd633 [file] [log] [blame]
package org.wordpress.android.ui.plans;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.graphics.Point;
import android.os.Build;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewAnimationUtils;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
import org.wordpress.android.ui.plans.adapters.PlansPagerAdapter;
import org.wordpress.android.ui.plans.models.Plan;
import org.wordpress.android.ui.reader.ReaderActivityLauncher;
import org.wordpress.android.ui.reader.ReaderActivityLauncher.OpenUrlType;
import org.wordpress.android.util.AniUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.UrlUtils;
import org.wordpress.android.widgets.WPViewPager;
import java.io.Serializable;
import java.util.List;
import de.greenrobot.event.EventBus;
public class PlansActivity extends AppCompatActivity {
public static final String ARG_LOCAL_TABLE_BLOG_ID = "ARG_LOCAL_TABLE_BLOG_ID";
private static final String ARG_LOCAL_AVAILABLE_PLANS = "ARG_LOCAL_AVAILABLE_PLANS";
private int mLocalBlogID = -1;
private Plan[] mAvailablePlans;
private WPViewPager mViewPager;
private PlansPagerAdapter mPageAdapter;
private TabLayout mTabLayout;
private ViewGroup mManageBar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.plans_activity);
if (savedInstanceState != null) {
mLocalBlogID = savedInstanceState.getInt(ARG_LOCAL_TABLE_BLOG_ID);
Serializable serializable = savedInstanceState.getSerializable(ARG_LOCAL_AVAILABLE_PLANS);
if (serializable instanceof Plan[]) {
mAvailablePlans = (Plan[]) serializable;
}
} else if (getIntent() != null) {
mLocalBlogID = getIntent().getIntExtra(ARG_LOCAL_TABLE_BLOG_ID, -1);
}
if (WordPress.getBlog(mLocalBlogID) == null) {
AppLog.e(AppLog.T.STATS, "The blog with local_blog_id " + mLocalBlogID + " cannot be loaded from the DB.");
Toast.makeText(this, R.string.plans_loading_error, Toast.LENGTH_LONG).show();
finish();
return;
}
mViewPager = (WPViewPager) findViewById(R.id.viewpager);
mTabLayout = (TabLayout) findViewById(R.id.tab_layout);
mManageBar = (ViewGroup) findViewById(R.id.frame_manage);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
// Shadow removed on Activities with a tab toolbar
actionBar.setTitle(getString(R.string.plans));
actionBar.setElevation(0.0f);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
}
// Download plans if not already available
if (mAvailablePlans == null) {
if (!NetworkUtils.checkConnection(this)) {
finish();
return;
}
showProgress();
PlanUpdateService.startService(this, mLocalBlogID);
} else {
setupPlansUI();
}
// navigate to the "manage plans" page for this blog when the user clicks the manage bar
mManageBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Blog blog = WordPress.getBlog(mLocalBlogID);
if (blog == null) return;
String domain = UrlUtils.getHost(blog.getUrl());
String managePlansUrl = "https://wordpress.com/plans/" + domain;
ReaderActivityLauncher.openUrl(view.getContext(), managePlansUrl, OpenUrlType.EXTERNAL);
}
});
}
@Override
protected void onDestroy() {
PlanUpdateService.stopService(this);
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}
private void setupPlansUI() {
if (mAvailablePlans == null || mAvailablePlans.length == 0) {
// This should never be called with empty plans.
Toast.makeText(PlansActivity.this, R.string.plans_loading_error, Toast.LENGTH_LONG).show();
finish();
return;
}
hideProgress();
mViewPager.setAdapter(getPageAdapter());
int normalColor = ContextCompat.getColor(this, R.color.blue_light);
int selectedColor = ContextCompat.getColor(this, R.color.white);
mTabLayout.setTabTextColors(normalColor, selectedColor);
mTabLayout.setupWithViewPager(mViewPager);
// tabMode is set to scrollable in layout, set to fixed if there's enough space to show them all
mTabLayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mTabLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (mTabLayout.getChildCount() > 0) {
int tabLayoutWidth = 0;
LinearLayout tabFirstChild = (LinearLayout) mTabLayout.getChildAt(0);
for (int i = 0; i < mTabLayout.getTabCount(); i++) {
LinearLayout tabView = (LinearLayout) (tabFirstChild.getChildAt(i));
tabLayoutWidth += (tabView.getMeasuredWidth() + tabView.getPaddingLeft() + tabView.getPaddingRight());
}
int displayWidth = DisplayUtils.getDisplayPixelWidth(PlansActivity.this);
if (tabLayoutWidth < displayWidth) {
mTabLayout.setTabMode(TabLayout.MODE_FIXED);
mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
}
}
}
});
if (mViewPager.getVisibility() != View.VISIBLE) {
// use a circular reveal on API 21+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
revealViewPager();
} else {
mViewPager.setVisibility(View.VISIBLE);
mTabLayout.setVisibility(View.VISIBLE);
showManageBar();
}
}
}
private void showManageBar() {
if (mManageBar.getVisibility() != View.VISIBLE) {
AniUtils.animateBottomBar(mManageBar, true);
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void revealViewPager() {
mViewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mViewPager.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Point pt = DisplayUtils.getDisplayPixelSize(PlansActivity.this);
float startRadius = 0f;
float endRadius = (float) Math.hypot(pt.x, pt.y);
int centerX = pt.x / 2;
int centerY = pt.y / 2;
Animator anim = ViewAnimationUtils.createCircularReveal(mViewPager, centerX, centerY, startRadius, endRadius);
anim.setDuration(getResources().getInteger(android.R.integer.config_longAnimTime));
anim.setInterpolator(new AccelerateInterpolator());
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
showManageBar();
}
});
mViewPager.setVisibility(View.VISIBLE);
mTabLayout.setVisibility(View.VISIBLE);
anim.start();
}
});
}
private void hideProgress() {
final ProgressBar progress = (ProgressBar) findViewById(R.id.progress_loading_plans);
progress.setVisibility(View.GONE);
}
private void showProgress() {
final ProgressBar progress = (ProgressBar) findViewById(R.id.progress_loading_plans);
progress.setVisibility(View.VISIBLE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(ARG_LOCAL_TABLE_BLOG_ID, mLocalBlogID);
outState.putSerializable(ARG_LOCAL_AVAILABLE_PLANS, mAvailablePlans);
super.onSaveInstanceState(outState);
}
private PlansPagerAdapter getPageAdapter() {
if (mPageAdapter == null) {
mPageAdapter = new PlansPagerAdapter(getFragmentManager(), mAvailablePlans);
}
return mPageAdapter;
}
/*
* move the ViewPager to the plan for the current blog
*/
private void selectCurrentPlan() {
int position = -1;
for (Plan currentSitePlan : mAvailablePlans) {
if (currentSitePlan.isCurrentPlan()) {
position = getPageAdapter().getPositionOfPlan(currentSitePlan.getProductID());
break;
}
}
if (getPageAdapter().isValidPosition(position)) {
mViewPager.setCurrentItem(position);
}
}
/*
* called by the service when plan data is successfully updated
*/
@SuppressWarnings("unused")
public void onEventMainThread(PlanEvents.PlansUpdated event) {
// make sure the update is for this blog
if (event.getLocalBlogId() != this.mLocalBlogID) {
AppLog.w(AppLog.T.PLANS, "plans updated for different blog");
return;
}
List<Plan> plans = event.getPlans();
mAvailablePlans = new Plan[plans.size()];
plans.toArray(mAvailablePlans);
setupPlansUI();
selectCurrentPlan();
}
/*
* called by the service when plan data fails to update
*/
@SuppressWarnings("unused")
public void onEventMainThread(PlanEvents.PlansUpdateFailed event) {
Toast.makeText(PlansActivity.this, R.string.plans_loading_error, Toast.LENGTH_LONG).show();
finish();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
}