android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java | 78 ++++--- android/lib/src/main/java/org/libreoffice/androidlib/ProgressDialog.java | 105 ++++++++++ android/lib/src/main/res/layout/lolib_dialog_loading.xml | 31 ++ loleaflet/src/map/Map.js | 6 4 files changed, 181 insertions(+), 39 deletions(-)
New commits: commit 0acb00fc24bbdc15f63bc36d619cd7cb2cbb9b04 Author: Jan Holesovsky <[email protected]> AuthorDate: Fri Feb 28 18:30:52 2020 +0100 Commit: Michael Meeks <[email protected]> CommitDate: Sat Feb 29 11:03:42 2020 +0100 android: Handle the loading progress directly in the app. This way we can easily extend the "preparing for the 1st start" to the follow-up "loading..." It should also look better while the webview is being initialized etc. Change-Id: I8de2dd96a726fa8302df558f691b1db82c9c8e71 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/89733 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Meeks <[email protected]> diff --git a/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java b/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java index 4a7c23151..ef8aa9bf3 100644 --- a/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java +++ b/android/lib/src/main/java/org/libreoffice/androidlib/LOActivity.java @@ -43,7 +43,6 @@ import android.webkit.ValueCallback; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; -import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; @@ -114,6 +113,8 @@ public class LOActivity extends AppCompatActivity { private Looper nativeLooper; private Bundle savedInstanceState; + private ProgressDialog mProgressDialog = null; + /** In case the mobile-wizard is visible, we have to intercept the Android's Back button. */ private boolean mMobileWizardVisible = false; @@ -251,7 +252,10 @@ public class LOActivity extends AppCompatActivity { this.savedInstanceState = savedInstanceState; getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); sPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + setContentView(R.layout.lolib_activity_main); + mProgressDialog = new ProgressDialog(this); + init(); } @@ -263,8 +267,7 @@ public class LOActivity extends AppCompatActivity { return; } - final AlertDialog assetsProgress = createProgressDialog(R.string.preparing_for_the_first_start_after_an_update); - assetsProgress.show(); + mProgressDialog.indeterminate(R.string.preparing_for_the_first_start_after_an_update); new AsyncTask<Void, Void, Void>() { @Override @@ -278,7 +281,6 @@ public class LOActivity extends AppCompatActivity { @Override protected void onPostExecute(Void aVoid) { - assetsProgress.dismiss(); initUI(); } }.execute(); @@ -507,18 +509,16 @@ public class LOActivity extends AppCompatActivity { @Override protected void onPause() { - super.onPause(); - Log.d(TAG, "onPause() - hinting to save, we might need to return to the doc"); - // A Save similar to an autosave if (documentLoaded) postMobileMessageNative("save dontTerminateEdit=true dontSaveIfUnmodified=true"); + + super.onPause(); + Log.d(TAG, "onPause() - hinting to save, we might need to return to the doc"); } @Override protected void onDestroy() { - super.onDestroy(); - Log.i(TAG, "onDestroy() - we know we are leaving the document"); nativeLooper.quit(); // Remove the webview from the hierarchy & destroy @@ -532,6 +532,11 @@ public class LOActivity extends AppCompatActivity { // than never, so let's call it from here too anyway documentLoaded = false; postMobileMessageNative("BYE"); + + mProgressDialog.dismiss(); + + super.onDestroy(); + Log.i(TAG, "onDestroy() - we know we are leaving the document"); } @Override @@ -601,24 +606,9 @@ public class LOActivity extends AppCompatActivity { return null; } - /** Create the progress dialog. */ - private AlertDialog createProgressDialog(int id) { - LayoutInflater inflater = this.getLayoutInflater(); - - View loadingView = inflater.inflate(R.layout.lolib_dialog_loading, null); - TextView loadingText = loadingView.findViewById(R.id.lolib_loading_dialog_text); - loadingText.setText(getText(id)); - - return new AlertDialog.Builder(LOActivity.this) - .setView(loadingView) - .setCancelable(true) - .create(); - } - /** Show the Saving progress and finish the app. */ private void finishWithProgress() { - final AlertDialog savingProgress = createProgressDialog(R.string.saving); - savingProgress.show(); + mProgressDialog.indeterminate(R.string.saving); // The 'BYE' takes a considerable amount of time, we need to post it // so that it starts after the saving progress is actually shown @@ -629,12 +619,12 @@ public class LOActivity extends AppCompatActivity { postMobileMessageNative("BYE"); copyTempBackToIntent(); - runOnUiThread(new Runnable() { + /*runOnUiThread(new Runnable() { @Override public void run() { - savingProgress.dismiss(); + mProgressDialog.dismiss(); } - }); + });*/ finish(); } @@ -654,6 +644,8 @@ public class LOActivity extends AppCompatActivity { } private void loadDocument() { + mProgressDialog.determinate(R.string.loading); + // setup the LOOLWSD ApplicationInfo applicationInfo = getApplicationInfo(); String dataDir = applicationInfo.dataDir; @@ -752,6 +744,31 @@ public class LOActivity extends AppCompatActivity { mWebView.loadUrl("javascript:window.TheFakeWebSocket.onmessage({'data':" + message + "});"); } }); + + // update progress bar when loading + if (message.startsWith("'statusindicator")) { + runOnUiThread(new Runnable() { + public void run() { + // update progress bar if it exists + final String statusIndicatorSetValue = "'statusindicatorsetvalue: "; + if (message.startsWith(statusIndicatorSetValue)) { + int start = statusIndicatorSetValue.length(); + int end = message.indexOf("'", start); + + int progress = 0; + try { + progress = Integer.parseInt(message.substring(start, end)); + } catch (Exception e) { + } + + mProgressDialog.determinateProgress(progress); + } + else if (message.startsWith("'statusindicatorfinish:")) { + mProgressDialog.dismiss(); + } + } + }); + } } /** @@ -912,8 +929,7 @@ public class LOActivity extends AppCompatActivity { } private void initiateSlideShow() { - final AlertDialog slideShowProgress = createProgressDialog(R.string.loading); - slideShowProgress.show(); + mProgressDialog.indeterminate(R.string.loading); nativeHandler.post(new Runnable() { @Override @@ -924,7 +940,7 @@ public class LOActivity extends AppCompatActivity { LOActivity.this.runOnUiThread(new Runnable() { @Override public void run() { - slideShowProgress.dismiss(); + mProgressDialog.dismiss(); Intent slideShowActIntent = new Intent(LOActivity.this, SlideShowActivity.class); slideShowActIntent.putExtra(SlideShowActivity.SVG_URI_KEY, slideShowFileUri); LOActivity.this.startActivity(slideShowActIntent); diff --git a/android/lib/src/main/java/org/libreoffice/androidlib/ProgressDialog.java b/android/lib/src/main/java/org/libreoffice/androidlib/ProgressDialog.java new file mode 100644 index 000000000..39115fc29 --- /dev/null +++ b/android/lib/src/main/java/org/libreoffice/androidlib/ProgressDialog.java @@ -0,0 +1,105 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +package org.libreoffice.androidlib; + +import android.app.Activity; +import android.app.AlertDialog; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ProgressBar; +import android.widget.TextView; + +/** Class to handle progress when loading, saving, or handling other time intensive operations. */ +public class ProgressDialog { + /** For the inflater. */ + Activity mActivity; + + /** The underlying dialog. */ + AlertDialog mProgressDialog = null; + + /** Various elements of the dialog. */ + TextView mTextView; + ProgressBar mIndeterminateProgress; + ProgressBar mDeterminateProgress; + + /** Current progress of the determinate progress bar. */ + int mProgress = 0; + + public ProgressDialog(Activity activity) { + mActivity = activity; + } + + /** Set up the dialog if it does not exist; but don't show it yet. */ + private void create() { + if (mProgressDialog != null) + return; + + LayoutInflater inflater = mActivity.getLayoutInflater(); + + View loadingView = inflater.inflate(R.layout.lolib_dialog_loading, null); + + mTextView = loadingView.findViewById(R.id.progress_dialog_text); + mIndeterminateProgress = loadingView.findViewById(R.id.progress_indeterminate); + mDeterminateProgress = loadingView.findViewById(R.id.progress_determinate); + + mProgressDialog = new AlertDialog.Builder(mActivity) + .setView(loadingView) + .setCancelable(false) + .create(); + } + + /** Set the progress to indereterminate state. */ + public void indeterminate(int messageId) { + create(); + + mIndeterminateProgress.setVisibility(View.VISIBLE); + mDeterminateProgress.setVisibility(View.INVISIBLE); + mTextView.setText(mActivity.getText(messageId)); + + mProgressDialog.show(); + } + + /** Set the progress to indereterminate state. */ + public void determinate(int messageId) { + create(); + + mIndeterminateProgress.setVisibility(View.INVISIBLE); + mDeterminateProgress.setVisibility(View.VISIBLE); + mTextView.setText(mActivity.getText(messageId)); + + mProgress = 0; + mDeterminateProgress.setProgress(mProgress); + + mProgressDialog.show(); + } + + /** Update the progress value. */ + public void determinateProgress(int progress) { + if (mProgressDialog == null) + return; + + if (mProgress > progress) + return; + + mProgress = progress; + mDeterminateProgress.setProgress(mProgress); + } + + /** Kill the dialog. */ + public void dismiss() { + if (mProgressDialog == null) + return; + + mProgressDialog.dismiss(); + mProgressDialog = null; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/android/lib/src/main/res/layout/lolib_dialog_loading.xml b/android/lib/src/main/res/layout/lolib_dialog_loading.xml index db4825bb7..b0fef6554 100644 --- a/android/lib/src/main/res/layout/lolib_dialog_loading.xml +++ b/android/lib/src/main/res/layout/lolib_dialog_loading.xml @@ -4,16 +4,31 @@ android:layout_height="wrap_content" android:orientation="horizontal" android:padding="20dp"> - <ProgressBar - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_weight="1" /> + + <FrameLayout + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + + <ProgressBar + android:id="@+id/progress_indeterminate" + android:layout_width="50dp" + android:layout_height="50dp" /> + + <ProgressBar + android:id="@+id/progress_determinate" + style="?android:attr/progressBarStyleHorizontal" + android:layout_width="50dp" + android:layout_height="50dp" + android:indeterminate="false" + android:min="0" + android:max="100" + android:visibility="invisible" /> + </FrameLayout> <TextView - android:id="@+id/lolib_loading_dialog_text" + android:id="@+id/progress_dialog_text" android:layout_width="0dp" android:layout_height="match_parent" - android:layout_weight="4" - android:gravity="center" - android:text="@string/loading" /> + android:layout_weight="1" + android:gravity="center"/> </LinearLayout> diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js index 4aa7fd7c7..a4804775d 100644 --- a/loleaflet/src/map/Map.js +++ b/loleaflet/src/map/Map.js @@ -441,6 +441,9 @@ L.Map = L.Evented.extend({ }, showBusy: function(label, bar) { + if (window.ThisIsTheAndroidApp) + return; + // If document is already loaded, ask the toolbar widget to show busy // status on the bottom statusbar if (this._docLayer) { @@ -451,6 +454,9 @@ L.Map = L.Evented.extend({ }, hideBusy: function () { + if (window.ThisIsTheAndroidApp) + return; + this.fire('hidebusy'); this._progressBar.end(this); }, _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
