diff --git a/WordPress/src/main/java/org/wordpress/android/networking/ConnectionChangeReceiver.java b/WordPress/src/main/java/org/wordpress/android/networking/ConnectionChangeReceiver.java index e2b6a9faf46a..ea341364e28c 100644 --- a/WordPress/src/main/java/org/wordpress/android/networking/ConnectionChangeReceiver.java +++ b/WordPress/src/main/java/org/wordpress/android/networking/ConnectionChangeReceiver.java @@ -56,4 +56,8 @@ public static ConnectionChangeReceiver getInstance(){ } return sInstance; } + + public static EventBus getEventBus() { + return EventBus.getDefault(); + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SiteCreationActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SiteCreationActivity.java index c0ab30d1d1cb..b9d474cbf433 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SiteCreationActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SiteCreationActivity.java @@ -115,7 +115,8 @@ private void launchHelpshift(HelpshiftHelper.Tag origin) { private enum SiteCreationBackStackMode { NORMAL, MODAL, - FINISH_OK + FINISH_OK, + FINISH_DISMISS } private SiteCreationBackStackMode getSiteCreationBackStackMode() { @@ -123,14 +124,14 @@ private SiteCreationBackStackMode getSiteCreationBackStackMode() { (SiteCreationCreatingFragment) getSupportFragmentManager() .findFragmentByTag(SiteCreationCreatingFragment.TAG); - if (siteCreationCreatingFragment == null) { + if (siteCreationCreatingFragment == null || siteCreationCreatingFragment.canGoBack()) { return SiteCreationBackStackMode.NORMAL; } else if (siteCreationCreatingFragment.isInModalMode()) { return SiteCreationBackStackMode.MODAL; } else if (siteCreationCreatingFragment.isCreationSucceeded()) { return SiteCreationBackStackMode.FINISH_OK; } else { - return SiteCreationBackStackMode.NORMAL; + return SiteCreationBackStackMode.FINISH_DISMISS; } } @@ -147,6 +148,9 @@ public void onBackPressed() { setResult(RESULT_OK); finish(); break; + case FINISH_DISMISS: + finish(); + break; } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationBaseFormFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationBaseFormFragment.java index 299dcbb56972..a1451e02b75d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationBaseFormFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationBaseFormFragment.java @@ -78,10 +78,13 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { } } - protected void showHomeButton(boolean visible) { + protected void showHomeButton(boolean visible, boolean isCloseButton) { ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar(); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(visible); + if (isCloseButton) { + actionBar.setHomeAsUpIndicator(R.drawable.ic_close_white_24dp); + } } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationCreatingFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationCreatingFragment.java index f7ac1cfd19dd..017891532f1a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationCreatingFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationCreatingFragment.java @@ -16,9 +16,11 @@ import org.wordpress.android.R; import org.wordpress.android.analytics.AnalyticsTracker; import org.wordpress.android.ui.accounts.signup.SiteCreationService.SiteCreationState; +import org.wordpress.android.ui.accounts.signup.SiteCreationService.SiteCreationStep; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; import org.wordpress.android.util.AutoForeground.ServiceEventConnection; +import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.util.URLFilteredWebViewClient; import java.util.HashMap; @@ -31,8 +33,6 @@ public class SiteCreationCreatingFragment extends SiteCreationBaseFormFragment SiteCreationStep.NEW_SITE.ordinal(); + } } private static class SiteCreationNotification { @@ -183,6 +188,10 @@ public static void clearSiteCreationServiceState() { clearServiceState(SiteCreationState.class); } + public static SiteCreationState getState() { + return getState(SiteCreationState.class); + } + public SiteCreationService() { super(new SiteCreationState(SiteCreationStep.IDLE, null)); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeAdapter.java index 2d05320ab544..b06b3338ca77 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeAdapter.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeAdapter.java @@ -1,6 +1,7 @@ package org.wordpress.android.ui.accounts.signup; import android.content.Context; +import android.support.annotation.StringRes; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -21,15 +22,18 @@ public class SiteCreationThemeAdapter extends RecyclerView.Adapter mThemes; + private @StringRes int mErrorMessage; private SiteCreationListener mSiteCreationListener; public static class HeaderViewHolder extends RecyclerView.ViewHolder { + public final View progressContainer; public final View progress; public final TextView label; HeaderViewHolder(View itemView) { super(itemView); - this.progress = itemView.findViewById(R.id.progress_container); + this.progressContainer = itemView.findViewById(R.id.progress_container); + this.progress = itemView.findViewById(R.id.progress_bar); this.label = (TextView) itemView.findViewById(R.id.progress_label); } } @@ -52,9 +56,10 @@ public SiteCreationThemeAdapter(Context context, SiteCreationListener siteCreati mSiteCreationListener = siteCreationListener; } - public void setData(boolean isLoading, List themes) { + public void setData(boolean isLoading, List themes, @StringRes int errorMessage) { mIsLoading = isLoading; mThemes = themes; + mErrorMessage = errorMessage; notifyDataSetChanged(); } @@ -77,10 +82,13 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (viewType == VIEW_TYPE_HEADER) { final HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder; + headerViewHolder.progressContainer.setVisibility(mIsLoading || mThemes == null ? View.VISIBLE : View.GONE); headerViewHolder.progress.setVisibility(mIsLoading ? View.VISIBLE : View.GONE); if (!mIsLoading && mThemes == null) { // this is an error situation so, show an error - headerViewHolder.label.setText(R.string.error_generic); + headerViewHolder.label.setText(mErrorMessage); + } else { + headerViewHolder.label.setText(null); } } else { final ThemeModel theme = getItem(position); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeFragment.java index 56dc2fd9ae61..f7da65a36d0a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeFragment.java @@ -105,13 +105,16 @@ public void onThemeLoadingUpdated(OnThemeLoadingUpdated event) { switch (event.getPhase()) { case UPDATING: - mSiteCreationThemeAdapter.setData(true, null); + mSiteCreationThemeAdapter.setData(true, null, 0); break; case ERROR: - mSiteCreationThemeAdapter.setData(false, null); + mSiteCreationThemeAdapter.setData(false, null, R.string.error_generic); + break; + case ERROR_NO_CONNECTIVITY: + mSiteCreationThemeAdapter.setData(false, null, R.string.error_generic_network); break; case FINISHED: - mSiteCreationThemeAdapter.setData(false, getThemes()); + mSiteCreationThemeAdapter.setData(false, getThemes(), 0); break; } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeLoaderFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeLoaderFragment.java index e096418ded6c..6341531d7670 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeLoaderFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/signup/SiteCreationThemeLoaderFragment.java @@ -1,6 +1,7 @@ package org.wordpress.android.ui.accounts.signup; import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import org.greenrobot.eventbus.EventBus; @@ -10,7 +11,10 @@ import org.wordpress.android.fluxc.Dispatcher; import org.wordpress.android.fluxc.generated.ThemeActionBuilder; import org.wordpress.android.fluxc.store.ThemeStore; +import org.wordpress.android.networking.ConnectionChangeReceiver; +import org.wordpress.android.networking.ConnectionChangeReceiver.ConnectionChangeEvent; import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.NetworkUtils; import javax.inject.Inject; @@ -20,7 +24,8 @@ public class SiteCreationThemeLoaderFragment extends Fragment { public enum ThemesUpdateState { UPDATING, FINISHED, - ERROR + ERROR, + ERROR_NO_CONNECTIVITY } static class OnThemeLoadingUpdated { @@ -40,36 +45,68 @@ ThemesUpdateState getPhase() { // need to inject it even though we're not using it directly, otherwise we can't listen for its event responses @Inject ThemeStore mThemeStore; + @Nullable + private OnThemeLoadingUpdated getState() { + return EventBus.getDefault().getStickyEvent(OnThemeLoadingUpdated.class); + } + private void postUpdate(ThemesUpdateState state) { EventBus.getDefault().postSticky(new OnThemeLoadingUpdated(state)); } + private void update() { + postUpdate(ThemesUpdateState.UPDATING); + mDispatcher.dispatch(ThemeActionBuilder.newFetchWpComThemesAction()); + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((WordPress) getActivity().getApplication()).component().inject(this); - postUpdate(ThemesUpdateState.UPDATING); - + ConnectionChangeReceiver.getEventBus().register(this); mDispatcher.register(this); - mDispatcher.dispatch(ThemeActionBuilder.newFetchWpComThemesAction()); + + update(); } @Override public void onDetach() { super.onDetach(); mDispatcher.unregister(this); + ConnectionChangeReceiver.getEventBus().unregister(this); + } + + @SuppressWarnings("unused") + public void onEventMainThread(ConnectionChangeEvent event) { + OnThemeLoadingUpdated onThemeLoadingUpdated = getState(); + if (isAdded() + && event.isConnected() + && onThemeLoadingUpdated != null + && onThemeLoadingUpdated.getPhase() == ThemesUpdateState.ERROR_NO_CONNECTIVITY) { + update(); + } } @SuppressWarnings("unused") @Subscribe(threadMode = ThreadMode.MAIN) public void onThemesChanged(ThemeStore.OnWpComThemesChanged event) { - mDispatcher.unregister(this); - if (event.isError()) { - AppLog.e(AppLog.T.THEMES, "Error fetching themes: " + event.error.message); - postUpdate(ThemesUpdateState.ERROR); + if (NetworkUtils.isNetworkAvailable(getContext())) { + mDispatcher.unregister(this); + ConnectionChangeReceiver.getEventBus().unregister(this); + + AppLog.e(AppLog.T.THEMES, "Error fetching themes: " + event.error.message); + postUpdate(ThemesUpdateState.ERROR); + } else { + AppLog.e(AppLog.T.THEMES, "Error fetching themes: " + event.error.message + + ". Seems connectivity is off though so, will try again when back online"); + postUpdate(ThemesUpdateState.ERROR_NO_CONNECTIVITY); + } } else { + mDispatcher.unregister(this); + ConnectionChangeReceiver.getEventBus().unregister(this); + AppLog.d(AppLog.T.THEMES, "WordPress.com Theme fetch successful!"); postUpdate(ThemesUpdateState.FINISHED); } diff --git a/WordPress/src/main/res/layout/site_creation_theme_header.xml b/WordPress/src/main/res/layout/site_creation_theme_header.xml index ac2ee28b43f8..cf892e9db685 100644 --- a/WordPress/src/main/res/layout/site_creation_theme_header.xml +++ b/WordPress/src/main/res/layout/site_creation_theme_header.xml @@ -46,6 +46,7 @@ tools:visibility="visible"> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 596233861e0c..d4e047e501e6 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -2135,7 +2135,7 @@ Tell us more about what you\'re creating. What\'s the title and tagline? Step 4 of 4 Pick an available \"yourname.wordpress.com\" address to let people find you on the web. - Type to get more suggestions + Type a keyword for more ideas Create site Site title Site tagline (optional) diff --git a/libs/login/WordPressLoginFlow/build.gradle b/libs/login/WordPressLoginFlow/build.gradle index ef27b0efecd6..8495eb4fffba 100644 --- a/libs/login/WordPressLoginFlow/build.gradle +++ b/libs/login/WordPressLoginFlow/build.gradle @@ -31,7 +31,7 @@ android { } dependencies { - implementation ('org.wordpress:utils:1.20.0-beta5') { + implementation ('org.wordpress:utils:1.20.0-beta6') { exclude group: "com.mcxiaoke.volley" } diff --git a/libs/utils/WordPressUtils/build.gradle b/libs/utils/WordPressUtils/build.gradle index 24420cab96b4..73e70e36b97c 100644 --- a/libs/utils/WordPressUtils/build.gradle +++ b/libs/utils/WordPressUtils/build.gradle @@ -33,7 +33,7 @@ android { buildToolsVersion '26.0.2' defaultConfig { - versionName "1.20.0-beta5" + versionName "1.20.0-beta6" minSdkVersion 15 targetSdkVersion 25 } diff --git a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AutoForeground.java b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AutoForeground.java index 6c98fd80a9a2..14d462b6ee59 100644 --- a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AutoForeground.java +++ b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/AutoForeground.java @@ -89,8 +89,14 @@ public boolean isForeground() { return mIsForeground; } - protected StateClass getState() { - return EventBus.getDefault().getStickyEvent(mStateClass); + @Nullable + private StateClass getState() { + return getState(mStateClass); + } + + @Nullable + protected static StateClass getState(Class stateClass) { + return EventBus.getDefault().getStickyEvent(stateClass); } @Nullable