diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fa99d605..ddf2d865 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,6 +29,7 @@ android:configChanges="keyboard|orientation|screenSize" android:label="@string/app_name" android:launchMode="singleTop" + android:screenOrientation="portrait" android:theme="@style/LoginTheme"> diff --git a/app/src/main/java/com/fastaccess/data/dao/AuthModel.java b/app/src/main/java/com/fastaccess/data/dao/AuthModel.java index d1c5aa0a..f76c0ffc 100644 --- a/app/src/main/java/com/fastaccess/data/dao/AuthModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/AuthModel.java @@ -4,6 +4,7 @@ import android.os.Parcel; import android.os.Parcelable; import com.google.gson.annotations.SerializedName; + import java.util.List; import lombok.Getter; @@ -23,8 +24,7 @@ public class AuthModel implements Parcelable { private List scopes; private String state; private String note; - @SerializedName("X-GitHub-OTP") - private String otpCode; + @SerializedName("X-GitHub-OTP") private String otpCode; @Override public int describeContents() { return 0; } diff --git a/app/src/main/java/com/fastaccess/data/service/RepoService.java b/app/src/main/java/com/fastaccess/data/service/RepoService.java index 75abf82a..eea350cf 100644 --- a/app/src/main/java/com/fastaccess/data/service/RepoService.java +++ b/app/src/main/java/com/fastaccess/data/service/RepoService.java @@ -83,9 +83,11 @@ public interface RepoService { Observable> getContributors(@Path("owner") String owner, @Path("repo") String repo, @Query("page") int page); @NonNull @GET("repos/{owner}/{repo}/commits/{sha}") + @Headers("Accept: application/vnd.github.VERSION.full+json") Observable getCommit(@Path("owner") String owner, @Path("repo") String repo, @Path("sha") String sha); @NonNull @GET("repos/{owner}/{repo}/commits/{sha}/comments") + @Headers("Accept: application/vnd.github.VERSION.full+json") Observable> getCommitComments(@NonNull @Path("owner") String owner, @NonNull @Path("repo") String repo, @NonNull @Path("sha") String ref, @Query("page") int page); diff --git a/app/src/main/java/com/fastaccess/ui/modules/login/LoginMvp.java b/app/src/main/java/com/fastaccess/ui/modules/login/LoginMvp.java index 491721b0..e712ffbe 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/login/LoginMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/login/LoginMvp.java @@ -26,8 +26,6 @@ interface LoginMvp { interface Presenter extends BaseMvp.FAPresenter { - void onGetToken(@NonNull String code); - void onTokenResponse(@Nullable AccessTokenModel response); void onUserResponse(@Nullable LoginModel response); diff --git a/app/src/main/java/com/fastaccess/ui/modules/login/LoginPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/login/LoginPresenter.java index 81a8c8f5..1b3c8b7e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/login/LoginPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/login/LoginPresenter.java @@ -12,12 +12,11 @@ import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.PrefGetter; import com.fastaccess.provider.rest.LoginProvider; import com.fastaccess.provider.rest.RestProvider; -import com.fastaccess.ui.base.mvp.BaseMvp; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; import java.util.Arrays; - import java.util.UUID; + import okhttp3.Credentials; import retrofit2.adapter.rxjava.HttpException; import rx.Observable; @@ -28,13 +27,6 @@ import rx.Observable; class LoginPresenter extends BasePresenter implements LoginMvp.Presenter { - @Override public void onGetToken(@NonNull String code) { - makeRestCall(RestProvider.getLoginRestService().getAccessToken(code, - BuildConfig.GITHUB_CLIENT_ID, BuildConfig.GITHUB_SECRET, - BuildConfig.APPLICATION_ID, BuildConfig.REDIRECT_URL), - this::onTokenResponse); - } - @Override public void onTokenResponse(@Nullable AccessTokenModel modelResponse) { if (modelResponse != null) { String token = modelResponse.getToken(); @@ -69,22 +61,14 @@ class LoginPresenter extends BasePresenter implements LoginMvp.Pr authModel.setScopes(Arrays.asList("user", "repo", "gist", "notifications")); authModel.setNote(BuildConfig.APPLICATION_ID + "-" + authToken);//make it unique to FastHub. authModel.setClientSecret(BuildConfig.GITHUB_SECRET); - UUID uuid = UUID.randomUUID(); String fingerprint = BuildConfig.APPLICATION_ID + " - " + uuid; - - Observable loginCall = - LoginProvider.getLoginRestService(authToken).login(BuildConfig.GITHUB_CLIENT_ID, - fingerprint, - authModel); - - if (twoFactorCode != null && !twoFactorCode.isEmpty()) { - loginCall = LoginProvider.getLoginRestService(authToken).login(BuildConfig.GITHUB_CLIENT_ID, - fingerprint, - authModel, - twoFactorCode); + Observable loginCall = LoginProvider.getLoginRestService(authToken) + .login(BuildConfig.GITHUB_CLIENT_ID, fingerprint, authModel); + if (!InputHelper.isEmpty(twoFactorCode)) { + loginCall = LoginProvider.getLoginRestService(authToken) + .login(BuildConfig.GITHUB_CLIENT_ID, fingerprint, authModel, twoFactorCode); } - makeRestCall(loginCall, tokenModel -> { if (InputHelper.isEmpty(tokenModel.getToken())) { makeRestCall(LoginProvider.getLoginRestService(authToken).deleteToken(tokenModel.getId()), @@ -96,18 +80,20 @@ class LoginPresenter extends BasePresenter implements LoginMvp.Pr } } - @Override - public void onError(@NonNull Throwable throwable) { + @Override public void onError(@NonNull Throwable throwable) { if (RestProvider.getErrorCode(throwable) == 401) { - String twoFaToken = ((HttpException) throwable).response().headers().get("X-GitHub-OTP"); - if (twoFaToken != null) { - sendToView(LoginMvp.View::onRequire2Fa); - } else { - sendToView(LoginMvp.View::onRequireLogin); + retrofit2.Response response = ((HttpException) throwable).response(); + if (response != null && response.headers() != null) { + String twoFaToken = response.headers().get("X-GitHub-OTP"); + if (twoFaToken != null) { + sendToView(LoginMvp.View::onRequire2Fa); + return; + } else { + sendToView(LoginMvp.View::onRequireLogin); + return; + } } - return; - } else { - super.onError(throwable); } + super.onError(throwable); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java b/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java index 3d5e1fe6..cec18b1a 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/login/LoginView.java @@ -34,6 +34,11 @@ public class LoginView extends BaseActivity imple @BindView(R.id.login) FloatingActionButton login; @BindView(R.id.progress) ProgressBar progress; + @OnClick(R.id.login) public void onClick() { + getPresenter().login(InputHelper.toString(username), + InputHelper.toString(password), InputHelper.toString(twoFactor)); + } + @Override protected int layout() { return R.layout.login_layout; } @@ -58,8 +63,8 @@ public class LoginView extends BaseActivity imple username.setError(isEmpty ? getString(R.string.required_field) : null); } - @Override - public void onRequire2Fa() { + @Override public void onRequire2Fa() { + showMessage(R.string.error, R.string.two_fectors_otp_error); twoFactor.setVisibility(View.VISIBLE); hideProgress(); } @@ -78,11 +83,6 @@ public class LoginView extends BaseActivity imple super.onCreate(savedInstanceState); } - @OnClick(R.id.login) public void onClick() { - String twoFactorCode = InputHelper.isEmpty(twoFactor) ? null : InputHelper.toString(twoFactor); - getPresenter().login(InputHelper.toString(username), InputHelper.toString(password), twoFactorCode); - } - @Override public void showErrorMessage(@NonNull String msgRes) { hideProgress(); super.showErrorMessage(msgRes); diff --git a/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java index d2af8346..533d360e 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/notification/NotificationsPresenter.java @@ -101,7 +101,6 @@ public class NotificationsPresenter extends BasePresenter showAll ? RestProvider.getNotificationService().getAllNotifications(page) : RestProvider.getNotificationService().getNotifications(page); makeRestCall(observable, response -> { - notifications.clear(); if (response.getItems() != null) { lastPage = response.getLast(); if (page == 1) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoClosedIssuesView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoClosedIssuesView.java index f8137424..48ffc9d9 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoClosedIssuesView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoClosedIssuesView.java @@ -30,13 +30,13 @@ public class RepoClosedIssuesView extends BaseFragment onLoadMore; private IssuesAdapter adapter; + private final IssueState issueState = IssueState.closed; - public static RepoClosedIssuesView newInstance(@NonNull String repoId, @NonNull String login, @NonNull IssueState issueState) { + public static RepoClosedIssuesView newInstance(@NonNull String repoId, @NonNull String login) { RepoClosedIssuesView view = new RepoClosedIssuesView(); view.setArguments(Bundler.start() .put(BundleConstant.ID, repoId) .put(BundleConstant.EXTRA, login) - .put(BundleConstant.EXTRA_TWO, issueState) .end()); return view; } @@ -64,7 +64,7 @@ public class RepoClosedIssuesView extends BaseFragment(getPresenter()); } - onLoadMore.setParameter(((IssueState) getArguments().getSerializable(BundleConstant.EXTRA_TWO))); + onLoadMore.setParameter(issueState); return onLoadMore; } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesMvp.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesMvp.java index abff16ca..09c5d47d 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesMvp.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesMvp.java @@ -30,7 +30,7 @@ interface RepoIssuesMvp { BaseViewHolder.OnItemClickListener, BaseMvp.PaginationListener { - void onFragmentCreated(@NonNull Bundle bundle); + void onFragmentCreated(@NonNull Bundle bundle, IssueState issueState); void onWorkOffline(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java index 3c800e5b..0c0c30d2 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java @@ -80,10 +80,10 @@ class RepoIssuesPresenter extends BasePresenter implements R }); } - @Override public void onFragmentCreated(@NonNull Bundle bundle) { + @Override public void onFragmentCreated(@NonNull Bundle bundle, IssueState issueState) { repoId = bundle.getString(BundleConstant.ID); login = bundle.getString(BundleConstant.EXTRA); - issueState = (IssueState) bundle.getSerializable(BundleConstant.EXTRA_TWO); + this.issueState = issueState; if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { onCallApi(1, null); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java index 24c35088..7a2eb586 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java @@ -35,15 +35,14 @@ public class RepoOpenedIssuesView extends BaseFragment onLoadMore; private IssuesAdapter adapter; - + private final IssueState issueState = IssueState.open; private RepoIssuesPagerMvp.View pagerCallback; - public static RepoOpenedIssuesView newInstance(@NonNull String repoId, @NonNull String login, @NonNull IssueState issueState) { + public static RepoOpenedIssuesView newInstance(@NonNull String repoId, @NonNull String login) { RepoOpenedIssuesView view = new RepoOpenedIssuesView(); view.setArguments(Bundler.start() .put(BundleConstant.ID, repoId) .put(BundleConstant.EXTRA, login) - .put(BundleConstant.EXTRA_TWO, issueState) .end()); return view; } @@ -85,7 +84,7 @@ public class RepoOpenedIssuesView extends BaseFragment(getPresenter()); } - onLoadMore.setParameter(((IssueState) getArguments().getSerializable(BundleConstant.EXTRA_TWO))); + onLoadMore.setParameter(issueState); return onLoadMore; } diff --git a/app/src/main/res/layouts/main_layouts/layout/login_layout.xml b/app/src/main/res/layouts/main_layouts/layout/login_layout.xml index 629a62b9..9f507c79 100644 --- a/app/src/main/res/layouts/main_layouts/layout/login_layout.xml +++ b/app/src/main/res/layouts/main_layouts/layout/login_layout.xml @@ -1,11 +1,11 @@ + android:orientation="vertical"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 0caca267..1dbb6f83 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -256,4 +256,5 @@ About Notification Settings Unauthorized user. + Two-Factor authentication OTP is required to login. \ No newline at end of file