jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/344687 )

Change subject: Show an accurate message in the link preview when a page 
doesn't exist
......................................................................


Show an accurate message in the link preview when a page doesn't exist

Updates the link preview to show a "page does not exist" message when
appropriate.

Bug: T161008
Change-Id: I3b95431abb9305b191250ff527272d1869208c54
---
M app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
A app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorType.java
A app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorView.java
M app/src/main/java/org/wikipedia/util/ThrowableUtil.java
A app/src/main/res/drawable/ic_portable_wifi_off_black_24px.xml
M app/src/main/res/layout/dialog_link_preview.xml
A app/src/main/res/layout/view_link_preview_error.xml
M app/src/main/res/values-ast/strings.xml
M app/src/main/res/values-bn/strings.xml
M app/src/main/res/values-br/strings.xml
M app/src/main/res/values-cnh/strings.xml
M app/src/main/res/values-de/strings.xml
M app/src/main/res/values-es/strings.xml
M app/src/main/res/values-fa/strings.xml
M app/src/main/res/values-fi/strings.xml
M app/src/main/res/values-fr/strings.xml
M app/src/main/res/values-gl/strings.xml
M app/src/main/res/values-hu/strings.xml
M app/src/main/res/values-iw/strings.xml
M app/src/main/res/values-ko/strings.xml
M app/src/main/res/values-mk/strings.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values-ru/strings.xml
M app/src/main/res/values-sv/strings.xml
M app/src/main/res/values-tr/strings.xml
M app/src/main/res/values-uk/strings.xml
M app/src/main/res/values-zh-rTW/strings.xml
M app/src/main/res/values-zh/strings.xml
M app/src/main/res/values/strings.xml
29 files changed, 261 insertions(+), 75 deletions(-)

Approvals:
  Niedzielski: Looks good to me, approved
  jenkins-bot: Verified



diff --git 
a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java 
b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
index 09154c2..007de8a 100755
--- a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
+++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewDialog.java
@@ -45,12 +45,13 @@
 
 import static org.wikipedia.util.L10nUtil.getStringForArticleLanguage;
 import static org.wikipedia.util.L10nUtil.setConditionalLayoutDirection;
+import static org.wikipedia.util.ThrowableUtil.is404;
+import static org.wikipedia.util.ThrowableUtil.isOffline;
 
 public class LinkPreviewDialog extends ExtendedBottomSheetDialogFragment
-        implements DialogInterface.OnDismissListener {
+        implements LinkPreviewErrorView.Callback, 
DialogInterface.OnDismissListener {
     public interface Callback {
-        void onLinkPreviewLoadPage(@NonNull PageTitle title, @NonNull 
HistoryEntry entry,
-                                   boolean inNewTab);
+        void onLinkPreviewLoadPage(@NonNull PageTitle title, @NonNull 
HistoryEntry entry, boolean inNewTab);
         void onLinkPreviewCopyLink(@NonNull PageTitle title);
         void onLinkPreviewAddToList(@NonNull PageTitle title);
         void onLinkPreviewShareLink(@NonNull PageTitle title);
@@ -60,7 +61,7 @@
 
     private LinearLayout dialogContainer;
     private View contentContainer;
-    private View offlineContainer;
+    private LinkPreviewErrorView errorContainer;
     private ProgressBar progressBar;
     private TextView extractText;
     private SimpleDraweeView thumbnailView;
@@ -88,8 +89,7 @@
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-                             Bundle savedInstanceState) {
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
Bundle savedInstanceState) {
         WikipediaApp app = WikipediaApp.getInstance();
         pageTitle = getArguments().getParcelable("title");
         entrySource = getArguments().getInt("entrySource");
@@ -98,7 +98,7 @@
         View rootView = inflater.inflate(R.layout.dialog_link_preview, 
container);
         dialogContainer = (LinearLayout) 
rootView.findViewById(R.id.dialog_link_preview_container);
         contentContainer = 
rootView.findViewById(R.id.dialog_link_preview_content_container);
-        offlineContainer = 
rootView.findViewById(R.id.dialog_link_preview_offline_container);
+        errorContainer = (LinkPreviewErrorView) 
rootView.findViewById(R.id.dialog_link_preview_error_container);
         progressBar = (ProgressBar) 
rootView.findViewById(R.id.link_preview_progress);
         toolbarView = rootView.findViewById(R.id.link_preview_toolbar);
         toolbarView.setOnClickListener(goToPageListener);
@@ -198,6 +198,18 @@
         }
     }
 
+    @Override
+    public void onAddToList() {
+        if (callback() != null) {
+            callback().onLinkPreviewAddToList(pageTitle);
+        }
+    }
+
+    @Override
+    public void onDismiss() {
+        dismiss();
+    }
+
     private void loadContent() {
         PageClientFactory
                 .create(pageTitle.getWikiSite(), pageTitle.namespace())
@@ -205,7 +217,7 @@
                 .enqueue(linkPreviewNetworkOnLoadCallback);
     }
 
-    private void tryLoadingFromCache() {
+    private void tryLoadingFromCache(@Nullable final Throwable 
networkException) {
         L.v("Loading link preview from Saved Pages");
         new LoadSavedPageTask(pageTitle) {
             @Override public void onFinish(Page page) {
@@ -219,7 +231,11 @@
                 if (!isAdded()) {
                     return;
                 }
-                showPreviewOfflineNotice();
+                if (networkException != null) {
+                    showError(networkException);
+                } else {
+                    showError(caught);
+                }
                 L.e("Page summary cache request failed", caught);
             }
         }.execute();
@@ -230,14 +246,17 @@
         setPreviewContents(contents);
     }
 
-    private void showPreviewOfflineNotice() {
+    private void showError(@Nullable Throwable caught) {
         dialogContainer.setLayoutTransition(null);
         progressBar.setVisibility(View.GONE);
         contentContainer.setVisibility(View.GONE);
-        offlineContainer.setVisibility(View.VISIBLE);
-        
overlayView.setPrimaryButtonText(getResources().getString(R.string.button_add_to_reading_list));
         overlayView.showSecondaryButton(false);
-        overlayView.setCallback(new OverlayViewOfflineCallback());
+        errorContainer.setVisibility(View.VISIBLE);
+        errorContainer.setError(caught);
+        errorContainer.setCallback(this);
+        LinkPreviewErrorType errorType = 
LinkPreviewErrorType.get(getContext(), caught);
+        
overlayView.setPrimaryButtonText(getResources().getString(errorType.buttonText()));
+        overlayView.setCallback(errorType.buttonAction(errorContainer));
     }
 
     private void setPreviewContents(@NonNull LinkPreviewContents contents) {
@@ -258,15 +277,22 @@
             if (summary != null && !summary.hasError()) {
                 showPreview(new LinkPreviewContents(summary, 
pageTitle.getWikiSite()));
             } else {
-                tryLoadingFromCache();
+                tryLoadingFromCache(null);
                 logError(summary.hasError() ? summary.getError() : null,
                         "Page summary network request failed");
             }
         }
 
-        @Override public void onFailure(Call<PageSummary> call, Throwable t) {
-            tryLoadingFromCache();
-            L.e(t);
+        @Override public void onFailure(Call<PageSummary> call, Throwable 
caught) {
+            L.e(caught);
+            if (is404(getContext(), caught)) {
+                // If the page doesn't exist, show an error immediately 
without checking the cache.
+                showError(caught);
+            } else {
+                // If we're offline, check the cache but pass along the 
exception so that we show
+                // the correct error message if the page isn't found in the 
cache.
+                tryLoadingFromCache(isOffline(caught) ? caught : null);
+            }
         }
     };
 
@@ -369,19 +395,6 @@
         @Override
         public void onSecondaryClick() {
             goToExternalMapsApp();
-        }
-    }
-
-    private class OverlayViewOfflineCallback implements 
LinkPreviewOverlayView.Callback {
-        @Override
-        public void onPrimaryClick() {
-            if (callback() != null) {
-                callback().onLinkPreviewAddToList(pageTitle);
-            }
-        }
-
-        @Override
-        public void onSecondaryClick() {
         }
     }
 
diff --git 
a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorType.java 
b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorType.java
new file mode 100644
index 0000000..f15221f
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorType.java
@@ -0,0 +1,73 @@
+package org.wikipedia.page.linkpreview;
+
+import android.content.Context;
+import android.support.annotation.DrawableRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+
+import org.wikipedia.R;
+import org.wikipedia.util.ThrowableUtil;
+
+enum LinkPreviewErrorType {
+    // Note: The string resource corresponding to the 'text' field will be 
updated programmatically
+    // for the OFFLINE type to accommodate error view design requirements.  See
+    // LinkPreviewErrorView.setError() for further discussion.
+    OFFLINE(R.drawable.ic_portable_wifi_off_black_24px, 
R.string.error_message_generic,
+            R.string.button_add_to_reading_list) {
+        @NonNull @Override
+        LinkPreviewOverlayView.Callback buttonAction(@NonNull 
LinkPreviewErrorView errorView) {
+            return errorView.addToListCallback();
+        }
+    },
+
+    PAGE_MISSING(R.drawable.ic_error_black_24dp, 
R.string.error_page_does_not_exist,
+            R.string.view_link_preview_error_button_dismiss) {
+        @NonNull @Override
+        LinkPreviewOverlayView.Callback buttonAction(@NonNull 
LinkPreviewErrorView errorView) {
+            return errorView.dismissCallback();
+        }
+    },
+
+    GENERIC(R.drawable.ic_error_black_24dp, R.string.error_message_generic,
+            R.string.view_link_preview_error_button_dismiss) {
+        @NonNull @Override
+        LinkPreviewOverlayView.Callback buttonAction(@NonNull 
LinkPreviewErrorView errorView) {
+            return errorView.dismissCallback();
+        }
+    };
+
+    @DrawableRes private final int icon;
+    @StringRes private final int text;
+    @StringRes private final int buttonText;
+
+    LinkPreviewErrorType(@DrawableRes int icon, @StringRes int text, 
@StringRes int buttonText) {
+        this.icon = icon;
+        this.text = text;
+        this.buttonText = buttonText;
+    }
+
+    @DrawableRes int icon() {
+        return icon;
+    }
+
+    @StringRes int text() {
+        return text;
+    }
+
+    @StringRes public int buttonText() {
+        return buttonText;
+    }
+
+    @NonNull abstract LinkPreviewOverlayView.Callback buttonAction(@NonNull 
LinkPreviewErrorView errorView);
+
+    @NonNull public static LinkPreviewErrorType get(@NonNull Context context, 
@Nullable Throwable caught) {
+        if (caught != null && ThrowableUtil.is404(context, caught)) {
+            return LinkPreviewErrorType.PAGE_MISSING;
+        }
+        if (caught != null && ThrowableUtil.isOffline(caught)) {
+            return LinkPreviewErrorType.OFFLINE;
+        }
+        return LinkPreviewErrorType.GENERIC;
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorView.java 
b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorView.java
new file mode 100644
index 0000000..46faa82
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/page/linkpreview/LinkPreviewErrorView.java
@@ -0,0 +1,92 @@
+package org.wikipedia.page.linkpreview;
+
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import org.wikipedia.R;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+
+public class LinkPreviewErrorView extends LinearLayout {
+    @BindView(R.id.view_link_preview_error_icon) ImageView icon;
+    @BindView(R.id.view_link_preview_error_text) TextView textView;
+
+    public interface Callback {
+        void onAddToList();
+        void onDismiss();
+    }
+
+    @Nullable private Callback callback;
+    @NonNull private OverlayViewAddToListCallback addToListCallback = new 
OverlayViewAddToListCallback();
+    @NonNull private OverlayViewDismissCallback dismissCallback = new 
OverlayViewDismissCallback();
+
+    public LinkPreviewErrorView(Context context) {
+        this(context, null);
+    }
+
+    public LinkPreviewErrorView(Context context, @Nullable AttributeSet attrs) 
{
+        this(context, attrs, 0);
+    }
+
+    public LinkPreviewErrorView(Context context, @Nullable AttributeSet attrs, 
int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        inflate(context, R.layout.view_link_preview_error, this);
+        ButterKnife.bind(this);
+    }
+
+    public void setCallback(@Nullable Callback callback) {
+        this.callback = callback;
+    }
+
+    @NonNull OverlayViewAddToListCallback addToListCallback() {
+        return addToListCallback;
+    }
+
+    @NonNull OverlayViewDismissCallback dismissCallback() {
+        return dismissCallback;
+    }
+
+    public void setError(@Nullable Throwable caught) {
+        LinkPreviewErrorType errorType = 
LinkPreviewErrorType.get(getContext(), caught);
+        icon.setImageDrawable(ContextCompat.getDrawable(getContext(), 
errorType.icon()));
+
+        // HACK: This message is delivered in one piece in a link preview but 
as a separate primary
+        // message and subtitle in the full page view.  Figure out a good way 
to handle this.
+        if (errorType == LinkPreviewErrorType.OFFLINE) {
+            String message = 
getResources().getString(R.string.page_offline_notice_cannot_load_while_offline)
+                    + " " + 
getResources().getString(R.string.page_offline_notice_add_to_reading_list);
+            textView.setText(message);
+        } else {
+            
textView.setText(getContext().getResources().getString(errorType.text()));
+        }
+    }
+
+    private class OverlayViewAddToListCallback implements 
LinkPreviewOverlayView.Callback {
+        @Override public void onPrimaryClick() {
+            if (callback != null) {
+                callback.onAddToList();
+            }
+        }
+
+        @Override public void onSecondaryClick() {
+        }
+    }
+
+    private class OverlayViewDismissCallback implements 
LinkPreviewOverlayView.Callback {
+        @Override public void onPrimaryClick() {
+            if (callback != null) {
+                callback.onDismiss();
+            }
+        }
+
+        @Override public void onSecondaryClick() {
+        }
+    }
+}
diff --git a/app/src/main/java/org/wikipedia/util/ThrowableUtil.java 
b/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
index e8881f7..447bc30 100644
--- a/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
+++ b/app/src/main/java/org/wikipedia/util/ThrowableUtil.java
@@ -11,6 +11,7 @@
 import org.wikipedia.R;
 import org.wikipedia.createaccount.CreateAccountException;
 import org.wikipedia.dataclient.mwapi.MwException;
+import org.wikipedia.dataclient.okhttp.HttpStatusException;
 import org.wikipedia.login.LoginClient;
 
 import java.net.UnknownHostException;
@@ -53,8 +54,10 @@
                                   getApiErrorMessage(context, (ApiException) 
inner));
         } else if (isNetworkError(e)) {
             result = new 
AppError(context.getString(R.string.error_network_error),
-                                  
context.getString(R.string.format_error_server_message,
-                                      inner.getLocalizedMessage()));
+                    context.getString(R.string.format_error_server_message,
+                            inner.getLocalizedMessage()));
+        } else if (e instanceof HttpStatusException) {
+            result = new AppError(e.getMessage(), 
Integer.toString(((HttpStatusException) e).code()));
         } else if (inner instanceof LoginClient.LoginFailedException
                 || inner instanceof CreateAccountException
                 || inner instanceof MwException) {
@@ -78,6 +81,10 @@
         return e.getDetail() != null && e.getDetail().contains("404");
     }
 
+    public static boolean isOffline(@NonNull Throwable caught) {
+        return caught instanceof UnknownHostException;
+    }
+
     private static boolean isNetworkError(@NonNull Throwable e) {
         return ThrowableUtil.throwableContainsException(e, 
HttpRequest.HttpRequestException.class)
                 || ThrowableUtil.throwableContainsException(e, 
UnknownHostException.class)
diff --git a/app/src/main/res/drawable/ic_portable_wifi_off_black_24px.xml 
b/app/src/main/res/drawable/ic_portable_wifi_off_black_24px.xml
new file mode 100644
index 0000000..98b6999
--- /dev/null
+++ b/app/src/main/res/drawable/ic_portable_wifi_off_black_24px.xml
@@ -0,0 +1,5 @@
+<vector android:autoMirrored="true" android:height="24dp"
+    android:viewportHeight="24.0" android:viewportWidth="24.0"
+    android:width="24dp" 
xmlns:android="http://schemas.android.com/apk/res/android";>
+    <path android:fillColor="#000000" 
android:pathData="M17.56,14.24c0.28,-0.69 0.44,-1.45 0.44,-2.24 0,-3.31 
-2.69,-6 -6,-6 -0.79,0 -1.55,0.16 -2.24,0.44l1.62,1.62c0.2,-0.03 0.41,-0.06 
0.62,-0.06 2.21,0 4,1.79 4,4 0,0.21 -0.02,0.42 
-0.05,0.63l1.61,1.61zM12,4c4.42,0 8,3.58 8,8 0,1.35 -0.35,2.62 
-0.95,3.74l1.47,1.47C21.46,15.69 22,13.91 22,12c0,-5.52 -4.48,-10 -10,-10 
-1.91,0 -3.69,0.55 -5.21,1.47l1.46,1.46C9.37,4.34 10.65,4 
12,4zM3.27,2.5L2,3.77l2.1,2.1C2.79,7.57 2,9.69 2,12c0,3.7 2.01,6.92 
4.99,8.65l1,-1.73C5.61,17.53 4,14.96 4,12c0,-1.76 0.57,-3.38 
1.53,-4.69l1.43,1.44C6.36,9.68 6,10.8 6,12c0,2.22 1.21,4.15 
3,5.19l1,-1.74c-1.19,-0.7 -2,-1.97 -2,-3.45 0,-0.65 0.17,-1.25 
0.44,-1.79l1.58,1.58L10,12c0,1.1 0.9,2 2,2l0.21,-0.02 0.01,0.01 
7.51,7.51L21,20.23 4.27,3.5l-1,-1z"/>
+</vector>
diff --git a/app/src/main/res/layout/dialog_link_preview.xml 
b/app/src/main/res/layout/dialog_link_preview.xml
index 17863f4..9cb7f8a 100755
--- a/app/src/main/res/layout/dialog_link_preview.xml
+++ b/app/src/main/res/layout/dialog_link_preview.xml
@@ -94,31 +94,14 @@
                 android:layout_gravity="center_horizontal" />
         </LinearLayout>
 
-        <LinearLayout
-            android:id="@+id/dialog_link_preview_offline_container"
+        <org.wikipedia.page.linkpreview.LinkPreviewErrorView
+            android:id="@+id/dialog_link_preview_error_container"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
+            android:gravity="center_horizontal"
             android:orientation="vertical"
             android:visibility="gone">
-            <ImageView
-                android:layout_width="72dp"
-                android:layout_height="72dp"
-                android:layout_margin="24dp"
-                android:layout_gravity="center_horizontal"
-                app:srcCompat="@drawable/ic_no_article"
-                android:tint="?attr/link_preview_offline_text_color"
-                android:contentDescription="@null"/>
-            <TextView
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginLeft="42dp"
-                android:layout_marginRight="42dp"
-                android:textSize="18sp"
-                android:textColor="?attr/link_preview_offline_text_color"
-                android:textAlignment="center"
-                android:lineSpacingMultiplier="1.2"
-                android:text="@string/dialog_link_preview_offline_notice"/>
-        </LinearLayout>
+        </org.wikipedia.page.linkpreview.LinkPreviewErrorView>
 
         <!-- Bottom padding for overlay button -->
         <View
diff --git a/app/src/main/res/layout/view_link_preview_error.xml 
b/app/src/main/res/layout/view_link_preview_error.xml
new file mode 100644
index 0000000..ade29d7
--- /dev/null
+++ b/app/src/main/res/layout/view_link_preview_error.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";>
+    <ImageView
+        android:id="@+id/view_link_preview_error_icon"
+        android:layout_width="72dp"
+        android:layout_height="72dp"
+        android:layout_margin="24dp"
+        android:layout_gravity="center_horizontal"
+        app:srcCompat="@drawable/ic_error_black_24dp"
+        android:tint="?attr/link_preview_offline_text_color"
+        android:contentDescription="@null"/>
+    <TextView
+        android:id="@+id/view_link_preview_error_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="42dp"
+        android:layout_marginRight="42dp"
+        android:textSize="18sp"
+        android:textColor="?attr/link_preview_offline_text_color"
+        android:gravity="center"
+        android:textAlignment="center"
+        android:lineSpacingMultiplier="1.2"
+        android:text="@string/error_message_generic"/>
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/values-ast/strings.xml 
b/app/src/main/res/values-ast/strings.xml
index c3dc0ca..f49fe41 100644
--- a/app/src/main/res/values-ast/strings.xml
+++ b/app/src/main/res/values-ast/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Testu copiáu al cartafueyu.</string>
   <string name="button_continue_to_article">Lleer el artículu</string>
   <string name="button_add_to_reading_list">Añadir a llista de 
llectura</string>
-  <string name="dialog_link_preview_offline_notice">L\'artículu nun puede 
cargase mentanto teas sin conexón. Añádelo a una llista de llectura y 
descargaráse  cuando vuelvas a coneutate.</string>
   <string name="button_get_directions">Recibir indicaciones</string>
   <string name="error_no_maps_app">Nun pudo alcontrase nenguna app qu\'ufra 
indicaciones</string>
   <string name="preference_title_show_link_previews">Amosar vistes previes de 
los enllaces</string>
diff --git a/app/src/main/res/values-bn/strings.xml 
b/app/src/main/res/values-bn/strings.xml
index 1a3aa6b..14b5882 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -226,7 +226,6 @@
   <string name="text_copied">লেখা ক্লিপবোর্ডে অনুলিপি হয়েছে।</string>
   <string name="button_continue_to_article">নিবন্ধ পড়ুন</string>
   <string name="button_add_to_reading_list">পড়ার তালিকায় যোগ করুন</string>
-  <string name="dialog_link_preview_offline_notice">অফলাইনে থাকাকালীন নিবন্ধ 
লোড করা যাবে না। একটি পড়ার তালিকায় যোগ করুন ও যখন আপনি অনলাইনে আসবেন তখন এটি 
ডাউনলোড করা হবে।</string>
   <string name="button_get_directions">দিক নির্দেশনা পান</string>
   <string name="error_no_maps_app">দিক নির্দেশনা প্রদান করে এমন কোন 
অ্যাপ্লিকেশন খুঁজে পাওয়া যায়নি।</string>
   <string name="preference_title_show_link_previews">লিঙ্ক প্রাকদর্শন 
দেখান</string>
diff --git a/app/src/main/res/values-br/strings.xml 
b/app/src/main/res/values-br/strings.xml
index 67391e8..bad6e71 100644
--- a/app/src/main/res/values-br/strings.xml
+++ b/app/src/main/res/values-br/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Testenn kopiet er golver.</string>
   <string name="button_continue_to_article">Lenn ar pennad</string>
   <string name="button_add_to_reading_list">Ouzhpennañ d\'ar roll lenn</string>
-  <string name="dialog_link_preview_offline_notice">N\'haller ket kargañ ar 
pennad pa vezit ezlinenn. E ouzhpennañ d\'ar roll lenn ha pellgarget e vo 
diwezhatoc\'h pa viot enlinenn.</string>
   <string name="button_get_directions">Kaout an tuioù</string>
   <string name="error_no_maps_app">Ne c\'haller kavout arload ebet hag a ro 
tuioù.</string>
   <string name="preference_title_show_link_previews">Diskwel alberzoù al 
liammoù</string>
diff --git a/app/src/main/res/values-cnh/strings.xml 
b/app/src/main/res/values-cnh/strings.xml
index 2a7a673..040367d 100644
--- a/app/src/main/res/values-cnh/strings.xml
+++ b/app/src/main/res/values-cnh/strings.xml
@@ -178,5 +178,4 @@
   <string name="format_error_server_message">Cakuat: \"%s\"</string>
   <string name="format_error_server_code">Code: \"%s\"</string>
   <string name="button_add_to_reading_list">Relding cazin ah telh</string>
-  <string name="dialog_link_preview_offline_notice">Hi cabia cu offline in a 
rel kho lo. Na relding cazin ah telh law, na online tikah a download te 
lai.</string>
 </resources>
diff --git a/app/src/main/res/values-de/strings.xml 
b/app/src/main/res/values-de/strings.xml
index a08ec68..a7a6bc2 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Text in die Zwischenablage kopiert.</string>
   <string name="button_continue_to_article">Artikel lesen</string>
   <string name="button_add_to_reading_list">Zur Leseliste hinzufügen</string>
-  <string name="dialog_link_preview_offline_notice">Der Artikel kann nicht 
geladen werden, während du offline bist. Füge ihn zu einer Leseliste hinzu und 
er wird heruntergeladen, sobald du wieder online bist.</string>
   <string name="button_get_directions">Richtungen abrufen</string>
   <string name="error_no_maps_app">Es konnten keine Apps gefunden werden, die 
Richtungen zur Verfügung stellen.</string>
   <string name="preference_title_show_link_previews">Vorschaubilder von Links 
anzeigen</string>
diff --git a/app/src/main/res/values-es/strings.xml 
b/app/src/main/res/values-es/strings.xml
index c5fdaf3..7c5b525 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Texto copiado en el portapapeles.</string>
   <string name="button_continue_to_article">Leer artículo</string>
   <string name="button_add_to_reading_list">Añadir a lista de lectura</string>
-  <string name="dialog_link_preview_offline_notice">El artículo no se puede 
cargar mientras estás sin conexión. Añádelo a una lista de lectura y se 
descargará cuando te conectes.</string>
   <string name="button_get_directions">Obtener indicaciones</string>
   <string name="error_no_maps_app">No se pudo encontrar ninguna aplicación que 
proporcione indicaciones.</string>
   <string name="preference_title_show_link_previews">Mostrar vistas previas de 
enlaces</string>
diff --git a/app/src/main/res/values-fa/strings.xml 
b/app/src/main/res/values-fa/strings.xml
index a1acdf2..6d898f2 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">متن در حافظهٔ موقت ذخیره شد.</string>
   <string name="button_continue_to_article">مطالعهٔ مقاله</string>
   <string name="button_add_to_reading_list">افزودن به فهرست مطالعه</string>
-  <string name="dialog_link_preview_offline_notice">در حالت آفلاین امکان 
بارگیری مقاله وجود ندارد. به فهرست مطالعه افزوده شود تا در زمانی که اینترنت در 
دسترس بود قابل مطالعه باشد.</string>
   <string name="button_get_directions">دریافت مسیر</string>
   <string name="error_no_maps_app">نمی تواند اپلیکیشنی برای یافتن جهت پیدا 
کند.</string>
   <string name="preference_title_show_link_previews">نمایش پیوند 
پیش‌نمایش‌ها</string>
diff --git a/app/src/main/res/values-fi/strings.xml 
b/app/src/main/res/values-fi/strings.xml
index e5c1e4d..ae12eec 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -224,7 +224,6 @@
   <string name="text_copied">Teksti kopioitu leikepöydälle.</string>
   <string name="button_continue_to_article">Lue artikkeli</string>
   <string name="button_add_to_reading_list">Lisää lukulistaan</string>
-  <string name="dialog_link_preview_offline_notice">Artikkelia ei voi ladata 
offline-tilassa. Lisää lukulistaan ja se tullaan lataamaan, kun olet taas 
online-tilassa.</string>
   <string name="button_get_directions">Hae reittiohjeet</string>
   <string name="error_no_maps_app">Yhtäkään reittiohjeita tarjoavaa sovellusta 
ei löytynyt</string>
   <string name="preference_title_show_link_previews">Näytä linkkien 
esikatselut</string>
diff --git a/app/src/main/res/values-fr/strings.xml 
b/app/src/main/res/values-fr/strings.xml
index b1eac3d..03bebd5 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -228,7 +228,6 @@
   <string name="text_copied">Texte copié dans le presse-papier.</string>
   <string name="button_continue_to_article">Lire l’article</string>
   <string name="button_add_to_reading_list">Ajouter à la liste de 
lecture</string>
-  <string name="dialog_link_preview_offline_notice">L’article ne peut pas être 
chargé hors connexion. Ajoutez-le à une liste de lecture et il sera téléchargé 
une fois que vous serez connecté.</string>
   <string name="button_get_directions">Obtenir les directions</string>
   <string name="error_no_maps_app">Impossible de trouver une application qui 
fournit des directions.</string>
   <string name="preference_title_show_link_previews">Afficher les aperçus de 
lien</string>
diff --git a/app/src/main/res/values-gl/strings.xml 
b/app/src/main/res/values-gl/strings.xml
index 72cffca..d254418 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">O texto copiouse no portapapeis.</string>
   <string name="button_continue_to_article">Artigo lido</string>
   <string name="button_add_to_reading_list">Engadir á lista de lectura</string>
-  <string name="dialog_link_preview_offline_notice">O artigo non se pode 
cargar mentras está sen conexión. Engádao a unha lista de lectura e 
descargarase cando estea  conectado.</string>
   <string name="button_get_directions">Obter as direccións</string>
   <string name="error_no_maps_app">Imposible atopar unha aplicación que 
proporcione as direccións.</string>
   <string name="preference_title_show_link_previews">Mostrar vistas previas de 
ligazóns</string>
diff --git a/app/src/main/res/values-hu/strings.xml 
b/app/src/main/res/values-hu/strings.xml
index b217a92..3e20ce2 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -225,7 +225,6 @@
   <string name="text_copied">Szöveg másolva a vágólapra.</string>
   <string name="button_continue_to_article">Olvasd el a cikket</string>
   <string name="button_add_to_reading_list">Hozzáadás az 
olvasólistához</string>
-  <string name="dialog_link_preview_offline_notice">Nem lehet betölteni a 
szócikket kapcsolat nélkül. Add hozzá egy olvasólistához, hogy automatikusan 
letöltődjön, amikor kapcsolódsz az internethez.</string>
   <string name="button_get_directions">Útvonalterv</string>
   <string name="error_no_maps_app">Nem található útvonaltervező 
alkalmazás.</string>
   <string name="preference_title_show_link_previews">Linkek előnézetének 
megjelenítése</string>
diff --git a/app/src/main/res/values-iw/strings.xml 
b/app/src/main/res/values-iw/strings.xml
index 3c6ea85..cbf1eb9 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">הטקסט הועתק ללוח.</string>
   <string name="button_continue_to_article">לקרוא את הערך</string>
   <string name="button_add_to_reading_list">הוספה לרשימת קריאה</string>
-  <string name="dialog_link_preview_offline_notice">אי־אפשר לטעון ערך ללא 
חיבור לרשת. אפשר להוסיף ערך לרשימת קריאה והוא ייטען ויישמר אחרי התחברות 
לרשת.</string>
   <string name="button_get_directions">לקבל כיוונים</string>
   <string name="error_no_maps_app">לא מצאתי שום אפליקציה שנותנת 
כיוונים.</string>
   <string name="preference_title_show_link_previews">תצוגה מקדימה של 
קישורים</string>
diff --git a/app/src/main/res/values-ko/strings.xml 
b/app/src/main/res/values-ko/strings.xml
index 2dff7a6..4b0d41a 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -225,7 +225,6 @@
   <string name="text_copied">텍스트가 클립보드에 복사되었습니다.</string>
   <string name="button_continue_to_article">문서 읽기</string>
   <string name="button_add_to_reading_list">읽기 목록에 추가</string>
-  <string name="dialog_link_preview_offline_notice">오프라인 상태에서는 글을 불러올 수 없습니다. 
글을 읽기 목록에 추가하면 온라인 상태일 때 다운로드됩니다.</string>
   <string name="button_get_directions">경로 얻기</string>
   <string name="error_no_maps_app">주어진 경로의 앱을 찾지 못하였습니다.</string>
   <string name="preference_title_show_link_previews">링크 미리보기 보이기</string>
diff --git a/app/src/main/res/values-mk/strings.xml 
b/app/src/main/res/values-mk/strings.xml
index 91b5864..d960614 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Текстот е ставен во меѓускладот.</string>
   <string name="button_continue_to_article">Прочитајте ја статијата</string>
   <string name="button_add_to_reading_list">Додај во список за читање</string>
-  <string name="dialog_link_preview_offline_notice">Статијата не може да се 
вчита додека не сте на линија. Додајте ја во списокот за читање за да се 
преземе кога ќе добиете линија.</string>
   <string name="button_get_directions">Дај насоки</string>
   <string name="error_no_maps_app">Не можев да најдам прилози што даваат 
насоки.</string>
   <string name="preference_title_show_link_previews">Прегледи на врски</string>
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index db76529..5ada8a8 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -348,7 +348,8 @@
   <string name="text_copied">Message shown after copying text to the system 
clipboard.</string>
   <string name="button_continue_to_article">Button to continue to the full 
article from the current link preview.</string>
   <string name="button_add_to_reading_list">Button text for adding the current 
page to a reading list.</string>
-  <string name="dialog_link_preview_offline_notice">Notice informing the user 
that the article cannot be loaded while the app is offline, and inviting the 
user to add the page to a reading list to be donwloaded when back 
online.</string>
+  <string name="page_offline_notice_cannot_load_while_offline">Message 
informing the user that an article cannot be loaded while the app is offline. 
This message is followed by page_offline_notice_add_to_reading_list.</string>
+  <string name="page_offline_notice_add_to_reading_list">Message inviting the 
user to add the requested article to a reading list to be donwloaded when the 
app is online. This message follows 
page_offline_notice_cannot_load_while_offline.</string>
   <string name="button_get_directions">Button to obtain directions to the 
location specified in the link preview.</string>
   <string name="error_no_maps_app">Error displayed when the device does not 
have any apps installed that are capable of providing directions to a 
location.</string>
   <string name="preference_title_show_link_previews">Title of the preference 
for enabling or disabling link previews.
@@ -369,6 +370,9 @@
   <string name="location_permissions_enable_action">Button label for 
requesting to turn on location permissions.</string>
   <string name="error_webview_updating">Error informing the user that the 
System WebView is being updated, meaning that the app cannot be launched right 
now, and that the user should try again in a moment.</string>
   <string name="multi_select_items_selected">Toolbar title shown when the user 
is selecting multiple items in a list. The \"%d\" symbol is replaced with the 
number of items currently selected.</string>
+  <string name="error_message_generic">Generic message informing the user that 
an error occurred</string>
+  <string name="view_link_preview_error_button_dismiss">Button label for a 
button to dismiss a link preview</string>
+  <string name="error_page_does_not_exist">Error message informing the user 
that the requested page does not exist</string>
   <string name="crash_report_dialog_title">Title of the dialog that pops up 
when the app crashes, asking user to send a report</string>
   <string name="crash_report_dialog_text">Text asking the user to send us a 
crash report</string>
   <string name="crash_report_dialog_dont_send_button">In the dialog that pops 
up when the app crashes, text for button that doesn\'t send a crash report.
diff --git a/app/src/main/res/values-ru/strings.xml 
b/app/src/main/res/values-ru/strings.xml
index 07fcbd8..3359095 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Текст скопирован в буфер обмена.</string>
   <string name="button_continue_to_article">Читать статью</string>
   <string name="button_add_to_reading_list">Добавить в список для 
чтения</string>
-  <string name="dialog_link_preview_offline_notice">Статья не может быть 
загружена при нахождении в автономном режиме. Добавьте её в список для чтения, 
и он будет загружена, как только вы окажетесь онлайн.</string>
   <string name="button_get_directions">Проложить маршрут</string>
   <string name="error_no_maps_app">Не удалось найти ни одного приложения, 
которое бы прокладывало маршрут.</string>
   <string name="preference_title_show_link_previews">Показывать предпросмотр 
ссылок</string>
diff --git a/app/src/main/res/values-sv/strings.xml 
b/app/src/main/res/values-sv/strings.xml
index 0b39aed..aff4e7b 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Texten kopierades till urklipp.</string>
   <string name="button_continue_to_article">Läs artikeln</string>
   <string name="button_add_to_reading_list">Lägg till i läslista</string>
-  <string name="dialog_link_preview_offline_notice">Artikeln kan inte läsas in 
när du är offline. Lägg till den i en läslista så kommer den laddas ned när du 
är online.</string>
   <string name="button_get_directions">Få vägbeskrivningar</string>
   <string name="error_no_maps_app">Kunde inte hitta några appar som kan ge 
vägbeskrivningar.</string>
   <string name="preference_title_show_link_previews">Visa förhandsvisning för 
länkar</string>
diff --git a/app/src/main/res/values-tr/strings.xml 
b/app/src/main/res/values-tr/strings.xml
index 0874ab3..d59928c 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Metin panoya kopyalandı.</string>
   <string name="button_continue_to_article">Maddeyi oku</string>
   <string name="button_add_to_reading_list">Okuma listesine ekle</string>
-  <string name="dialog_link_preview_offline_notice">Madde çevrimdışı olarak 
yüklenemez. Bir okuma listesine eklerseniz, çevrimiçi olduğunuzda 
indirilecektir.</string>
   <string name="button_get_directions">Yol tarifi al</string>
   <string name="error_no_maps_app">Tarif verebilecek herhangi bir uygulama 
bulunamadı.</string>
   <string name="preference_title_show_link_previews">Bağlantı ön izlemelerini 
görüntüle</string>
diff --git a/app/src/main/res/values-uk/strings.xml 
b/app/src/main/res/values-uk/strings.xml
index e531d9e..9599f08 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">Текст скопійовано в буфер обміну.</string>
   <string name="button_continue_to_article">Читати статтю</string>
   <string name="button_add_to_reading_list">Додати до списку для 
читання</string>
-  <string name="dialog_link_preview_offline_notice">Статтю не можна 
завантажити без інтернет-з\'єднання. Додайте її до списку для читання, і її 
буде завантажено, як тільки Ви знову матимете доступ до інтернету.</string>
   <string name="button_get_directions">Прокласти маршрут</string>
   <string name="error_no_maps_app">Не вдалося знайти жодної програми, яка 
прокладала б маршрут.</string>
   <string name="preference_title_show_link_previews">Показувати попередній 
перегляд посилань</string>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml 
b/app/src/main/res/values-zh-rTW/strings.xml
index 3e07f1c..f4243a0 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">文字已複製至剪貼簿。</string>
   <string name="button_continue_to_article">閱讀條目</string>
   <string name="button_add_to_reading_list">新增至閱讀清單</string>
-  <string 
name="dialog_link_preview_offline_notice">條目不能在離線時載入。若添加條目至閱讀清單可在您重新上線時下載。</string>
   <string name="button_get_directions">取得路線</string>
   <string name="error_no_maps_app">無法找到任何提供路線的應用程式。</string>
   <string name="preference_title_show_link_previews">顯示連結預覽</string>
diff --git a/app/src/main/res/values-zh/strings.xml 
b/app/src/main/res/values-zh/strings.xml
index 39a4c3b..9af5c76 100644
--- a/app/src/main/res/values-zh/strings.xml
+++ b/app/src/main/res/values-zh/strings.xml
@@ -227,7 +227,6 @@
   <string name="text_copied">文本已复制至剪贴板。</string>
   <string name="button_continue_to_article">阅读条目</string>
   <string name="button_add_to_reading_list">添加至阅读列表</string>
-  <string 
name="dialog_link_preview_offline_notice">条目不能在离线时加载。可添加到阅读列表,这样当您恢复在线时条目将自动下载。</string>
   <string name="button_get_directions">路线导航</string>
   <string name="error_no_maps_app">找不到任何提供导航的应用程序。</string>
   <string name="preference_title_show_link_previews">显示链接预览</string>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index 04ec038..859a3a1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -242,7 +242,8 @@
     <string name="text_copied">Text copied to clipboard.</string>
     <string name="button_continue_to_article">Read article</string>
     <string name="button_add_to_reading_list">Add to reading list</string>
-    <string name="dialog_link_preview_offline_notice">Article cannot be loaded 
while offline. Add to a reading list and it will be downloaded once you\'re 
back online.</string>
+    <string name="page_offline_notice_cannot_load_while_offline">Article 
cannot be loaded while offline.</string>
+    <string name="page_offline_notice_add_to_reading_list">Add the article to 
a reading list and it will be downloaded once you\'re back online.</string>
     <string name="button_get_directions">Get directions</string>
     <string name="error_no_maps_app">Could not find any apps that provide 
directions.</string>
     <string name="preference_title_show_link_previews">Show link 
previews</string>
@@ -255,6 +256,9 @@
     <string name="location_permissions_enable_action">Turn on</string>
     <string name="error_webview_updating">The Android System WebView is 
currently being updated. Please try again in a moment.</string>
     <string name="multi_select_items_selected">%d selected</string>
+    <string name="error_message_generic">An error occurred</string>
+    <string name="view_link_preview_error_button_dismiss">Dismiss</string>
+    <string name="error_page_does_not_exist">This page does not exist</string>
 
     <!-- Crash reporter -->
     <string name="crash_report_dialog_title">Sorry, app crashed last 
time</string>

-- 
To view, visit https://gerrit.wikimedia.org/r/344687
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I3b95431abb9305b191250ff527272d1869208c54
Gerrit-PatchSet: 5
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Dbrant <[email protected]>
Gerrit-Reviewer: Mholloway <[email protected]>
Gerrit-Reviewer: Niedzielski <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to