summaryrefslogtreecommitdiff
path: root/org.fox.ttrss
diff options
context:
space:
mode:
Diffstat (limited to 'org.fox.ttrss')
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java27
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java3
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java7
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java10
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java12
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java3
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java7
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java14
-rwxr-xr-xorg.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java19
-rw-r--r--org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java10
-rw-r--r--org.fox.ttrss/src/main/res/layout/layout_detail_phone.xml11
-rw-r--r--org.fox.ttrss/src/main/res/layout/layout_master_phone.xml11
-rwxr-xr-xorg.fox.ttrss/src/main/res/values/strings.xml1
13 files changed, 121 insertions, 14 deletions
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
index b6a9ff32..3bbf4df9 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiCommon.java
@@ -1,5 +1,7 @@
package org.fox.ttrss;
+import static org.fox.ttrss.glide.OkHttpProgressGlideModule.createInterceptor;
+
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
@@ -16,12 +18,15 @@ import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+import org.fox.ttrss.glide.OkHttpProgressGlideModule;
+
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
import okhttp3.Credentials;
+import okhttp3.HttpUrl;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@@ -40,10 +45,11 @@ public class ApiCommon {
void setStatusCode(int statusCode);
void setLastError(ApiError lastError);
void setLastErrorMessage(String message);
+ void notifyProgress(int progress);
}
public enum ApiError {
- SUCCESS, UNKNOWN_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND,
+ SUCCESS, UNKNOWN_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, HTTP_BAD_REQUEST,
HTTP_SERVER_ERROR, HTTP_OTHER_ERROR, SSL_REJECTED, SSL_HOSTNAME_REJECTED, PARSE_ERROR, IO_ERROR, OTHER_ERROR, API_DISABLED,
API_UNKNOWN, LOGIN_FAILED, INVALID_URL, API_INCORRECT_USAGE, NETWORK_UNAVAILABLE, API_UNKNOWN_METHOD }
@@ -55,6 +61,8 @@ public class ApiCommon {
return R.string.error_unknown;
case HTTP_UNAUTHORIZED:
return R.string.error_http_unauthorized;
+ case HTTP_BAD_REQUEST:
+ return R.string.error_bad_request;
case HTTP_FORBIDDEN:
return R.string.error_http_forbidden;
case HTTP_NOT_FOUND:
@@ -138,10 +146,22 @@ public class ApiCommon {
Request request = requestBuilder.build();
+ OkHttpProgressGlideModule.ResponseProgressListener listener = new OkHttpProgressGlideModule.ResponseProgressListener() {
+ @Override
+ public void update(HttpUrl url, long bytesRead, long contentLength) {
+
+ if (contentLength > 0)
+ caller.notifyProgress((int) (bytesRead * 100f / contentLength));
+ }
+ };
+
+ /* lets shamelessly hijack OkHttpProgressGlideModule */
+
OkHttpClient client = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
+ .addNetworkInterceptor(createInterceptor(listener))
.build();
Response response = client.newCall(request).execute();
@@ -184,6 +204,7 @@ public class ApiCommon {
break;
default:
Log.d(TAG, "Unknown API error: " + error);
+ caller.setLastErrorMessage(error);
caller.setLastError(ApiError.API_UNKNOWN);
break;
}
@@ -191,6 +212,9 @@ public class ApiCommon {
} else {
switch (response.code()) {
+ case 400:
+ caller.setLastError(ApiError.HTTP_BAD_REQUEST);
+ break;
case 401:
caller.setLastError(ApiError.HTTP_UNAUTHORIZED);
break;
@@ -206,6 +230,7 @@ public class ApiCommon {
break;
default:
Log.d(TAG, "HTTP response code: " + response.code());
+ caller.setLastErrorMessage("HTTP response code: " + response.code());
caller.setLastError(ApiError.HTTP_OTHER_ERROR);
break;
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java
index 8d83e7bd..5cba0ed1 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiLoader.java
@@ -78,4 +78,7 @@ public class ApiLoader extends AsyncTaskLoader<JsonElement> implements ApiCommon
public void setLastErrorMessage(String message) {
m_lastErrorMessage = message;
}
+
+ @Override
+ public void notifyProgress(int progress) { }
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java
index ba8dad20..bc219dd7 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ApiRequest.java
@@ -12,7 +12,7 @@ import java.util.HashMap;
public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonElement> implements ApiCommon.ApiCaller {
- private int m_apiStatusCode = 0;
+ protected int m_apiStatusCode = 0;
private final Context m_context;
protected String m_lastErrorMessage;
@@ -53,4 +53,9 @@ public class ApiRequest extends AsyncTask<HashMap<String,String>, Integer, JsonE
public void setLastErrorMessage(String message) {
m_lastErrorMessage = message;
}
+
+ @Override
+ public void notifyProgress(int progress) {
+ publishProgress(progress);
+ }
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java
index 7a79887d..f4deb372 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/ArticleModel.java
@@ -51,6 +51,7 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle
private ExecutorService m_executor;
private Handler m_mainHandler = new Handler(Looper.getMainLooper());
private MutableLiveData<Long> m_lastUpdate = new MutableLiveData<>(Long.valueOf(0));
+ private MutableLiveData<Integer> m_loadingProgress = new MutableLiveData<>(Integer.valueOf(0));
public ArticleModel(@NonNull Application application) {
super(application);
@@ -273,6 +274,11 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle
m_lastErrorMessage = message;
}
+ @Override
+ public void notifyProgress(int progress) {
+ m_loadingProgress.postValue(progress);
+ }
+
public boolean getFirstIdChanged() {
return m_firstIdChanged;
}
@@ -312,4 +318,8 @@ public class ArticleModel extends AndroidViewModel implements ApiCommon.ApiCalle
public boolean isLoading() {
return m_loadingInProgress;
}
+
+ public LiveData<Integer> getLoadingProgress() {
+ return m_loadingProgress;
+ }
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
index 500eccb9..10b06022 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/DetailActivity.java
@@ -58,6 +58,8 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
if (headlines != null)
headlines.setVisibility(isPortrait() ? View.GONE : View.VISIBLE);
+ m_loadingProgress = findViewById(R.id.loading_progress);
+
m_bottomAppBar = findViewById(R.id.detail_bottom_appbar);
if (m_bottomAppBar != null) {
@@ -295,6 +297,8 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
@Override
public void onHeadlinesLoaded(boolean appended) {
+ setLoadingVisible(false);
+
HeadlinesFragment hf = (HeadlinesFragment) getSupportFragmentManager().findFragmentByTag(FRAG_HEADLINES);
ArticlePager ap = (ArticlePager) getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
@@ -322,7 +326,13 @@ public class DetailActivity extends OnlineActivity implements HeadlinesEventList
}
} */
}
-
+
+ @Override
+ public void onHeadlinesLoadingProgress(int progress) {
+ setLoadingVisible(progress < 100);
+ setLoadingProgress(progress);
+ }
+
@Override
public void onBackPressed() {
Intent resultIntent = new Intent();
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java
index 14215a83..8f80094c 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesEventListener.java
@@ -6,5 +6,6 @@ public interface HeadlinesEventListener {
void onArticleListSelectionChange();
void onArticleSelected(Article article);
void onArticleSelected(Article article, boolean open);
- void onHeadlinesLoaded(boolean appended);
+ void onHeadlinesLoaded(boolean appended);
+ void onHeadlinesLoadingProgress(int progress);
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
index a784ea8a..099afc60 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/HeadlinesFragment.java
@@ -474,6 +474,11 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
ArticleModel model = Application.getArticlesModel();
+ // this gets notified on loading %
+ model.getLoadingProgress().observe(getActivity(), progress -> {
+ m_listener.onHeadlinesLoadingProgress(progress);
+ });
+
// this gets notified on network update
model.getUpdatesData().observe(getActivity(), lastUpdate -> {
if (lastUpdate > 0) {
@@ -515,6 +520,8 @@ public class HeadlinesFragment extends androidx.fragment.app.Fragment {
return;
}
+ m_listener.onHeadlinesLoaded(appended);
+
if (model.getLastErrorMessage() != null) {
m_activity.toast(m_activity.getString(model.getErrorMessage()) + "\n" + model.getLastErrorMessage());
} else {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
index bb750c01..643f859c 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/MasterActivity.java
@@ -74,7 +74,9 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
m_lastWidgetRefresh = new Date().getTime();
- m_drawerLayout = findViewById(R.id.headlines_drawer);
+ m_loadingProgress = findViewById(R.id.loading_progress);
+
+ m_drawerLayout = findViewById(R.id.headlines_drawer);
if (m_drawerLayout != null) {
@@ -461,7 +463,15 @@ public class MasterActivity extends OnlineActivity implements HeadlinesEventList
}
@Override
- public void onHeadlinesLoaded(boolean appended) { }
+ public void onHeadlinesLoaded(boolean appended) {
+ setLoadingVisible(false);
+ }
+
+ @Override
+ public void onHeadlinesLoadingProgress(int progress) {
+ setLoadingVisible(progress < 100);
+ setLoadingProgress(progress);
+ }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
index c946f405..cbbf1188 100755
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/OnlineActivity.java
@@ -18,6 +18,7 @@ import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
@@ -29,6 +30,7 @@ import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
+import com.google.android.material.progressindicator.LinearProgressIndicator;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
@@ -61,6 +63,7 @@ public class OnlineActivity extends CommonActivity {
private String m_lastImageHitTestUrl;
private ConnectivityManager m_cmgr;
+ protected LinearProgressIndicator m_loadingProgress;
public void catchupDialog(final Feed feed) {
@@ -1286,8 +1289,6 @@ article.score = Integer.parseInt(edit.getText().toString());
Map<String, String> customSortTypes = new Gson().fromJson(config.get("custom_sort_types"), hashType);
setCustomSortModes(customSortTypes);
-
- Log.d(TAG, "test");
}
if (m_listener != null) {
@@ -1356,7 +1357,7 @@ article.score = Integer.parseInt(edit.getText().toString());
if (m_lastErrorMessage != null) {
setLoadingStatus(getString(getErrorMessage()) + "\n\n" + m_lastErrorMessage);
} else {
- setLoadingStatus(getErrorMessage());
+ setLoadingStatus(getString(getErrorMessage()) + "\n\n" + m_apiStatusCode);
}
loginFailure();
@@ -1417,4 +1418,16 @@ article.score = Integer.parseInt(edit.getText().toString());
return size.x > size.y ? (int)(size.y * 0.75) : (int)(size.x * 0.75);
}
+
+
+ public void setLoadingProgress(int progress) {
+ if (m_loadingProgress != null)
+ m_loadingProgress.setProgress(progress);
+ }
+
+ public void setLoadingVisible(boolean visible) {
+ if (m_loadingProgress != null)
+ m_loadingProgress.setVisibility(visible ? View.VISIBLE : View.GONE);
+ }
+
}
diff --git a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java
index 312988bf..bb868f8e 100644
--- a/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java
+++ b/org.fox.ttrss/src/main/java/org/fox/ttrss/glide/OkHttpProgressGlideModule.java
@@ -39,7 +39,7 @@ public class OkHttpProgressGlideModule implements GlideModule {
glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));
}
- private static Interceptor createInterceptor(final ResponseProgressListener listener) {
+ public static Interceptor createInterceptor(final ResponseProgressListener listener) {
return chain -> {
Request request = chain.request();
Response response = chain.proceed(request);
@@ -65,7 +65,7 @@ public class OkHttpProgressGlideModule implements GlideModule {
DispatchingProgressListener.expect(url, listener);
}
- private interface ResponseProgressListener {
+ public interface ResponseProgressListener {
void update(HttpUrl url, long bytesRead, long contentLength);
}
@@ -119,14 +119,14 @@ public class OkHttpProgressGlideModule implements GlideModule {
}
}
- private static class OkHttpProgressResponseBody extends ResponseBody {
+ public static class OkHttpProgressResponseBody extends ResponseBody {
private final HttpUrl url;
private final ResponseBody responseBody;
private final ResponseProgressListener progressListener;
private BufferedSource bufferedSource;
- OkHttpProgressResponseBody(HttpUrl url, ResponseBody responseBody,
- ResponseProgressListener progressListener) {
+ public OkHttpProgressResponseBody(HttpUrl url, ResponseBody responseBody,
+ ResponseProgressListener progressListener) {
this.url = url;
this.responseBody = responseBody;
diff --git a/org.fox.ttrss/src/main/res/layout/layout_detail_phone.xml b/org.fox.ttrss/src/main/res/layout/layout_detail_phone.xml
index 4e75d44b..0c5cf9a6 100644
--- a/org.fox.ttrss/src/main/res/layout/layout_detail_phone.xml
+++ b/org.fox.ttrss/src/main/res/layout/layout_detail_phone.xml
@@ -10,6 +10,17 @@
<include layout="@layout/toolbar" android:id="@+id/toolbar" />
+ <com.google.android.material.progressindicator.LinearProgressIndicator
+ android:id="@+id/loading_progress"
+ android:max="100"
+ android:progress="50"
+ android:visibility="gone"
+ android:indeterminate="false"
+ android:layout_marginTop="-4dp"
+ android:layout_marginBottom="-4dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
diff --git a/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml b/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml
index e32d5fbe..23f2ee7e 100644
--- a/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml
+++ b/org.fox.ttrss/src/main/res/layout/layout_master_phone.xml
@@ -25,6 +25,17 @@
<include layout="@layout/toolbar" android:id="@+id/toolbar" />
+ <com.google.android.material.progressindicator.LinearProgressIndicator
+ android:id="@+id/loading_progress"
+ android:max="100"
+ android:progress="50"
+ android:visibility="gone"
+ android:indeterminate="false"
+ android:layout_marginTop="-4dp"
+ android:layout_marginBottom="-4dp"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
diff --git a/org.fox.ttrss/src/main/res/values/strings.xml b/org.fox.ttrss/src/main/res/values/strings.xml
index fb7e6309..df82688b 100755
--- a/org.fox.ttrss/src/main/res/values/strings.xml
+++ b/org.fox.ttrss/src/main/res/values/strings.xml
@@ -304,4 +304,5 @@
<string name="dont_open_anything">Nothing</string>
<string name="open_on_startup">Open on startup</string>
<string name="error_success">Operation completed successfully</string>
+ <string name="error_bad_request">Error: 400 bad request</string>
</resources>