From 6a4d0fa73f27912a4b95178c1969d19f1119660e Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 26 Oct 2017 20:50:34 +0200 Subject: [PATCH] Login UX & Pass update on failure Signed-off-by: Mario Danic --- .../AccountVerificationController.java | 4 + .../BottomNavigationController.java | 4 + .../talk/controllers/CallsListController.java | 74 ++++++++++++------- .../talk/controllers/ContactsController.java | 20 +++++ .../ServerSelectionController.java | 17 ++++- .../controllers/WebViewLoginController.java | 41 +++++++--- .../layout/controller_server_selection.xml | 15 ++++ .../res/layout/controller_web_view_login.xml | 19 ++++- app/src/main/res/values/dimens.xml | 1 + 9 files changed, 153 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java index 6c698b72d..d424a0794 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/AccountVerificationController.java @@ -96,6 +96,10 @@ public class AccountVerificationController extends BaseController { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } + if (getActionBar() != null) { + getActionBar().hide(); + } + dispose(null); String credentials = ApiHelper.getCredentials(username, token); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/BottomNavigationController.java b/app/src/main/java/com/nextcloud/talk/controllers/BottomNavigationController.java index b876974f1..b755c48e8 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/BottomNavigationController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/BottomNavigationController.java @@ -110,6 +110,10 @@ public class BottomNavigationController extends BaseController { protected void onViewBound(@NonNull View view) { super.onViewBound(view); + if (getActionBar() != null) { + getActionBar().show(); + } + /* Setup the BottomNavigationView with the constructor supplied Menu resource */ bottomNavigationView.inflateMenu(getMenuResource()); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java index 7cd2f7acb..f780e0430 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/CallsListController.java @@ -70,6 +70,7 @@ import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; @AutoInjector(NextcloudTalkApplication.class) public class CallsListController extends BaseController implements SearchView.OnQueryTextListener { @@ -230,35 +231,52 @@ public class CallsListController extends BaseController implements SearchView.On .observeOn(AndroidSchedulers.mainThread()) .subscribe(roomsOverall -> { - if (roomsOverall != null) { - for (int i = 0; i < roomsOverall.getOcs().getData().size(); i++) { - roomItems.add(new RoomItem(roomsOverall.getOcs().getData().get(i), userEntity)); - } - - adapter.updateDataSet(roomItems, true); - if (searchItem != null) { - searchItem.setVisible(roomItems.size() > 0); - } - - cacheQueryDisposable = cacheUtils.createOrUpdateViewCache( - LoganSquare.serialize(roomsOverall.getOcs().getData()), - userEntity.getId(), TAG).subscribe(cacheEntity -> { - // do nothing - }, throwable -> dispose(cacheQueryDisposable), - () -> dispose(cacheQueryDisposable)); - } - }, throwable -> { - if (searchItem != null) { - searchItem.setVisible(false); - } - dispose(roomsQueryDisposable); + if (roomsOverall != null) { + for (int i = 0; i < roomsOverall.getOcs().getData().size(); i++) { + roomItems.add(new RoomItem(roomsOverall.getOcs().getData().get(i), userEntity)); } - , () -> { - dispose(roomsQueryDisposable); - if (swipeRefreshLayout != null) { - swipeRefreshLayout.setRefreshing(false); - } - }); + + adapter.updateDataSet(roomItems, true); + if (searchItem != null) { + searchItem.setVisible(roomItems.size() > 0); + } + + cacheQueryDisposable = cacheUtils.createOrUpdateViewCache( + LoganSquare.serialize(roomsOverall.getOcs().getData()), + userEntity.getId(), TAG).subscribe(cacheEntity -> { + // do nothing + }, throwable -> dispose(cacheQueryDisposable), + () -> dispose(cacheQueryDisposable)); + } + }, throwable -> { + if (searchItem != null) { + searchItem.setVisible(false); + } + + if (throwable instanceof HttpException) { + HttpException exception = (HttpException) throwable; + switch (exception.code()) { + case 401: + if (getParentController() != null && + getParentController().getRouter() != null) { + getParentController().getRouter().setRoot((RouterTransaction.with + (new WebViewLoginController(userEntity.getBaseUrl(), + true)) + .pushChangeHandler(new HorizontalChangeHandler()) + .popChangeHandler(new HorizontalChangeHandler()))); + } + break; + default: + break; + } + } + dispose(roomsQueryDisposable); + }, () -> { + dispose(roomsQueryDisposable); + if (swipeRefreshLayout != null) { + swipeRefreshLayout.setRefreshing(false); + } + }); } else { cacheQueryDisposable = cacheUtils.getViewCache(userEntity.getId(), TAG) .subscribe(o -> { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java index 043741d76..c962f2dc7 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ContactsController.java @@ -75,6 +75,7 @@ import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.schedulers.Schedulers; +import retrofit2.HttpException; @AutoInjector(NextcloudTalkApplication.class) public class ContactsController extends BaseController implements SearchView.OnQueryTextListener { @@ -277,6 +278,25 @@ public class ContactsController extends BaseController implements SearchView.OnQ if (searchItem != null) { searchItem.setVisible(false); } + + if (throwable instanceof HttpException) { + HttpException exception = (HttpException) throwable; + switch (exception.code()) { + case 401: + if (getParentController() != null && + getParentController().getRouter() != null) { + getParentController().getRouter().setRoot((RouterTransaction.with + (new WebViewLoginController(userEntity.getBaseUrl(), + true)) + .pushChangeHandler(new HorizontalChangeHandler()) + .popChangeHandler(new HorizontalChangeHandler()))); + } + break; + default: + break; + } + } + dispose(contactsQueryDisposable); } , () -> { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java index 87a3b6791..0b7174327 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ServerSelectionController.java @@ -26,6 +26,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; +import android.widget.ProgressBar; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; @@ -54,6 +55,8 @@ public class ServerSelectionController extends BaseController { ExtendedEditText serverEntry; @BindView(R.id.text_field_boxes) TextFieldBoxes textFieldBoxes; + @BindView(R.id.progress_bar) + ProgressBar progressBar; @Inject NcApi ncApi; @@ -74,6 +77,10 @@ public class ServerSelectionController extends BaseController { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } + if (getActionBar() != null) { + getActionBar().hide(); + } + textFieldBoxes.setLabelText(getResources().getString(R.string.nc_app_name) + " " + getResources().getString(R.string.nc_appended_server_url)); serverEntry.requestFocus(); @@ -86,6 +93,7 @@ public class ServerSelectionController extends BaseController { if (url.startsWith("http://") || url.startsWith("https://")) { serverEntry.setEnabled(false); + progressBar.setVisibility(View.VISIBLE); if (url.endsWith("/")) { url = url.substring(0, url.length() - 1); @@ -106,7 +114,7 @@ public class ServerSelectionController extends BaseController { getResources().getString(R.string.nc_server_product_name))) { getRouter().pushController(RouterTransaction.with( - new WebViewLoginController(finalServerUrl)) + new WebViewLoginController(finalServerUrl, false)) .pushChangeHandler(new HorizontalChangeHandler()) .popChangeHandler(new HorizontalChangeHandler())); } else if (!status.isInstalled()) { @@ -133,9 +141,14 @@ public class ServerSelectionController extends BaseController { if (serverEntry != null) { serverEntry.setEnabled(true); } + progressBar.setVisibility(View.GONE); + dispose(); - }, this::dispose); + }, () -> { + progressBar.setVisibility(View.GONE); + dispose(); + }); } else { textFieldBoxes.setError(getResources().getString(R.string.nc_server_url_prefix), true); serverEntry.setEnabled(true); diff --git a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java index 6945e2ebf..9e279d062 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/WebViewLoginController.java @@ -31,6 +31,7 @@ import android.view.ViewGroup; import android.webkit.SslErrorHandler; import android.webkit.WebView; import android.webkit.WebViewClient; +import android.widget.ProgressBar; import com.bluelinelabs.conductor.RouterTransaction; import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler; @@ -71,14 +72,19 @@ public class WebViewLoginController extends BaseController { @BindView(R.id.webview) WebView webView; + @BindView(R.id.progress_bar) + ProgressBar progressBar; + private String assembledPrefix; private Disposable userQueryDisposable; private String baseUrl; + private boolean isPasswordUpdate; - public WebViewLoginController(String baseUrl) { + public WebViewLoginController(String baseUrl, boolean isPasswordUpdate) { this.baseUrl = baseUrl; + this.isPasswordUpdate = isPasswordUpdate; } public WebViewLoginController(Bundle args) { @@ -99,6 +105,10 @@ public class WebViewLoginController extends BaseController { getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } + if (getActionBar() != null) { + getActionBar().hide(); + } + assembledPrefix = getResources().getString(R.string.nc_talk_login_scheme) + PROTOCOL_SUFFIX + "login/"; webView.getSettings().setAllowFileAccess(false); @@ -116,6 +126,7 @@ public class WebViewLoginController extends BaseController { headers.put("OCS-APIRequest", "true"); webView.setWebViewClient(new WebViewClient() { + private boolean basePageLoaded; @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith(assembledPrefix)) { @@ -127,8 +138,13 @@ public class WebViewLoginController extends BaseController { @Override public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); + if (!basePageLoaded) { + progressBar.setVisibility(View.GONE); + webView.setVisibility(View.VISIBLE); + basePageLoaded = true; + } + super.onPageFinished(view, url); } @Override @@ -162,13 +178,20 @@ public class WebViewLoginController extends BaseController { // We use the URL user entered because one provided by the server is NOT reliable userQueryDisposable = userUtils.createOrUpdateUser(loginData.getUsername(), loginData.getToken(), baseUrl, null).subscribe(userEntity -> { - BundleBuilder bundleBuilder = new BundleBuilder(new Bundle()); - bundleBuilder.putString(BundleKeys.KEY_USERNAME, userEntity.getUsername()); - bundleBuilder.putString(BundleKeys.KEY_TOKEN, userEntity.getToken()); - bundleBuilder.putString(BundleKeys.KEY_BASE_URL, userEntity.getBaseUrl()); - getRouter().pushController(RouterTransaction.with(new AccountVerificationController - (bundleBuilder.build())).pushChangeHandler(new HorizontalChangeHandler()) - .popChangeHandler(new HorizontalChangeHandler())); + if (!isPasswordUpdate) { + + BundleBuilder bundleBuilder = new BundleBuilder(new Bundle()); + bundleBuilder.putString(BundleKeys.KEY_USERNAME, userEntity.getUsername()); + bundleBuilder.putString(BundleKeys.KEY_TOKEN, userEntity.getToken()); + bundleBuilder.putString(BundleKeys.KEY_BASE_URL, userEntity.getBaseUrl()); + getRouter().pushController(RouterTransaction.with(new AccountVerificationController + (bundleBuilder.build())).pushChangeHandler(new HorizontalChangeHandler()) + .popChangeHandler(new HorizontalChangeHandler())); + } else { + getRouter().setRoot(RouterTransaction.with(new BottomNavigationController(R.menu.menu_navigation)) + .pushChangeHandler(new HorizontalChangeHandler()) + .popChangeHandler(new HorizontalChangeHandler())); + } }, throwable -> dispose(), this::dispose); } diff --git a/app/src/main/res/layout/controller_server_selection.xml b/app/src/main/res/layout/controller_server_selection.xml index 93eb2fe83..ecad8dc80 100644 --- a/app/src/main/res/layout/controller_server_selection.xml +++ b/app/src/main/res/layout/controller_server_selection.xml @@ -47,4 +47,19 @@ + + diff --git a/app/src/main/res/layout/controller_web_view_login.xml b/app/src/main/res/layout/controller_web_view_login.xml index 731b7c08c..62c64bd99 100644 --- a/app/src/main/res/layout/controller_web_view_login.xml +++ b/app/src/main/res/layout/controller_web_view_login.xml @@ -19,16 +19,29 @@ ~ along with this program. If not, see . --> - + + + android:layout_height="match_parent" + android:visibility="invisible"> - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index b9e2a169b..b1c4af522 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,6 +4,7 @@ 16dp 72dp + 24dp 200dp 24dp