jenkins-bot has submitted this change and it was merged.

Change subject: Update deprecated APIs
......................................................................


Update deprecated APIs

Bug: T144318
Change-Id: I9cdc208f2f61c940ba6aeedb153703ca16d83a05
---
M app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
M app/src/androidTest/java/org/wikipedia/test/view/ViewTest.java
M app/src/main/java/org/wikipedia/ViewAnimations.java
M app/src/main/java/org/wikipedia/crash/hockeyapp/HockeyAppExceptionHandler.java
M app/src/main/java/org/wikipedia/editing/preview/EditPreviewFragment.java
M app/src/main/java/org/wikipedia/editing/richtext/SyntaxHighlighter.java
M app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
M app/src/main/java/org/wikipedia/editing/summaries/EditSummaryTag.java
M app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
M app/src/main/java/org/wikipedia/news/NewsFragment.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/ToCHandler.java
M 
app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
M app/src/main/java/org/wikipedia/page/gallery/GalleryActivity.java
M app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderImageView.java
M app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
M app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
M app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java
M app/src/main/java/org/wikipedia/tooltip/ToolTipUtil.java
A app/src/main/java/org/wikipedia/util/ConfigurationCompat.java
A app/src/main/java/org/wikipedia/util/ContentProviderClientCompat.java
M app/src/main/java/org/wikipedia/util/L10nUtil.java
M app/src/main/java/org/wikipedia/util/StringUtil.java
M app/src/main/java/org/wikipedia/views/DontInterceptTouchListener.java
M app/src/main/java/org/wikipedia/views/DrawableItemDecoration.java
M app/src/main/java/org/wikipedia/views/FaceAndColorDetectImageView.java
M app/src/test/java/org/wikipedia/page/NamespaceTest.java
M app/src/test/java/org/wikipedia/zero/ZeroConfigTypeAdapterTest.java
28 files changed, 180 insertions(+), 155 deletions(-)

Approvals:
  Mholloway: Looks good to me, but someone else must approve
  Dbrant: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java 
b/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
index 0a9a15f..9b7df81 100644
--- a/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
+++ b/app/src/androidTest/java/org/wikipedia/test/TranslationTests.java
@@ -11,6 +11,7 @@
 import org.junit.Test;
 import org.wikipedia.R;
 import org.wikipedia.model.BaseModel;
+import org.wikipedia.util.ConfigurationCompat;
 import org.wikipedia.util.log.L;
 
 import java.lang.reflect.Field;
@@ -114,7 +115,7 @@
         Locale.setDefault(myLocale);
         DisplayMetrics dm = getResources().getDisplayMetrics();
         Configuration conf = getResources().getConfiguration();
-        conf.locale = myLocale;
+        ConfigurationCompat.setLocale(conf, myLocale);
         getResources().updateConfiguration(conf, dm);
     }
 
diff --git a/app/src/androidTest/java/org/wikipedia/test/view/ViewTest.java 
b/app/src/androidTest/java/org/wikipedia/test/view/ViewTest.java
index 3373afc..bfe0b0b 100644
--- a/app/src/androidTest/java/org/wikipedia/test/view/ViewTest.java
+++ b/app/src/androidTest/java/org/wikipedia/test/view/ViewTest.java
@@ -12,7 +12,6 @@
 import android.support.annotation.StringRes;
 import android.support.test.InstrumentationRegistry;
 import android.support.v4.text.TextUtilsCompat;
-import android.support.v4.view.ViewCompat;
 import android.support.v7.view.ContextThemeWrapper;
 import android.view.View;
 import android.widget.TextView;
@@ -83,7 +82,7 @@
     protected void snap(@NonNull View subject, @Nullable String... dataPoints) 
{
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
             int rtl = layoutDirection == LayoutDirection.RTL
-                    ? ViewCompat.LAYOUT_DIRECTION_RTL
+                    ? View.LAYOUT_DIRECTION_RTL
                     : TextUtilsCompat.getLayoutDirectionFromLocale(locale);
             //noinspection WrongConstant
             subject.setLayoutDirection(rtl);
diff --git a/app/src/main/java/org/wikipedia/ViewAnimations.java 
b/app/src/main/java/org/wikipedia/ViewAnimations.java
index 652ad32..731813d 100644
--- a/app/src/main/java/org/wikipedia/ViewAnimations.java
+++ b/app/src/main/java/org/wikipedia/ViewAnimations.java
@@ -1,12 +1,10 @@
 package org.wikipedia;
 
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
 import android.content.res.Resources;
-import android.support.v4.view.ViewCompat;
-import android.support.v4.view.ViewPropertyAnimatorListener;
-import android.support.v4.view.ViewPropertyAnimatorListenerAdapter;
+import android.support.annotation.Nullable;
 import android.view.View;
-
-import static android.support.v4.view.ViewCompat.animate;
 
 /**
  * Contains convenient methods for performing various animations on Views.
@@ -27,7 +25,7 @@
      * @param curView The view that is currently visible
      * @param newView The new view that should be faded in
      */
-    public static void crossFade(final View curView, final View newView) {
+    public static void crossFade(View curView, View newView) {
         fadeIn(newView);
         fadeOut(curView);
     }
@@ -38,7 +36,7 @@
      * @param newView The new view that should be faded in
      * @param runOnComplete Optional Runnable to be run when the animation is 
complete (may be null).
      */
-    public static void crossFade(final View curView, final View newView, final 
Runnable runOnComplete) {
+    public static void crossFade(View curView, View newView, Runnable 
runOnComplete) {
         fadeIn(newView);
         fadeOut(curView, runOnComplete);
     }
@@ -47,7 +45,7 @@
      * Fades in a view.
      * @param view The currently invisible view to be faded in
      */
-    public static void fadeIn(final View view) {
+    public static void fadeIn(View view) {
         fadeIn(view, null);
     }
 
@@ -56,23 +54,15 @@
      * @param view The currently invisible view to be faded in
      * @param runOnComplete Optional Runnable to be run when the animation is 
complete (may be null).
      */
-    public static void fadeIn(View view, final Runnable runOnComplete) {
-        ViewCompat.setAlpha(view, 0f);
+    public static void fadeIn(View view, @Nullable final Runnable 
runOnComplete) {
+        view.setAlpha(0);
         view.setVisibility(View.VISIBLE);
-        animate(view)
-                .alpha(1.0f)
+        view.animate()
+                .alpha(1)
                 .setDuration(MEDIUM_ANIMATION_DURATION)
-                .setListener(new ViewPropertyAnimatorListenerAdapter() {
-                    private boolean wasCanceled = false;
-
-                    @Override
-                    public void onAnimationCancel(View view) {
-                        wasCanceled = true;
-                    }
-
-                    @Override
-                    public void onAnimationEnd(View view) {
-                        if (!wasCanceled) {
+                .setListener(new CancelStateAnimatorListenerAdapter() {
+                    @Override public void onAnimationEnd(Animator animation) {
+                        if (!canceled()) {
                             if (runOnComplete != null) {
                                 runOnComplete.run();
                             }
@@ -96,82 +86,21 @@
      * @param runOnComplete Optional Runnable to be run when the animation is 
complete (may be null).
      */
     public static void fadeOut(final View view, final Runnable runOnComplete) {
-        animate(view)
-                .alpha(0f)
+        view.animate().cancel();
+        view.animate()
+                .alpha(0)
                 .setDuration(MEDIUM_ANIMATION_DURATION)
-                .setListener(new ViewPropertyAnimatorListenerAdapter() {
-                    private boolean wasCanceled = false;
-
-                    @Override
-                    public void onAnimationCancel(View view) {
-                        wasCanceled = true;
-                    }
-
-                    @Override
-                    public void onAnimationEnd(View view) {
-                        if (!wasCanceled) {
+                .setListener(new CancelStateAnimatorListenerAdapter() {
+                    @Override public void onAnimationEnd(Animator animation) {
+                        if (!canceled()) {
                             // Detect if we got canceled, and if so DON'T 
hide...
                             // There's another animation now pushing the alpha 
back up
                             view.setVisibility(View.GONE);
-                            ViewCompat.setAlpha(view, 1.0f);
+                            view.setAlpha(1);
                             if (runOnComplete != null) {
                                 runOnComplete.run();
                             }
                         }
-                    }
-                })
-                .start();
-    }
-
-    /**
-     * Slides a view back in (after being slid to the left or right), and 
makes it VISIBLE again.
-     * @param view The view to slide in
-     * @param listener Listener for receiving animation events (may be null)
-     */
-    public static void slideIn(View view, ViewPropertyAnimatorListener 
listener) {
-        animate(view)
-                .translationX(0)
-                .setDuration(SHORT_ANIMATION_DURATION)
-                .setListener(listener != null ? listener : new 
ViewPropertyAnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationStart(View view) {
-                        view.setVisibility(View.VISIBLE);
-                    }
-                })
-                .start();
-    }
-
-    /**
-     * Slides a view out to the left (and makes it GONE).
-     * @param view The view to slide out
-     * @param listener Listener for receiving animation events (may be null)
-     */
-    public static void slideOutLeft(View view, ViewPropertyAnimatorListener 
listener) {
-        animate(view)
-                .translationX(-view.getWidth())
-                .setDuration(SHORT_ANIMATION_DURATION)
-                .setListener(listener != null ? listener : new 
ViewPropertyAnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(View view) {
-                        view.setVisibility(View.GONE);
-                    }
-                })
-                .start();
-    }
-
-    /**
-     * Slides a view out to the right (and makes it GONE).
-     * @param view The view to slide out
-     * @param listener Listener for receiving animation events (may be null)
-     */
-    public static void slideOutRight(View view, ViewPropertyAnimatorListener 
listener) {
-        animate(view)
-                .translationX(view.getWidth())
-                .setDuration(SHORT_ANIMATION_DURATION)
-                .setListener(listener != null ? listener : new 
ViewPropertyAnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationEnd(View view) {
-                        view.setVisibility(View.GONE);
                     }
                 })
                 .start();
@@ -187,21 +116,19 @@
      */
     public static void ensureTranslationY(View view, int translation) {
         if (view.getTranslationY() != translation) {
-            
animate(view).translationY(translation).setDuration(SHORT_ANIMATION_DURATION).start();
+            
view.animate().translationY(translation).setDuration(SHORT_ANIMATION_DURATION).start();
         }
     }
 
-    /**
-     * Ensures that the translationX of a particular view is the given value.
-     *
-     * If it isn't the current value, then it performs a short animation to 
make it so.
-     *
-     * @param view The view to translate
-     * @param translation The value to ensure it is translated by
-     */
-    public static void ensureTranslationX(View view, int translation) {
-        if (view.getTranslationX() != translation) {
-            
animate(view).translationX(translation).setDuration(SHORT_ANIMATION_DURATION).start();
+    private static class CancelStateAnimatorListenerAdapter extends 
AnimatorListenerAdapter {
+        private boolean canceled;
+
+        @Override public void onAnimationCancel(Animator animation) {
+            canceled = true;
+        }
+
+        protected boolean canceled() {
+            return canceled;
         }
     }
-}
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/crash/hockeyapp/HockeyAppExceptionHandler.java
 
b/app/src/main/java/org/wikipedia/crash/hockeyapp/HockeyAppExceptionHandler.java
index 11bcfcb..4bd0806 100644
--- 
a/app/src/main/java/org/wikipedia/crash/hockeyapp/HockeyAppExceptionHandler.java
+++ 
b/app/src/main/java/org/wikipedia/crash/hockeyapp/HockeyAppExceptionHandler.java
@@ -39,7 +39,7 @@
             // Always call the default handler instead
             defaultExceptionHandler.uncaughtException(thread, exception);
         } else {
-            saveException(exception, listener);
+            saveException(exception, null, listener);
 
             if (!ignoreDefaultHandler) {
                 defaultExceptionHandler.uncaughtException(thread, exception);
diff --git 
a/app/src/main/java/org/wikipedia/editing/preview/EditPreviewFragment.java 
b/app/src/main/java/org/wikipedia/editing/preview/EditPreviewFragment.java
index f4a3c5f..2d278da 100644
--- a/app/src/main/java/org/wikipedia/editing/preview/EditPreviewFragment.java
+++ b/app/src/main/java/org/wikipedia/editing/preview/EditPreviewFragment.java
@@ -33,6 +33,7 @@
 import org.wikipedia.page.LinkHandler;
 import org.wikipedia.page.PageActivity;
 import org.wikipedia.page.PageTitle;
+import org.wikipedia.util.ConfigurationCompat;
 import org.wikipedia.util.L10nUtil;
 import org.wikipedia.util.UriUtil;
 import org.wikipedia.util.log.L;
@@ -94,12 +95,12 @@
         Resources oldResources = getResources();
         AssetManager assets = oldResources.getAssets();
         DisplayMetrics metrics = oldResources.getDisplayMetrics();
-        Locale oldLocale = oldResources.getConfiguration().locale;
+        Locale oldLocale = 
ConfigurationCompat.getLocale(oldResources.getConfiguration());
         Locale newLocale = new Locale(pageTitle.getWikiSite().languageCode());
         Configuration config = new 
Configuration(oldResources.getConfiguration());
         Resources tempResources = getResources();
         if (!oldLocale.getLanguage().equals(newLocale.getLanguage())) {
-            config.locale = newLocale;
+            ConfigurationCompat.setLocale(config, newLocale);
             tempResources = new Resources(assets, metrics, config);
         }
 
@@ -146,7 +147,7 @@
         with the original Locale (from above)
          */
         if (!oldLocale.getLanguage().equals(newLocale.getLanguage())) {
-            config.locale = oldLocale;
+            ConfigurationCompat.setLocale(config, oldLocale);
             new Resources(assets, metrics, config);
         }
 
@@ -437,4 +438,4 @@
         }
         super.onDetach();
     }
-}
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/editing/richtext/SyntaxHighlighter.java 
b/app/src/main/java/org/wikipedia/editing/richtext/SyntaxHighlighter.java
index 8ba8421..d5143a6 100644
--- a/app/src/main/java/org/wikipedia/editing/richtext/SyntaxHighlighter.java
+++ b/app/src/main/java/org/wikipedia/editing/richtext/SyntaxHighlighter.java
@@ -5,8 +5,11 @@
 import android.graphics.Typeface;
 import android.os.Handler;
 import android.os.Looper;
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
 import android.support.annotation.Nullable;
 import android.support.annotation.VisibleForTesting;
+import android.support.v4.content.ContextCompat;
 import android.text.Editable;
 import android.text.Spanned;
 import android.text.TextWatcher;
@@ -58,7 +61,7 @@
         syntaxRules.add(new SyntaxRule("{{", "}}", new 
SyntaxRule.SyntaxRuleStyle() {
             @Override
             public SpanExtents createSpan(int spanStart, SyntaxRule 
syntaxItem) {
-                return new 
ColorSpanEx(context.getResources().getColor(getThemedAttributeId(context, 
R.attr.syntax_highlight_template_color)),
+                return new ColorSpanEx(getColor(getThemedAttributeId(context, 
R.attr.syntax_highlight_template_color)),
                                        Color.TRANSPARENT, spanStart, 
syntaxItem);
             }
         }));
@@ -67,7 +70,7 @@
         syntaxRules.add(new SyntaxRule("[[", "]]", new 
SyntaxRule.SyntaxRuleStyle() {
             @Override
             public SpanExtents createSpan(int spanStart, SyntaxRule 
syntaxItem) {
-                return new 
ColorSpanEx(context.getResources().getColor(getThemedAttributeId(context, 
R.attr.link_color)),
+                return new ColorSpanEx(getColor(getThemedAttributeId(context, 
R.attr.link_color)),
                                                  Color.TRANSPARENT, spanStart, 
syntaxItem);
             }
         }));
@@ -76,7 +79,7 @@
         syntaxRules.add(new SyntaxRule("[", "]", new 
SyntaxRule.SyntaxRuleStyle() {
             @Override
             public SpanExtents createSpan(int spanStart, SyntaxRule 
syntaxItem) {
-                return new 
ColorSpanEx(context.getResources().getColor(getThemedAttributeId(context, 
R.attr.link_color)),
+                return new ColorSpanEx(getColor(getThemedAttributeId(context, 
R.attr.link_color)),
                                                  Color.TRANSPARENT, spanStart, 
syntaxItem);
             }
         }));
@@ -85,7 +88,7 @@
         syntaxRules.add(new SyntaxRule("<", ">", new 
SyntaxRule.SyntaxRuleStyle() {
             @Override
             public SpanExtents createSpan(int spanStart, SyntaxRule 
syntaxItem) {
-                return new 
ColorSpanEx(context.getResources().getColor(R.color.dark_green),
+                return new ColorSpanEx(getColor(R.color.dark_green),
                                                  Color.TRANSPARENT, spanStart, 
syntaxItem);
             }
         }));
@@ -308,4 +311,7 @@
         }
     }
 
-}
+    @ColorInt private int getColor(@ColorRes int id) {
+        return ContextCompat.getColor(context, id);
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java 
b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
index 00e320a..15a8987 100644
--- a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
+++ b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryHandler.java
@@ -16,6 +16,7 @@
 import org.wikipedia.WikipediaApp;
 import org.wikipedia.database.contract.EditHistoryContract;
 import org.wikipedia.page.PageTitle;
+import org.wikipedia.util.ContentProviderClientCompat;
 
 import java.util.Date;
 
@@ -55,7 +56,7 @@
                 } catch (RemoteException e) {
                     throw new RuntimeException(e);
                 } finally {
-                    client.release();
+                    ContentProviderClientCompat.close(client);
                 }
             }
         });
diff --git 
a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryTag.java 
b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryTag.java
index bbdc1de..84e5f9b 100644
--- a/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryTag.java
+++ b/app/src/main/java/org/wikipedia/editing/summaries/EditSummaryTag.java
@@ -2,6 +2,8 @@
 
 import android.content.Context;
 import android.content.res.Resources;
+import android.support.annotation.ColorInt;
+import android.support.v4.content.res.ResourcesCompat;
 import android.util.AttributeSet;
 import android.view.View;
 import android.widget.LinearLayout.LayoutParams;
@@ -75,6 +77,7 @@
 
     private void updateState() {
         setBackgroundResource(selected ? 
R.drawable.editpage_improve_tag_selected : 
R.drawable.editpage_improve_tag_unselected);
-        setTextColor(resources.getColor(selected ? android.R.color.white : 
R.color.foundation_blue));
+        @ColorInt int textColor = ResourcesCompat.getColor(resources, selected 
? android.R.color.white : R.color.foundation_blue, null);
+        setTextColor(textColor);
     }
 }
diff --git 
a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java 
b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
index 7e5c5bb..bdc409a 100644
--- a/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
+++ b/app/src/main/java/org/wikipedia/feed/continuereading/LastPageReadTask.java
@@ -13,6 +13,7 @@
 import org.wikipedia.database.contract.PageHistoryContract;
 import org.wikipedia.database.contract.PageImageHistoryContract;
 import org.wikipedia.history.HistoryEntry;
+import org.wikipedia.util.ContentProviderClientCompat;
 
 import java.util.Date;
 
@@ -61,7 +62,7 @@
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         } finally {
-            client.release();
+            ContentProviderClientCompat.close(client);
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/news/NewsFragment.java 
b/app/src/main/java/org/wikipedia/news/NewsFragment.java
index 91d3196..9aa8e13 100644
--- a/app/src/main/java/org/wikipedia/news/NewsFragment.java
+++ b/app/src/main/java/org/wikipedia/news/NewsFragment.java
@@ -5,6 +5,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -76,7 +77,7 @@
 
         ViewUtil.setTopPaddingDp(toolbar, (int) 
DimenUtil.getTranslucentStatusBarHeight(getContext()));
         ViewUtil.setBackgroundDrawable(toolbar, GradientUtil.getCubicGradient(
-                getResources().getColor(R.color.lead_gradient_start), 
Gravity.TOP));
+                ContextCompat.getColor(getContext(), 
R.color.lead_gradient_start), Gravity.TOP));
         getAppCompatActivity().setSupportActionBar(toolbar);
         
getAppCompatActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
         getAppCompatActivity().getSupportActionBar().setTitle("");
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 89403ff..fef6a92 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -11,6 +11,7 @@
 import android.support.design.widget.BottomSheetDialogFragment;
 import android.support.design.widget.TabLayout;
 import android.support.v4.app.Fragment;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.MenuItemCompat;
 import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.app.AlertDialog;
@@ -315,7 +316,7 @@
         // Explicitly set background color of the WebView (independently of 
CSS, because
         // the background may be shown momentarily while the WebView loads 
content,
         // creating a seizure-inducing effect, or at the very least, a 
migraine with aura).
-        webView.setBackgroundColor(getResources().getColor(
+        webView.setBackgroundColor(ContextCompat.getColor(getContext(),
                 getThemedAttributeId(getActivity(), 
R.attr.page_background_color)));
 
         bridge = new CommunicationBridge(webView, 
"file:///android_asset/index.html");
diff --git a/app/src/main/java/org/wikipedia/page/ToCHandler.java 
b/app/src/main/java/org/wikipedia/page/ToCHandler.java
index 4dd67f9..45e9573 100755
--- a/app/src/main/java/org/wikipedia/page/ToCHandler.java
+++ b/app/src/main/java/org/wikipedia/page/ToCHandler.java
@@ -1,6 +1,10 @@
 package org.wikipedia.page;
 
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
+import android.support.annotation.Nullable;
 import android.support.design.widget.TabLayout;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.view.Gravity;
@@ -49,6 +53,7 @@
     private final TextView headerView;
     private final PageFragment fragment;
     private ToCInteractionFunnel funnel;
+    @Nullable private DrawerLayout.DrawerListener drawerListener;
 
     /**
      * Flag to track if the drawer is closing because a link was clicked.
@@ -101,7 +106,7 @@
         funnel = new ToCInteractionFunnel(WikipediaApp.getInstance(),
                 WikipediaApp.getInstance().getWikiSite(), 0, 0);
 
-        slidingPane.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
+        drawerListener = new DrawerLayout.SimpleDrawerListener() {
             private boolean sectionRequested = false;
 
             @Override
@@ -134,7 +139,8 @@
                     sectionRequested = true;
                 }
             }
-        });
+        };
+        slidingPane.addDrawerListener(drawerListener); // todo: remove what 
was added
     }
 
     public void scrollToSection(String sectionAnchor) {
@@ -265,10 +271,10 @@
 
             if (section.getLevel() > 1) {
                 sectionHeading.setTextColor(
-                        
WikipediaApp.getInstance().getResources().getColor(getThemedAttributeId(fragment.getContext(),
 R.attr.toc_subsection_text_color)));
+                        getColor(getThemedAttributeId(fragment.getContext(), 
R.attr.toc_subsection_text_color)));
             } else {
                 sectionHeading.setTextColor(
-                        
WikipediaApp.getInstance().getResources().getColor(getThemedAttributeId(fragment.getContext(),
 R.attr.toc_section_text_color)));
+                        getColor(getThemedAttributeId(fragment.getContext(), 
R.attr.toc_section_text_color)));
             }
             return convertView;
         }
@@ -293,4 +299,8 @@
             L.w("ToC onboarding failed", e);
         }
     }
-}
+
+    @ColorInt private int getColor(@ColorRes int id) {
+        return ContextCompat.getColor(WikipediaApp.getInstance(), id);
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
 
b/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
index eb5217a..3adb737 100644
--- 
a/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
+++ 
b/app/src/main/java/org/wikipedia/page/bottomcontent/MainPageReadMoreTopicTask.java
@@ -10,6 +10,7 @@
 import org.wikipedia.database.contract.PageHistoryContract;
 import org.wikipedia.database.contract.PageImageHistoryContract;
 import org.wikipedia.history.HistoryEntry;
+import org.wikipedia.util.ContentProviderClientCompat;
 
 /**
  * Get a Read More topic for the main page. This is looking at the history 
table.
@@ -58,7 +59,7 @@
         } catch (RemoteException e) {
             throw new RuntimeException(e);
         } finally {
-            client.release();
+            ContentProviderClientCompat.close(client);
         }
     }
 }
diff --git a/app/src/main/java/org/wikipedia/page/gallery/GalleryActivity.java 
b/app/src/main/java/org/wikipedia/page/gallery/GalleryActivity.java
index 7ec2747..c7e3ce9 100644
--- a/app/src/main/java/org/wikipedia/page/gallery/GalleryActivity.java
+++ b/app/src/main/java/org/wikipedia/page/gallery/GalleryActivity.java
@@ -7,14 +7,16 @@
 import android.content.IntentFilter;
 import android.net.Uri;
 import android.os.Bundle;
+import android.support.annotation.ColorInt;
+import android.support.annotation.ColorRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentPagerAdapter;
 import android.support.v4.app.FragmentTransaction;
+import android.support.v4.content.ContextCompat;
 import android.support.v4.view.ViewPager;
 import android.support.v7.widget.Toolbar;
-import android.text.Html;
 import android.text.TextUtils;
 import android.util.SparseArray;
 import android.view.Gravity;
@@ -82,6 +84,7 @@
     private ImageView licenseIcon;
     private TextView creditText;
     private boolean controlsShowing = true;
+    @Nullable private ViewPager.OnPageChangeListener pageChangeListener;
 
     @Nullable private GalleryFunnel funnel;
     @Nullable protected GalleryFunnel getFunnel() {
@@ -171,7 +174,7 @@
         progressBar = (ProgressBar) findViewById(R.id.gallery_progressbar);
 
         descriptionText = (TextView) 
findViewById(R.id.gallery_description_text);
-        descriptionText.setShadowLayer(2, 1, 1, 
getResources().getColor(R.color.lead_text_shadow));
+        descriptionText.setShadowLayer(2, 1, 1, 
color(R.color.lead_text_shadow));
         descriptionText.setMovementMethod(linkMovementMethod);
 
         licenseIcon = (ImageView) findViewById(R.id.gallery_license_icon);
@@ -179,7 +182,7 @@
         licenseIcon.setOnLongClickListener(licenseLongClickListener);
 
         creditText = (TextView) findViewById(R.id.gallery_credit_text);
-        creditText.setShadowLayer(2, 1, 1, 
getResources().getColor(R.color.lead_text_shadow));
+        creditText.setShadowLayer(2, 1, 1, color(R.color.lead_text_shadow));
 
         pageTitle = getIntent().getParcelableExtra(EXTRA_PAGETITLE);
         initialFilename = getIntent().getStringExtra(EXTRA_FILENAME);
@@ -189,7 +192,8 @@
         galleryAdapter = new GalleryItemAdapter(this);
         galleryPager = (ViewPager) findViewById(R.id.gallery_item_pager);
         galleryPager.setAdapter(galleryAdapter);
-        galleryPager.setOnPageChangeListener(new GalleryPageChangeListener());
+        pageChangeListener = new GalleryPageChangeListener();
+        galleryPager.addOnPageChangeListener(pageChangeListener);
 
         funnel = new GalleryFunnel(app, wiki, 
getIntent().getIntExtra(EXTRA_SOURCE, 0));
 
@@ -255,6 +259,12 @@
                 }
             });
         }
+    }
+
+    @Override public void onDestroy() {
+        galleryPager.removeOnPageChangeListener(pageChangeListener);
+        pageChangeListener = null;
+        super.onDestroy();
     }
 
     private void loadGalleryItemFor(FeaturedImage image) {
@@ -496,11 +506,9 @@
 
         CharSequence descriptionStr = "";
         if (item.getMetadata().containsKey("ImageDescription")) {
-            descriptionStr = Html
-                    .fromHtml(item.getMetadata().get("ImageDescription"));
+            descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ImageDescription"));
         } else if (item.getMetadata().containsKey("ObjectName")) {
-            descriptionStr = Html
-                    .fromHtml(item.getMetadata().get("ObjectName"));
+            descriptionStr = 
StringUtil.fromHtml(item.getMetadata().get("ObjectName"));
         }
         if (descriptionStr.length() > 0) {
             descriptionText.setText(trim(descriptionStr));
@@ -546,7 +554,7 @@
 
     private void setBackgroundGradient(View view, int gravity) {
         ViewUtil.setBackgroundDrawable(view, GradientUtil.getCubicGradient(
-                getResources().getColor(R.color.lead_gradient_start), 
gravity));
+                color(R.color.lead_gradient_start), gravity));
     }
 
     private void initToolbar() {
@@ -623,4 +631,7 @@
         }
     }
 
+    @ColorInt private int color(@ColorRes int id) {
+        return ContextCompat.getColor(this, id);
+    }
 }
diff --git 
a/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderImageView.java 
b/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderImageView.java
index d8acc36..a35c096 100644
--- 
a/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderImageView.java
+++ 
b/app/src/main/java/org/wikipedia/page/leadimages/ArticleHeaderImageView.java
@@ -6,7 +6,9 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Build;
+import android.support.annotation.ColorInt;
 import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.Gravity;
@@ -87,8 +89,8 @@
         inflate(getContext(), R.layout.view_article_header_image, this);
         ButterKnife.bind(this);
 
-        Drawable gradient = getCubicGradient(
-                getResources().getColor(R.color.new_lead_gradient_start), 
Gravity.BOTTOM);
+        @ColorInt int color = ContextCompat.getColor(getContext(), 
R.color.new_lead_gradient_start);
+        Drawable gradient = getCubicGradient(color, Gravity.BOTTOM);
         ViewUtil.setBackgroundDrawable(gradientView, gradient);
     }
 }
diff --git a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java 
b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
index 1c8851e..117cd39 100755
--- a/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
+++ b/app/src/main/java/org/wikipedia/page/snippet/ShareHandler.java
@@ -9,6 +9,7 @@
 import android.support.annotation.IntegerRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -231,7 +232,7 @@
 
     @ColorInt
     private int getColor(@ColorRes int id) {
-        return getResources().getColor(id);
+        return ContextCompat.getColor(fragment.getContext(), id);
     }
 
     private int getInteger(@IntegerRes int id) {
diff --git 
a/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java 
b/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
index 8a775a2..5a21fa4 100644
--- a/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
+++ b/app/src/main/java/org/wikipedia/readinglist/ReadingListDetailView.java
@@ -11,6 +11,7 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.support.graphics.drawable.VectorDrawableCompat;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.widget.LinearLayoutCompat;
 import android.support.v7.widget.LinearLayoutManager;
 import android.support.v7.widget.RecyclerView;
@@ -285,7 +286,8 @@
             deleteBackgroundPaint.setStyle(Paint.Style.FILL);
             deleteBackgroundPaint.setColor(Color.RED);
             itemBackgroundPaint.setStyle(Paint.Style.FILL);
-            
itemBackgroundPaint.setColor(getResources().getColor(ResourceUtil.getThemedAttributeId(getContext(),
 R.attr.window_background_color)));
+            itemBackgroundPaint.setColor(ContextCompat.getColor(getContext(),
+                    ResourceUtil.getThemedAttributeId(getContext(), 
R.attr.window_background_color)));
         }
 
         @Override
diff --git a/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java 
b/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java
index 1fc9509..8bf98f8 100644
--- a/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java
+++ b/app/src/main/java/org/wikipedia/richtext/AudioUrlSpan.java
@@ -115,4 +115,4 @@
             stop();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/org/wikipedia/tooltip/ToolTipUtil.java 
b/app/src/main/java/org/wikipedia/tooltip/ToolTipUtil.java
index 048e396..b8bcbe8 100644
--- a/app/src/main/java/org/wikipedia/tooltip/ToolTipUtil.java
+++ b/app/src/main/java/org/wikipedia/tooltip/ToolTipUtil.java
@@ -5,6 +5,7 @@
 import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -42,7 +43,7 @@
                                    View targetView,
                                    @LayoutRes int contentLayout,
                                    ToolTip.Position position) {
-        int color = 
activity.getResources().getColor(getThemedAttributeId(activity, 
R.attr.tool_tip_default_color));
+        int color = ContextCompat.getColor(activity, 
getThemedAttributeId(activity, R.attr.tool_tip_default_color));
         showToolTip(activity, targetView, contentLayout, color, position);
     }
 
diff --git a/app/src/main/java/org/wikipedia/util/ConfigurationCompat.java 
b/app/src/main/java/org/wikipedia/util/ConfigurationCompat.java
new file mode 100644
index 0000000..9c77fb5
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/util/ConfigurationCompat.java
@@ -0,0 +1,29 @@
+package org.wikipedia.util;
+
+import android.content.res.Configuration;
+import android.os.Build;
+import android.support.annotation.NonNull;
+
+import java.util.Locale;
+
+public final class ConfigurationCompat {
+    public static void setLocale(@NonNull Configuration cfg, @NonNull Locale 
locale) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            cfg.setLocale(locale);
+        } else {
+            //noinspection deprecation
+            cfg.locale = locale;
+        }
+    }
+
+    @NonNull public static Locale getLocale(@NonNull Configuration cfg) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            return cfg.getLocales().get(0);
+        }
+        //noinspection deprecation
+        return cfg.locale;
+    }
+
+
+    private ConfigurationCompat() { }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/util/ContentProviderClientCompat.java 
b/app/src/main/java/org/wikipedia/util/ContentProviderClientCompat.java
new file mode 100644
index 0000000..ef76f1f
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/util/ContentProviderClientCompat.java
@@ -0,0 +1,18 @@
+package org.wikipedia.util;
+
+import android.content.ContentProviderClient;
+import android.os.Build;
+import android.support.annotation.NonNull;
+
+public final class ContentProviderClientCompat {
+    public static void close(@NonNull ContentProviderClient client) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            client.close();
+        } else {
+            //noinspection deprecation
+            client.release();
+        }
+    }
+
+    private ContentProviderClientCompat() { }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/wikipedia/util/L10nUtil.java 
b/app/src/main/java/org/wikipedia/util/L10nUtil.java
index 3aa3be3..4224bd1 100644
--- a/app/src/main/java/org/wikipedia/util/L10nUtil.java
+++ b/app/src/main/java/org/wikipedia/util/L10nUtil.java
@@ -152,10 +152,10 @@
      */
     private static SparseArray<String> getStringsForLocale(Locale 
targetLocale, @StringRes int[] strings) {
         Configuration config = getCurrentConfiguration();
-        Locale systemLocale = config.locale;
-        config.locale = targetLocale;
+        Locale systemLocale = ConfigurationCompat.getLocale(config);
+        ConfigurationCompat.setLocale(config, targetLocale);
         SparseArray<String> localizedStrings = getTargetStrings(strings, 
config);
-        config.locale = systemLocale;
+        ConfigurationCompat.setLocale(config, systemLocale);
         resetConfiguration(config);
         return localizedStrings;
     }
diff --git a/app/src/main/java/org/wikipedia/util/StringUtil.java 
b/app/src/main/java/org/wikipedia/util/StringUtil.java
index 597bacb..6b78830 100644
--- a/app/src/main/java/org/wikipedia/util/StringUtil.java
+++ b/app/src/main/java/org/wikipedia/util/StringUtil.java
@@ -201,6 +201,7 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
         } else {
+            //noinspection deprecation
             return Html.fromHtml(source);
         }
     }
@@ -215,6 +216,7 @@
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY, 
imageGetter, tagHandler);
         } else {
+            //noinspection deprecation
             return Html.fromHtml(source, imageGetter, tagHandler);
         }
     }
diff --git 
a/app/src/main/java/org/wikipedia/views/DontInterceptTouchListener.java 
b/app/src/main/java/org/wikipedia/views/DontInterceptTouchListener.java
index 78f288d..088d7b6 100644
--- a/app/src/main/java/org/wikipedia/views/DontInterceptTouchListener.java
+++ b/app/src/main/java/org/wikipedia/views/DontInterceptTouchListener.java
@@ -1,6 +1,5 @@
 package org.wikipedia.views;
 
-import android.support.v4.view.MotionEventCompat;
 import android.support.v7.widget.RecyclerView;
 import android.view.MotionEvent;
 import android.view.ViewConfiguration;
@@ -12,10 +11,10 @@
     private boolean disallowInterception;
 
     @Override public boolean onInterceptTouchEvent(RecyclerView view, 
MotionEvent event) {
-        int action = MotionEventCompat.getActionMasked(event);
+        int action = event.getActionMasked();
         switch(action) {
             case MotionEvent.ACTION_DOWN:
-                pointerId = MotionEventCompat.getPointerId(event, 0);
+                pointerId = event.getPointerId(0);
                 x = event.getX();
                 y = event.getY();
                 break;
@@ -24,14 +23,14 @@
                     break;
                 }
 
-                int pointerIndex = MotionEventCompat.findPointerIndex(event, 
pointerId);
+                int pointerIndex = event.findPointerIndex(pointerId);
                 if (pointerIndex < 0) {
                     view.getParent().requestDisallowInterceptTouchEvent(false);
                     break;
                 }
 
-                float dy = Math.abs(y - MotionEventCompat.getY(event, 
pointerIndex));
-                float dx = Math.abs(x - MotionEventCompat.getX(event, 
pointerIndex));
+                float dy = Math.abs(y - event.getY(pointerIndex));
+                float dx = Math.abs(x - event.getX(pointerIndex));
                 int slop = 
ViewConfiguration.get(view.getContext()).getScaledTouchSlop();
 
                 if (dx > slop) {
diff --git a/app/src/main/java/org/wikipedia/views/DrawableItemDecoration.java 
b/app/src/main/java/org/wikipedia/views/DrawableItemDecoration.java
index ffb794d..51fe4be 100644
--- a/app/src/main/java/org/wikipedia/views/DrawableItemDecoration.java
+++ b/app/src/main/java/org/wikipedia/views/DrawableItemDecoration.java
@@ -11,6 +11,7 @@
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 
+// todo: replace with DividerItemDecoration once it supports headers and 
footers
 public class DrawableItemDecoration extends RecyclerView.ItemDecoration {
     @Nullable private final Drawable drawable;
     private final boolean drawEnds;
diff --git 
a/app/src/main/java/org/wikipedia/views/FaceAndColorDetectImageView.java 
b/app/src/main/java/org/wikipedia/views/FaceAndColorDetectImageView.java
index 0e7ba67..64377c3 100644
--- a/app/src/main/java/org/wikipedia/views/FaceAndColorDetectImageView.java
+++ b/app/src/main/java/org/wikipedia/views/FaceAndColorDetectImageView.java
@@ -12,6 +12,7 @@
 import android.support.annotation.ColorInt;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.graphics.Palette;
 import android.util.AttributeSet;
 
@@ -132,7 +133,7 @@
                 Bitmap testBmp = new565ScaledBitmap(sourceBitmap);
                 Palette colorPalette = Palette.from(testBmp).generate();
                 PointF facePos = detectFace(testBmp);
-                int defaultColor = 
getContext().getResources().getColor(R.color.dark_gray);
+                int defaultColor = ContextCompat.getColor(getContext(), 
R.color.dark_gray);
                 listener.onImageLoaded(destBitmap.getHeight(), facePos, 
extractMainColor(colorPalette, defaultColor));
             } else {
                 listener.onImageFailed();
diff --git a/app/src/test/java/org/wikipedia/page/NamespaceTest.java 
b/app/src/test/java/org/wikipedia/page/NamespaceTest.java
index 733cf1d..b6d18ca 100644
--- a/app/src/test/java/org/wikipedia/page/NamespaceTest.java
+++ b/app/src/test/java/org/wikipedia/page/NamespaceTest.java
@@ -35,18 +35,22 @@
     }
 
     @Test public void testFromLegacyStringMain() {
+        //noinspection deprecation
         
assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("test"), null), 
is(MAIN));
     }
 
     @Test public void testFromLegacyStringFile() {
+        //noinspection deprecation
         assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("he"), 
"קובץ"), is(FILE));
     }
 
     @Test public void testFromLegacyStringSpecial() {
+        //noinspection deprecation
         assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("lez"), 
"Служебная"), is(SPECIAL));
     }
 
     @Test public void testFromLegacyStringTalk() {
+        //noinspection deprecation
         assertThat(Namespace.fromLegacyString(WikiSite.forLanguageCode("en"), 
"stringTalk"), is(TALK));
     }
 
@@ -84,10 +88,12 @@
     }
 
     @Test public void testToLegacyStringMain() {
+        //noinspection deprecation
         assertThat(MAIN.toLegacyString(), nullValue());
     }
 
     @Test public void testToLegacyStringNonMain() {
+        //noinspection deprecation
         assertThat(TALK.toLegacyString(), is("Talk"));
     }
 }
\ No newline at end of file
diff --git 
a/app/src/test/java/org/wikipedia/zero/ZeroConfigTypeAdapterTest.java 
b/app/src/test/java/org/wikipedia/zero/ZeroConfigTypeAdapterTest.java
index 2d66244..69592bb 100644
--- a/app/src/test/java/org/wikipedia/zero/ZeroConfigTypeAdapterTest.java
+++ b/app/src/test/java/org/wikipedia/zero/ZeroConfigTypeAdapterTest.java
@@ -17,8 +17,8 @@
 @SuppressWarnings("checkstyle:magicnumber")
 @RunWith(TestRunner.class)
 public class ZeroConfigTypeAdapterTest {
-    private static int CYAN = -16711681;
-    private static int WHITE = -1;
+    private static final int CYAN = -16711681;
+    private static final int WHITE = -1;
 
     @Test
     public void testEligible() throws Throwable {

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I9cdc208f2f61c940ba6aeedb153703ca16d83a05
Gerrit-PatchSet: 6
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Niedzielski <[email protected]>
Gerrit-Reviewer: BearND <[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