From ac030c146f2debac8430375ff016e29843e573fc Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 12 May 2019 22:42:45 +0200 Subject: [PATCH] Fix authentification failure, sort items by date and add better handling for null values --- .../readrops/app/activities/MainActivity.java | 27 ++++++++------ .../app/repositories/NextNewsRepository.java | 30 +++++++++------ .../services/nextcloudnews/NextNewsAPI.java | 37 ++++++++++++++----- .../{SyncResults.java => SyncResult.java} | 14 ++++++- .../readropslibrary/utils/HttpManager.java | 12 +++++- 5 files changed, 83 insertions(+), 37 deletions(-) rename readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/{SyncResults.java => SyncResult.java} (81%) diff --git a/app/src/main/java/com/readrops/app/activities/MainActivity.java b/app/src/main/java/com/readrops/app/activities/MainActivity.java index 69ab8da5..4e5873a9 100644 --- a/app/src/main/java/com/readrops/app/activities/MainActivity.java +++ b/app/src/main/java/com/readrops/app/activities/MainActivity.java @@ -1,21 +1,9 @@ package com.readrops.app.activities; -import androidx.lifecycle.ViewModelProviders; -import androidx.paging.PagedList; import android.content.Intent; import android.graphics.Color; import android.os.Build; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import androidx.appcompat.app.AppCompatActivity; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.appcompat.widget.Toolbar; -import androidx.recyclerview.widget.ItemTouchHelper; import android.util.Log; import android.view.ActionMode; import android.view.Menu; @@ -26,6 +14,19 @@ import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.drawerlayout.widget.DrawerLayout; +import androidx.lifecycle.ViewModelProviders; +import androidx.paging.PagedList; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.ItemTouchHelper; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; + import com.afollestad.materialdialogs.MaterialDialog; import com.bumptech.glide.Glide; import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader; @@ -453,7 +454,9 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou @Override public void onError(Throwable e) { + e.printStackTrace(); refreshLayout.setRefreshing(false); + syncProgressLayout.setVisibility(View.GONE); Toast.makeText(getApplication(), e.getMessage(), Toast.LENGTH_LONG).show(); } diff --git a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java index d8ad9adc..9c5d4267 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -14,7 +14,7 @@ import com.readrops.app.utils.ParsingResult; import com.readrops.app.utils.Utils; import com.readrops.readropslibrary.services.nextcloudnews.Credentials; import com.readrops.readropslibrary.services.nextcloudnews.NextNewsAPI; -import com.readrops.readropslibrary.services.nextcloudnews.SyncResults; +import com.readrops.readropslibrary.services.nextcloudnews.SyncResult; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItem; @@ -22,6 +22,7 @@ import com.readrops.readropslibrary.utils.LibUtils; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import io.reactivex.Completable; @@ -43,21 +44,25 @@ public class NextNewsRepository extends ARepository { try { NextNewsAPI newsAPI = new NextNewsAPI(); - Credentials credentials = new Credentials("", LibUtils.NEXTCLOUD_PASSWORD, ""); - SyncResults results = newsAPI.sync(credentials, NextNewsAPI.SyncType.INITIAL_SYNC, null); + Credentials credentials = new Credentials("Lucas", LibUtils.NEXTCLOUD_PASSWORD, "https://cloud.openserver.fr"); + SyncResult syncResult = newsAPI.sync(credentials, NextNewsAPI.SyncType.INITIAL_SYNC, null); - TimingLogger timings = new TimingLogger(TAG, "sync"); - insertFolders(results.getFolders()); - timings.addSplit("insert folders"); + if (!syncResult.isError()) { + TimingLogger timings = new TimingLogger(TAG, "sync"); + insertFolders(syncResult.getFolders()); + timings.addSplit("insert folders"); - insertFeeds(results.getFeeds()); - timings.addSplit("insert feeds"); + insertFeeds(syncResult.getFeeds()); + timings.addSplit("insert feeds"); - insertItems(results.getItems()); - timings.addSplit("insert items"); - timings.dumpToLog(); + insertItems(syncResult.getItems()); + timings.addSplit("insert items"); + timings.dumpToLog(); - emitter.onComplete(); + emitter.onComplete(); + } else + emitter.onError(new Throwable()); + } catch (IOException e) { e.printStackTrace(); emitter.onError(e); @@ -155,6 +160,7 @@ public class NextNewsRepository extends ARepository { } } + Collections.sort(newItems, Item::compareTo); database.itemDao().insert(newItems); } } diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java index e5a736df..52148e65 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java @@ -13,6 +13,7 @@ import com.readrops.readropslibrary.utils.HttpManager; import java.io.IOException; +import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -32,30 +33,48 @@ public class NextNewsAPI { .build(); } - public SyncResults sync(@NonNull Credentials credentials, @NonNull SyncType syncType, @Nullable SyncData data) throws IOException { + public SyncResult sync(@NonNull Credentials credentials, @NonNull SyncType syncType, @Nullable SyncData data) throws IOException { HttpManager httpManager = new HttpManager(credentials); Retrofit retrofit = getConfiguredRetrofitInstance(httpManager); NextNewsService api = retrofit.create(NextNewsService.class); + SyncResult syncResult = new SyncResult(); TimingLogger timings = new TimingLogger(TAG, "sync"); - NextNewsFeeds feedList = api.getFeeds().execute().body(); + Response feedResponse = api.getFeeds().execute(); + NextNewsFeeds feedList = feedResponse.body(); timings.addSplit("get feeds"); - NextNewsFolders folderList = api.getFolders().execute().body(); + if (!feedResponse.isSuccessful()) + syncResult.setError(true); + + Response folderResponse = api.getFolders().execute(); + NextNewsFolders folderList = folderResponse.body(); timings.addSplit("get folders"); - NextNewsItems itemList = api.getItems(3, false, 300).execute().body(); + if (!folderResponse.isSuccessful()) + syncResult.setError(true); + + Response itemsResponse = api.getItems(3, false, -1).execute(); + NextNewsItems itemList = itemsResponse.body(); timings.addSplit("get items"); + + if (!itemsResponse.isSuccessful()) + syncResult.setError(true); + timings.dumpToLog(); - SyncResults results = new SyncResults(); - results.setFeeds(feedList.getFeeds()); - results.setFolders(folderList.getFolders()); - results.setItems(itemList.getItems()); + if (feedList.getFeeds() != null) + syncResult.setFeeds(feedList.getFeeds()); - return results; + if (folderList.getFolders() != null) + syncResult.setFolders(folderList.getFolders()); + + if (itemList.getItems() != null) + syncResult.setItems(itemList.getItems()); + + return syncResult; } public enum SyncType { diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResults.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java similarity index 81% rename from readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResults.java rename to readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java index 8c225c9e..098923c0 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResults.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java @@ -6,7 +6,7 @@ import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItem; import java.util.List; -public class SyncResults { +public class SyncResult { private List folders; @@ -14,7 +14,9 @@ public class SyncResults { private List items; - public SyncResults() { + private boolean error; + + public SyncResult() { } public List getFolders() { @@ -40,4 +42,12 @@ public class SyncResults { public void setItems(List items) { this.items = items; } + + public boolean isError() { + return error; + } + + public void setError(boolean error) { + this.error = error; + } } diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/HttpManager.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/HttpManager.java index c95f47d6..83cc0697 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/HttpManager.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/HttpManager.java @@ -19,7 +19,7 @@ public class HttpManager { this.credentials = credentials; okHttpClient = HttpBuilder.getBuilder() - .callTimeout(20, TimeUnit.SECONDS) + .callTimeout(30, TimeUnit.SECONDS) .readTimeout(1, TimeUnit.HOURS) .addInterceptor(new AuthInterceptor()) .build(); @@ -35,11 +35,19 @@ public class HttpManager { public class AuthInterceptor implements Interceptor { + public AuthInterceptor() { + + } + @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); - request = request.newBuilder() + // AuthInterceptor is called twice when using Okhttp for the second time and I don't know why, + // which adds the authorization header twice and make the auth fail + // So preventively, I delete the first added header + // TODO : find why AuthInterceptor is called twice + request = request.newBuilder().removeHeader("Authorization") .addHeader("Authorization", credentials.getBase64()) .build();