mirror of
https://github.com/nextcloud/talk-android
synced 2025-06-19 19:49:33 +01:00
Login UX & Pass update on failure
Signed-off-by: Mario Danic <mario@lovelyhq.com>
This commit is contained in:
parent
d6086576e6
commit
6a4d0fa73f
@ -96,6 +96,10 @@ public class AccountVerificationController extends BaseController {
|
|||||||
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getActionBar() != null) {
|
||||||
|
getActionBar().hide();
|
||||||
|
}
|
||||||
|
|
||||||
dispose(null);
|
dispose(null);
|
||||||
|
|
||||||
String credentials = ApiHelper.getCredentials(username, token);
|
String credentials = ApiHelper.getCredentials(username, token);
|
||||||
|
@ -110,6 +110,10 @@ public class BottomNavigationController extends BaseController {
|
|||||||
protected void onViewBound(@NonNull View view) {
|
protected void onViewBound(@NonNull View view) {
|
||||||
super.onViewBound(view);
|
super.onViewBound(view);
|
||||||
|
|
||||||
|
if (getActionBar() != null) {
|
||||||
|
getActionBar().show();
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup the BottomNavigationView with the constructor supplied Menu resource */
|
/* Setup the BottomNavigationView with the constructor supplied Menu resource */
|
||||||
bottomNavigationView.inflateMenu(getMenuResource());
|
bottomNavigationView.inflateMenu(getMenuResource());
|
||||||
|
|
||||||
|
@ -70,6 +70,7 @@ import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
|
|||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.disposables.Disposable;
|
import io.reactivex.disposables.Disposable;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
import retrofit2.HttpException;
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication.class)
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
public class CallsListController extends BaseController implements SearchView.OnQueryTextListener {
|
public class CallsListController extends BaseController implements SearchView.OnQueryTextListener {
|
||||||
@ -230,35 +231,52 @@ public class CallsListController extends BaseController implements SearchView.On
|
|||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe(roomsOverall -> {
|
.subscribe(roomsOverall -> {
|
||||||
|
|
||||||
if (roomsOverall != null) {
|
if (roomsOverall != null) {
|
||||||
for (int i = 0; i < roomsOverall.getOcs().getData().size(); i++) {
|
for (int i = 0; i < roomsOverall.getOcs().getData().size(); i++) {
|
||||||
roomItems.add(new RoomItem(roomsOverall.getOcs().getData().get(i), userEntity));
|
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);
|
|
||||||
}
|
}
|
||||||
, () -> {
|
|
||||||
dispose(roomsQueryDisposable);
|
adapter.updateDataSet(roomItems, true);
|
||||||
if (swipeRefreshLayout != null) {
|
if (searchItem != null) {
|
||||||
swipeRefreshLayout.setRefreshing(false);
|
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 {
|
} else {
|
||||||
cacheQueryDisposable = cacheUtils.getViewCache(userEntity.getId(), TAG)
|
cacheQueryDisposable = cacheUtils.getViewCache(userEntity.getId(), TAG)
|
||||||
.subscribe(o -> {
|
.subscribe(o -> {
|
||||||
|
@ -75,6 +75,7 @@ import eu.davidea.flexibleadapter.common.SmoothScrollLinearLayoutManager;
|
|||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.disposables.Disposable;
|
import io.reactivex.disposables.Disposable;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
import retrofit2.HttpException;
|
||||||
|
|
||||||
@AutoInjector(NextcloudTalkApplication.class)
|
@AutoInjector(NextcloudTalkApplication.class)
|
||||||
public class ContactsController extends BaseController implements SearchView.OnQueryTextListener {
|
public class ContactsController extends BaseController implements SearchView.OnQueryTextListener {
|
||||||
@ -277,6 +278,25 @@ public class ContactsController extends BaseController implements SearchView.OnQ
|
|||||||
if (searchItem != null) {
|
if (searchItem != null) {
|
||||||
searchItem.setVisible(false);
|
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);
|
dispose(contactsQueryDisposable);
|
||||||
}
|
}
|
||||||
, () -> {
|
, () -> {
|
||||||
|
@ -26,6 +26,7 @@ import android.view.LayoutInflater;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.inputmethod.EditorInfo;
|
import android.view.inputmethod.EditorInfo;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
import com.bluelinelabs.conductor.RouterTransaction;
|
import com.bluelinelabs.conductor.RouterTransaction;
|
||||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
||||||
@ -54,6 +55,8 @@ public class ServerSelectionController extends BaseController {
|
|||||||
ExtendedEditText serverEntry;
|
ExtendedEditText serverEntry;
|
||||||
@BindView(R.id.text_field_boxes)
|
@BindView(R.id.text_field_boxes)
|
||||||
TextFieldBoxes textFieldBoxes;
|
TextFieldBoxes textFieldBoxes;
|
||||||
|
@BindView(R.id.progress_bar)
|
||||||
|
ProgressBar progressBar;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
NcApi ncApi;
|
NcApi ncApi;
|
||||||
@ -74,6 +77,10 @@ public class ServerSelectionController extends BaseController {
|
|||||||
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
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));
|
textFieldBoxes.setLabelText(getResources().getString(R.string.nc_app_name) + " " + getResources().getString(R.string.nc_appended_server_url));
|
||||||
|
|
||||||
serverEntry.requestFocus();
|
serverEntry.requestFocus();
|
||||||
@ -86,6 +93,7 @@ public class ServerSelectionController extends BaseController {
|
|||||||
|
|
||||||
if (url.startsWith("http://") || url.startsWith("https://")) {
|
if (url.startsWith("http://") || url.startsWith("https://")) {
|
||||||
serverEntry.setEnabled(false);
|
serverEntry.setEnabled(false);
|
||||||
|
progressBar.setVisibility(View.VISIBLE);
|
||||||
|
|
||||||
if (url.endsWith("/")) {
|
if (url.endsWith("/")) {
|
||||||
url = url.substring(0, url.length() - 1);
|
url = url.substring(0, url.length() - 1);
|
||||||
@ -106,7 +114,7 @@ public class ServerSelectionController extends BaseController {
|
|||||||
getResources().getString(R.string.nc_server_product_name))) {
|
getResources().getString(R.string.nc_server_product_name))) {
|
||||||
|
|
||||||
getRouter().pushController(RouterTransaction.with(
|
getRouter().pushController(RouterTransaction.with(
|
||||||
new WebViewLoginController(finalServerUrl))
|
new WebViewLoginController(finalServerUrl, false))
|
||||||
.pushChangeHandler(new HorizontalChangeHandler())
|
.pushChangeHandler(new HorizontalChangeHandler())
|
||||||
.popChangeHandler(new HorizontalChangeHandler()));
|
.popChangeHandler(new HorizontalChangeHandler()));
|
||||||
} else if (!status.isInstalled()) {
|
} else if (!status.isInstalled()) {
|
||||||
@ -133,9 +141,14 @@ public class ServerSelectionController extends BaseController {
|
|||||||
if (serverEntry != null) {
|
if (serverEntry != null) {
|
||||||
serverEntry.setEnabled(true);
|
serverEntry.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
progressBar.setVisibility(View.GONE);
|
||||||
|
|
||||||
dispose();
|
dispose();
|
||||||
|
|
||||||
}, this::dispose);
|
}, () -> {
|
||||||
|
progressBar.setVisibility(View.GONE);
|
||||||
|
dispose();
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
textFieldBoxes.setError(getResources().getString(R.string.nc_server_url_prefix), true);
|
textFieldBoxes.setError(getResources().getString(R.string.nc_server_url_prefix), true);
|
||||||
serverEntry.setEnabled(true);
|
serverEntry.setEnabled(true);
|
||||||
|
@ -31,6 +31,7 @@ import android.view.ViewGroup;
|
|||||||
import android.webkit.SslErrorHandler;
|
import android.webkit.SslErrorHandler;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.webkit.WebViewClient;
|
import android.webkit.WebViewClient;
|
||||||
|
import android.widget.ProgressBar;
|
||||||
|
|
||||||
import com.bluelinelabs.conductor.RouterTransaction;
|
import com.bluelinelabs.conductor.RouterTransaction;
|
||||||
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
import com.bluelinelabs.conductor.changehandler.HorizontalChangeHandler;
|
||||||
@ -71,14 +72,19 @@ public class WebViewLoginController extends BaseController {
|
|||||||
@BindView(R.id.webview)
|
@BindView(R.id.webview)
|
||||||
WebView webView;
|
WebView webView;
|
||||||
|
|
||||||
|
@BindView(R.id.progress_bar)
|
||||||
|
ProgressBar progressBar;
|
||||||
|
|
||||||
private String assembledPrefix;
|
private String assembledPrefix;
|
||||||
|
|
||||||
private Disposable userQueryDisposable;
|
private Disposable userQueryDisposable;
|
||||||
|
|
||||||
private String baseUrl;
|
private String baseUrl;
|
||||||
|
private boolean isPasswordUpdate;
|
||||||
|
|
||||||
public WebViewLoginController(String baseUrl) {
|
public WebViewLoginController(String baseUrl, boolean isPasswordUpdate) {
|
||||||
this.baseUrl = baseUrl;
|
this.baseUrl = baseUrl;
|
||||||
|
this.isPasswordUpdate = isPasswordUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WebViewLoginController(Bundle args) {
|
public WebViewLoginController(Bundle args) {
|
||||||
@ -99,6 +105,10 @@ public class WebViewLoginController extends BaseController {
|
|||||||
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (getActionBar() != null) {
|
||||||
|
getActionBar().hide();
|
||||||
|
}
|
||||||
|
|
||||||
assembledPrefix = getResources().getString(R.string.nc_talk_login_scheme) + PROTOCOL_SUFFIX + "login/";
|
assembledPrefix = getResources().getString(R.string.nc_talk_login_scheme) + PROTOCOL_SUFFIX + "login/";
|
||||||
|
|
||||||
webView.getSettings().setAllowFileAccess(false);
|
webView.getSettings().setAllowFileAccess(false);
|
||||||
@ -116,6 +126,7 @@ public class WebViewLoginController extends BaseController {
|
|||||||
headers.put("OCS-APIRequest", "true");
|
headers.put("OCS-APIRequest", "true");
|
||||||
|
|
||||||
webView.setWebViewClient(new WebViewClient() {
|
webView.setWebViewClient(new WebViewClient() {
|
||||||
|
private boolean basePageLoaded;
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
||||||
if (url.startsWith(assembledPrefix)) {
|
if (url.startsWith(assembledPrefix)) {
|
||||||
@ -127,8 +138,13 @@ public class WebViewLoginController extends BaseController {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onPageFinished(WebView view, String url) {
|
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
|
@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
|
// We use the URL user entered because one provided by the server is NOT reliable
|
||||||
userQueryDisposable = userUtils.createOrUpdateUser(loginData.getUsername(), loginData.getToken(),
|
userQueryDisposable = userUtils.createOrUpdateUser(loginData.getUsername(), loginData.getToken(),
|
||||||
baseUrl, null).subscribe(userEntity -> {
|
baseUrl, null).subscribe(userEntity -> {
|
||||||
BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
|
if (!isPasswordUpdate) {
|
||||||
bundleBuilder.putString(BundleKeys.KEY_USERNAME, userEntity.getUsername());
|
|
||||||
bundleBuilder.putString(BundleKeys.KEY_TOKEN, userEntity.getToken());
|
BundleBuilder bundleBuilder = new BundleBuilder(new Bundle());
|
||||||
bundleBuilder.putString(BundleKeys.KEY_BASE_URL, userEntity.getBaseUrl());
|
bundleBuilder.putString(BundleKeys.KEY_USERNAME, userEntity.getUsername());
|
||||||
getRouter().pushController(RouterTransaction.with(new AccountVerificationController
|
bundleBuilder.putString(BundleKeys.KEY_TOKEN, userEntity.getToken());
|
||||||
(bundleBuilder.build())).pushChangeHandler(new HorizontalChangeHandler())
|
bundleBuilder.putString(BundleKeys.KEY_BASE_URL, userEntity.getBaseUrl());
|
||||||
.popChangeHandler(new HorizontalChangeHandler()));
|
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(),
|
}, throwable -> dispose(),
|
||||||
this::dispose);
|
this::dispose);
|
||||||
}
|
}
|
||||||
|
@ -47,4 +47,19 @@
|
|||||||
|
|
||||||
</studio.carbonylgroup.textfieldboxes.TextFieldBoxes>
|
</studio.carbonylgroup.textfieldboxes.TextFieldBoxes>
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_bar"
|
||||||
|
android:layout_width="@dimen/small_item_height"
|
||||||
|
android:layout_height="@dimen/small_item_height"
|
||||||
|
android:layout_below="@id/text_field_boxes"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginEnd="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginTop="@dimen/padding_between_elements"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:progressTint="@color/colorPrimary"
|
||||||
|
android:visibility="invisible"/>
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
@ -19,16 +19,29 @@
|
|||||||
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ProgressBar
|
||||||
|
android:id="@+id/progress_bar"
|
||||||
|
android:layout_width="@dimen/item_height"
|
||||||
|
android:layout_height="@dimen/item_height"
|
||||||
|
android:layout_centerInParent="true"
|
||||||
|
android:layout_marginEnd="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginLeft="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginRight="@dimen/activity_horizontal_margin"
|
||||||
|
android:layout_marginStart="@dimen/activity_horizontal_margin"
|
||||||
|
android:indeterminate="true"
|
||||||
|
android:progressTint="@color/colorPrimary"/>
|
||||||
|
|
||||||
<WebView
|
<WebView
|
||||||
android:id="@+id/webview"
|
android:id="@+id/webview"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent"
|
||||||
|
android:visibility="invisible">
|
||||||
|
|
||||||
</WebView>
|
</WebView>
|
||||||
|
|
||||||
</LinearLayout>
|
</RelativeLayout>
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
<dimen name="activity_vertical_margin">16dp</dimen>
|
<dimen name="activity_vertical_margin">16dp</dimen>
|
||||||
|
|
||||||
<dimen name="item_height">72dp</dimen>
|
<dimen name="item_height">72dp</dimen>
|
||||||
|
<dimen name="small_item_height">24dp</dimen>
|
||||||
|
|
||||||
<dimen name="display_target_image_size">200dp</dimen>
|
<dimen name="display_target_image_size">200dp</dimen>
|
||||||
<dimen name="display_target_image_margin">24dp</dimen>
|
<dimen name="display_target_image_margin">24dp</dimen>
|
||||||
|
Loading…
Reference in New Issue
Block a user