diff options
Diffstat (limited to 'org.fox.ttrss')
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> |