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

Change subject: Description editing tutorial
......................................................................


Description editing tutorial

TODO (in separate patches to follow):

* Add ViewPager position indicator

* Add view tests.

Bug: T148205
Change-Id: I67c9d0960e979929ab832323e6435c4d1ce3dd6d
---
M app/src/main/AndroidManifest.xml
M app/src/main/java/org/wikipedia/Constants.java
A 
app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialActivity.java
A 
app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialFragment.java
A app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPage.java
A 
app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPageView.java
A 
app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPagerAdapter.java
M app/src/main/java/org/wikipedia/onboarding/OnboardingStateMachine.java
M app/src/main/java/org/wikipedia/onboarding/PrefsOnboardingStateMachine.java
M app/src/main/java/org/wikipedia/page/PageFragment.java
M app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
M app/src/main/java/org/wikipedia/settings/Prefs.java
M app/src/main/java/org/wikipedia/views/GoneIfEmptyTextView.java
A app/src/main/res/drawable-hdpi/illustration_description_onboard_1.png
A app/src/main/res/drawable-hdpi/illustration_description_onboard_2.png
A app/src/main/res/drawable-mdpi/illustration_description_onboard_1.png
A app/src/main/res/drawable-mdpi/illustration_description_onboard_2.png
A app/src/main/res/drawable-xhdpi/illustration_description_onboard_1.png
A app/src/main/res/drawable-xhdpi/illustration_description_onboard_2.png
A app/src/main/res/drawable-xxhdpi/illustration_description_onboard_1.png
A app/src/main/res/drawable-xxhdpi/illustration_description_onboard_2.png
A app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_1.png
A app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_2.png
A app/src/main/res/drawable/description_edit_tutorial_background.xml
A app/src/main/res/layout/fragment_description_edit_tutorial.xml
A app/src/main/res/layout/inflate_description_edit_tutorial_page_one.xml
A app/src/main/res/layout/inflate_description_edit_tutorial_page_two.xml
A app/src/main/res/layout/view_description_edit_tutorial_page.xml
M app/src/main/res/values-qq/strings.xml
M app/src/main/res/values/attrs.xml
M app/src/main/res/values/preference_keys.xml
M app/src/main/res/values/strings.xml
M app/src/main/res/xml/developer_preferences.xml
33 files changed, 501 insertions(+), 8 deletions(-)

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



diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 0903136..9044f98 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -159,6 +159,10 @@
         <activity android:name=".descriptions.DescriptionEditHelpActivity"
             android:theme="@style/AppTheme"/>
 
+        <activity
+            android:name=".descriptions.DescriptionEditTutorialActivity"
+            android:theme="@style/PageTheme"/>
+
         <provider
                 android:authorities="${applicationId}"
                 android:name=".database.AppContentProvider"
diff --git a/app/src/main/java/org/wikipedia/Constants.java 
b/app/src/main/java/org/wikipedia/Constants.java
index 2d95471..4f9d1dc 100644
--- a/app/src/main/java/org/wikipedia/Constants.java
+++ b/app/src/main/java/org/wikipedia/Constants.java
@@ -17,6 +17,7 @@
     public static final int ACTIVITY_REQUEST_GALLERY = 52;
     public static final int ACTIVITY_REQUEST_LOGIN = 53;
     public static final int ACTIVITY_REQUEST_DESCRIPTION_EDIT_SUCCESS = 54;
+    public static final int ACTIVITY_REQUEST_DESCRIPTION_EDIT_TUTORIAL = 56;
 
     public static final String INTENT_RETURN_TO_MAIN = "returnToMain";
     public static final String INTENT_SEARCH_FROM_WIDGET = "searchFromWidget";
diff --git 
a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialActivity.java
 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialActivity.java
new file mode 100644
index 0000000..32dfb65
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialActivity.java
@@ -0,0 +1,39 @@
+package org.wikipedia.descriptions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.activity.SingleFragmentActivity;
+
+public class DescriptionEditTutorialActivity
+        extends SingleFragmentActivity<DescriptionEditTutorialFragment>
+        implements DescriptionEditTutorialFragment.Callback {
+
+    public static Intent newIntent(@NonNull Context context) {
+        return new Intent(context, DescriptionEditTutorialActivity.class);
+    }
+
+    @TargetApi(18) @Override public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        // Setting this in the manifest will not suffice since any manifest 
screenOrientation
+        // setting is overridden by the call to 
ActivityUtil.requestFullUserOrientation() in the
+        // base ActionBarActivity's onCreate().
+        setRequestedOrientation(Build.VERSION.SDK_INT >= 
Build.VERSION_CODES.JELLY_BEAN_MR2
+                ? ActivityInfo.SCREEN_ORIENTATION_USER_PORTRAIT
+                : ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+    }
+
+    @Override protected DescriptionEditTutorialFragment createFragment() {
+        return DescriptionEditTutorialFragment.newInstance();
+    }
+
+    @Override public void onStartEditingClick() {
+        setResult(RESULT_OK);
+        finish();
+    }
+}
diff --git 
a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialFragment.java
 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialFragment.java
new file mode 100644
index 0000000..be546ac
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialFragment.java
@@ -0,0 +1,84 @@
+package org.wikipedia.descriptions;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.support.v4.view.PagerAdapter;
+import android.support.v4.view.ViewPager;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.wikipedia.R;
+import org.wikipedia.activity.FragmentUtil;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.Unbinder;
+
+public class DescriptionEditTutorialFragment extends Fragment {
+    @BindView(R.id.fragment_description_edit_tutorial_view_pager) ViewPager 
viewPager;
+    private Unbinder unbinder;
+
+    private PagerAdapter adapter;
+
+    public interface Callback {
+        void onStartEditingClick();
+    }
+
+    @NonNull public static DescriptionEditTutorialFragment newInstance() {
+        return new DescriptionEditTutorialFragment();
+    }
+
+    @Override public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        adapter = new DescriptionEditTutorialPagerAdapter(new 
PageViewCallback());
+    }
+
+    @Override public View onCreateView(LayoutInflater inflater, ViewGroup 
container, Bundle savedInstanceState) {
+        super.onCreateView(inflater, container, savedInstanceState);
+        View view = 
inflater.inflate(R.layout.fragment_description_edit_tutorial, container, false);
+        unbinder = ButterKnife.bind(this, view);
+        viewPager.setAdapter(adapter);
+        return view;
+    }
+
+    @Override public void onDestroyView() {
+        viewPager.setAdapter(null);
+        unbinder.unbind();
+        unbinder = null;
+        super.onDestroyView();
+    }
+
+    @Override public void onDestroy() {
+        adapter = null;
+        super.onDestroy();
+    }
+
+    private void onStartEditingClick() {
+        if (callback() != null) {
+            callback().onStartEditingClick();
+        }
+    }
+
+    private void advancePage() {
+        int nextPageIndex = viewPager.getCurrentItem() + 1;
+        int lastPageIndex = viewPager.getAdapter().getCount() - 1;
+        viewPager.setCurrentItem(Math.min(nextPageIndex, lastPageIndex), true);
+    }
+
+    private Callback callback() {
+        return FragmentUtil.getCallback(this, 
DescriptionEditTutorialFragment.Callback.class);
+    }
+
+    private class PageViewCallback implements 
DescriptionEditTutorialPagerAdapter.Callback {
+        @Override public void onButtonClick(@NonNull 
DescriptionEditTutorialPage page) {
+            if (page.isLast()) {
+                onStartEditingClick();
+            } else {
+                advancePage();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPage.java 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPage.java
new file mode 100644
index 0000000..5c8a110
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPage.java
@@ -0,0 +1,42 @@
+package org.wikipedia.descriptions;
+
+import android.support.annotation.LayoutRes;
+import android.support.annotation.NonNull;
+
+import org.wikipedia.R;
+import org.wikipedia.model.EnumCode;
+import org.wikipedia.model.EnumCodeMap;
+
+enum DescriptionEditTutorialPage implements EnumCode {
+    PAGE_ONE(R.layout.inflate_description_edit_tutorial_page_one),
+    PAGE_TWO(R.layout.inflate_description_edit_tutorial_page_two);
+
+    private static EnumCodeMap<DescriptionEditTutorialPage> MAP
+            = new EnumCodeMap<>(DescriptionEditTutorialPage.class);
+
+    @LayoutRes private final int layout;
+
+    int getLayout() {
+        return layout;
+    }
+
+    @NonNull public static DescriptionEditTutorialPage of(int code) {
+        return MAP.get(code);
+    }
+
+    public boolean isLast() {
+        return ordinal() == size() - 1;
+    }
+
+    public static int size() {
+        return MAP.size();
+    }
+
+    @Override public int code() {
+        return ordinal();
+    }
+
+    DescriptionEditTutorialPage(@LayoutRes int layout) {
+        this.layout = layout;
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPageView.java
 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPageView.java
new file mode 100644
index 0000000..9cfe297
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPageView.java
@@ -0,0 +1,88 @@
+package org.wikipedia.descriptions;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.support.annotation.AttrRes;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.annotation.StyleRes;
+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;
+import butterknife.OnClick;
+
+public class DescriptionEditTutorialPageView extends LinearLayout {
+    interface Callback {
+        void onButtonClick(@NonNull DescriptionEditTutorialPageView view);
+    }
+
+    @BindView(R.id.view_description_edit_tutorial_page_image) ImageView 
imageView;
+    @BindView(R.id.view_description_edit_tutorial_page_primary_text) TextView 
primaryTextView;
+    @BindView(R.id.view_description_edit_tutorial_page_secondary_text) 
TextView secondaryTextView;
+    @BindView(R.id.view_description_edit_tutorial_page_tertiary_text) TextView 
tertiaryTextView;
+    @BindView(R.id.view_description_edit_tutorial_page_button) TextView button;
+
+    @Nullable private Callback callback;
+
+    public DescriptionEditTutorialPageView(Context context) {
+        super(context);
+        init(null, 0, 0);
+    }
+
+    public DescriptionEditTutorialPageView(Context context, AttributeSet 
attrs) {
+        super(context, attrs);
+        init(attrs, 0, 0);
+    }
+
+    public DescriptionEditTutorialPageView(Context context, AttributeSet 
attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(attrs, defStyleAttr, 0);
+    }
+
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public DescriptionEditTutorialPageView(Context context, AttributeSet 
attrs, int defStyleAttr, int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        init(attrs, defStyleAttr, defStyleRes);
+    }
+
+    public void setCallback(@Nullable Callback callback) {
+        this.callback = callback;
+    }
+
+    @OnClick(R.id.view_description_edit_tutorial_page_button) void 
onButtonClick() {
+        if (callback != null) {
+            callback.onButtonClick(this);
+        }
+    }
+
+    private void init(@Nullable AttributeSet attrs, @AttrRes int defStyleAttr, 
@StyleRes int defStyleRes) {
+        inflate(getContext(), R.layout.view_description_edit_tutorial_page, 
this);
+        ButterKnife.bind(this);
+        if (attrs != null) {
+            TypedArray array = getContext().obtainStyledAttributes(attrs,
+                    R.styleable.DescriptionEditTutorialPageView, defStyleAttr, 
defStyleRes);
+            Drawable image = 
array.getDrawable(R.styleable.DescriptionEditTutorialPageView_image);
+            String primaryText = 
array.getString(R.styleable.DescriptionEditTutorialPageView_primaryText);
+            String secondaryText = 
array.getString(R.styleable.DescriptionEditTutorialPageView_secondaryText);
+            String tertiaryText = 
array.getString(R.styleable.DescriptionEditTutorialPageView_tertiaryText);
+            String buttonText = 
array.getString(R.styleable.DescriptionEditTutorialPageView_buttonText);
+
+            imageView.setImageDrawable(image);
+            primaryTextView.setText(primaryText);
+            secondaryTextView.setText(secondaryText);
+            tertiaryTextView.setText(tertiaryText);
+            button.setText(buttonText);
+
+            array.recycle();
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPagerAdapter.java
 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPagerAdapter.java
new file mode 100644
index 0000000..7cae100
--- /dev/null
+++ 
b/app/src/main/java/org/wikipedia/descriptions/DescriptionEditTutorialPagerAdapter.java
@@ -0,0 +1,60 @@
+package org.wikipedia.descriptions;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.view.PagerAdapter;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+class DescriptionEditTutorialPagerAdapter extends PagerAdapter {
+    interface Callback {
+        void onButtonClick(@NonNull DescriptionEditTutorialPage page);
+    }
+
+    @Nullable private Callback callback;
+    @NonNull private final ViewCallback viewCallback = new ViewCallback();
+
+    DescriptionEditTutorialPagerAdapter(@Nullable Callback callback) {
+        this.callback = callback;
+    }
+
+    @Override public Object instantiateItem(ViewGroup container, int position) 
{
+        DescriptionEditTutorialPage page = 
DescriptionEditTutorialPage.of(position);
+        DescriptionEditTutorialPageView view = inflate(page, container);
+        view.setTag(position);
+        view.setCallback(viewCallback);
+        return view;
+    }
+
+    @NonNull public DescriptionEditTutorialPageView inflate(@NonNull 
DescriptionEditTutorialPage page,
+                                                            @NonNull ViewGroup 
parent) {
+        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+        DescriptionEditTutorialPageView view =
+                (DescriptionEditTutorialPageView) 
inflater.inflate(page.getLayout(), parent, false);
+        parent.addView(view);
+        return view;
+    }
+
+    @Override public void destroyItem(ViewGroup container, int position, 
Object object) {
+        DescriptionEditTutorialPageView view = 
((DescriptionEditTutorialPageView) object);
+        view.setCallback(null);
+        view.setTag(-1);
+    }
+
+    @Override public int getCount() {
+        return DescriptionEditTutorialPage.size();
+    }
+
+    @Override public boolean isViewFromObject(View view, Object object) {
+        return view == object;
+    }
+
+    private class ViewCallback implements 
DescriptionEditTutorialPageView.Callback {
+        @Override public void onButtonClick(@NonNull 
DescriptionEditTutorialPageView view) {
+            if (callback != null) {
+                callback.onButtonClick(DescriptionEditTutorialPage.of((int) 
view.getTag()));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/onboarding/OnboardingStateMachine.java 
b/app/src/main/java/org/wikipedia/onboarding/OnboardingStateMachine.java
index b755f1f..3ec115e 100644
--- a/app/src/main/java/org/wikipedia/onboarding/OnboardingStateMachine.java
+++ b/app/src/main/java/org/wikipedia/onboarding/OnboardingStateMachine.java
@@ -9,4 +9,6 @@
     void setShareTutorial();
     boolean isReadingListTutorialEnabled();
     void setReadingListTutorial();
+    boolean isDescriptionEditTutorialEnabled();
+    void setDescriptionEditTutorial();
 }
\ No newline at end of file
diff --git 
a/app/src/main/java/org/wikipedia/onboarding/PrefsOnboardingStateMachine.java 
b/app/src/main/java/org/wikipedia/onboarding/PrefsOnboardingStateMachine.java
index 14cc227..bbbe76b 100644
--- 
a/app/src/main/java/org/wikipedia/onboarding/PrefsOnboardingStateMachine.java
+++ 
b/app/src/main/java/org/wikipedia/onboarding/PrefsOnboardingStateMachine.java
@@ -64,6 +64,16 @@
         Prefs.setReadingListTutorialEnabled(false);
     }
 
+    @Override
+    public boolean isDescriptionEditTutorialEnabled() {
+        return Prefs.isDescriptionEditTutorialEnabled();
+    }
+
+    @Override
+    public void setDescriptionEditTutorial() {
+        Prefs.setDescriptionEditTutorialEnabled(false);
+    }
+
     private void updateTimeSinceLastTutorial() {
         millisSinceLastTutorial = System.currentTimeMillis();
     }
diff --git a/app/src/main/java/org/wikipedia/page/PageFragment.java 
b/app/src/main/java/org/wikipedia/page/PageFragment.java
index 1324def..7a1a9c1 100755
--- a/app/src/main/java/org/wikipedia/page/PageFragment.java
+++ b/app/src/main/java/org/wikipedia/page/PageFragment.java
@@ -46,10 +46,12 @@
 import org.wikipedia.bridge.CommunicationBridge;
 import org.wikipedia.concurrency.CallbackTask;
 import org.wikipedia.dataclient.WikiSite;
+import org.wikipedia.descriptions.DescriptionEditActivity;
 import org.wikipedia.edit.EditHandler;
 import org.wikipedia.history.HistoryEntry;
 import org.wikipedia.history.UpdateHistoryTask;
 import org.wikipedia.language.LangLinksActivity;
+import org.wikipedia.onboarding.PrefsOnboardingStateMachine;
 import org.wikipedia.page.action.PageActionTab;
 import org.wikipedia.page.action.PageActionToolbarHideHandler;
 import org.wikipedia.page.gallery.GalleryActivity;
@@ -87,6 +89,7 @@
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
+import static android.app.Activity.RESULT_OK;
 import static butterknife.ButterKnife.findById;
 import static org.wikipedia.util.DimenUtil.getContentTopOffset;
 import static org.wikipedia.util.DimenUtil.getContentTopOffsetPx;
@@ -700,6 +703,10 @@
             FeedbackUtil.showMessage(getActivity(), 
R.string.edit_saved_successfully);
             // and reload the page...
             loadPage(model.getTitleOriginal(), model.getCurEntry(), 
PageLoadStrategy.Cache.FALLBACK, false);
+        } else if (requestCode == 
Constants.ACTIVITY_REQUEST_DESCRIPTION_EDIT_TUTORIAL
+                && resultCode == RESULT_OK) {
+            
PrefsOnboardingStateMachine.getInstance().setDescriptionEditTutorial();
+            startActivity(DescriptionEditActivity.newIntent(getContext(), 
getTitle()));
         }
     }
 
diff --git 
a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java 
b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
index 0343c9c..fac18d5 100755
--- a/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
+++ b/app/src/main/java/org/wikipedia/page/leadimages/LeadImagesHandler.java
@@ -22,6 +22,7 @@
 import org.wikipedia.dataclient.WikiSite;
 import org.wikipedia.descriptions.DescriptionEditActivity;
 import org.wikipedia.descriptions.DescriptionEditFragment;
+import org.wikipedia.descriptions.DescriptionEditTutorialActivity;
 import org.wikipedia.page.Page;
 import org.wikipedia.page.PageFragment;
 import org.wikipedia.page.PageTitle;
@@ -32,6 +33,7 @@
 import org.wikipedia.views.FaceAndColorDetectImageView;
 import org.wikipedia.views.ObservableWebView;
 
+import static org.wikipedia.settings.Prefs.isDescriptionEditTutorialEnabled;
 import static org.wikipedia.util.DimenUtil.getContentTopOffsetPx;
 
 public class LeadImagesHandler {
@@ -241,12 +243,12 @@
         articleHeaderView.setCallback(new ArticleHeaderView.Callback() {
             @Override
             public void onDescriptionClicked() {
-                
parentFragment.startActivity(DescriptionEditActivity.newIntent(getActivity(), 
getTitle()));
+                startDescriptionEditActivity();
             }
 
             @Override
             public void onEditDescription() {
-                
parentFragment.startActivity(DescriptionEditActivity.newIntent(getActivity(), 
getTitle()));
+                startDescriptionEditActivity();
             }
 
             @Override
@@ -256,6 +258,16 @@
         });
     }
 
+    private void startDescriptionEditActivity() {
+        if (isDescriptionEditTutorialEnabled()) {
+            
parentFragment.startActivityForResult(DescriptionEditTutorialActivity.newIntent(parentFragment.getContext()),
+                    Constants.ACTIVITY_REQUEST_DESCRIPTION_EDIT_TUTORIAL);
+            return;
+        }
+
+        
parentFragment.startActivity(DescriptionEditActivity.newIntent(getActivity(), 
getTitle()));
+    }
+
     private void initWebView() {
         webView.addOnScrollChangeListener(articleHeaderView);
 
diff --git a/app/src/main/java/org/wikipedia/settings/Prefs.java 
b/app/src/main/java/org/wikipedia/settings/Prefs.java
index 0a76b42..869cfc7 100644
--- a/app/src/main/java/org/wikipedia/settings/Prefs.java
+++ b/app/src/main/java/org/wikipedia/settings/Prefs.java
@@ -479,6 +479,14 @@
         return getBoolean(R.string.preference_key_memory_leak_test, false);
     }
 
+    public static boolean isDescriptionEditTutorialEnabled() {
+        return 
getBoolean(R.string.preference_key_description_edit_tutorial_enabled, true);
+    }
+
+    public static void setDescriptionEditTutorialEnabled(boolean enabled) {
+        setBoolean(R.string.preference_key_description_edit_tutorial_enabled, 
enabled);
+    }
+
     private static boolean isDevRelease() {
         return WikipediaApp.getInstance().isDevRelease();
     }
diff --git a/app/src/main/java/org/wikipedia/views/GoneIfEmptyTextView.java 
b/app/src/main/java/org/wikipedia/views/GoneIfEmptyTextView.java
index 8edede0..d752ddd 100644
--- a/app/src/main/java/org/wikipedia/views/GoneIfEmptyTextView.java
+++ b/app/src/main/java/org/wikipedia/views/GoneIfEmptyTextView.java
@@ -7,9 +7,8 @@
 import android.text.TextWatcher;
 import android.util.AttributeSet;
 import android.view.View;
-import android.widget.TextView;
 
-public class GoneIfEmptyTextView extends TextView {
+public class GoneIfEmptyTextView extends AppTextView {
     public GoneIfEmptyTextView(Context context) {
         super(context);
         init();
diff --git 
a/app/src/main/res/drawable-hdpi/illustration_description_onboard_1.png 
b/app/src/main/res/drawable-hdpi/illustration_description_onboard_1.png
new file mode 100644
index 0000000..4d6d53c
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/illustration_description_onboard_1.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-hdpi/illustration_description_onboard_2.png 
b/app/src/main/res/drawable-hdpi/illustration_description_onboard_2.png
new file mode 100644
index 0000000..bd104b6
--- /dev/null
+++ b/app/src/main/res/drawable-hdpi/illustration_description_onboard_2.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-mdpi/illustration_description_onboard_1.png 
b/app/src/main/res/drawable-mdpi/illustration_description_onboard_1.png
new file mode 100644
index 0000000..7bdfc78
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/illustration_description_onboard_1.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-mdpi/illustration_description_onboard_2.png 
b/app/src/main/res/drawable-mdpi/illustration_description_onboard_2.png
new file mode 100644
index 0000000..0240d4f
--- /dev/null
+++ b/app/src/main/res/drawable-mdpi/illustration_description_onboard_2.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xhdpi/illustration_description_onboard_1.png 
b/app/src/main/res/drawable-xhdpi/illustration_description_onboard_1.png
new file mode 100644
index 0000000..b579880
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/illustration_description_onboard_1.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xhdpi/illustration_description_onboard_2.png 
b/app/src/main/res/drawable-xhdpi/illustration_description_onboard_2.png
new file mode 100644
index 0000000..8e35e3e
--- /dev/null
+++ b/app/src/main/res/drawable-xhdpi/illustration_description_onboard_2.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_1.png 
b/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_1.png
new file mode 100644
index 0000000..51191c1
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_1.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_2.png 
b/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_2.png
new file mode 100644
index 0000000..d67ed00
--- /dev/null
+++ b/app/src/main/res/drawable-xxhdpi/illustration_description_onboard_2.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_1.png 
b/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_1.png
new file mode 100644
index 0000000..b0224b3
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_1.png
Binary files differ
diff --git 
a/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_2.png 
b/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_2.png
new file mode 100644
index 0000000..93ab904
--- /dev/null
+++ b/app/src/main/res/drawable-xxxhdpi/illustration_description_onboard_2.png
Binary files differ
diff --git a/app/src/main/res/drawable/description_edit_tutorial_background.xml 
b/app/src/main/res/drawable/description_edit_tutorial_background.xml
new file mode 100644
index 0000000..e5ca461
--- /dev/null
+++ b/app/src/main/res/drawable/description_edit_tutorial_background.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android";
+    android:shape="rectangle">
+    <gradient
+        android:startColor="#00af89"
+        android:endColor="#3366cc"
+        android:angle="90"/>
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_description_edit_tutorial.xml 
b/app/src/main/res/layout/fragment_description_edit_tutorial.xml
new file mode 100644
index 0000000..59b4754
--- /dev/null
+++ b/app/src/main/res/layout/fragment_description_edit_tutorial.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.view.ViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    android:id="@+id/fragment_description_edit_tutorial_view_pager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" />
\ No newline at end of file
diff --git 
a/app/src/main/res/layout/inflate_description_edit_tutorial_page_one.xml 
b/app/src/main/res/layout/inflate_description_edit_tutorial_page_one.xml
new file mode 100644
index 0000000..d97b653
--- /dev/null
+++ b/app/src/main/res/layout/inflate_description_edit_tutorial_page_one.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<org.wikipedia.descriptions.DescriptionEditTutorialPageView
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@drawable/description_edit_tutorial_background"
+    app:image="@drawable/illustration_description_onboard_1"
+    app:primaryText="@string/description_edit_tutorial_title_descriptions"
+    
app:secondaryText="@string/description_edit_tutorial_title_descriptions_summary"
+    app:buttonText="@string/description_edit_tutorial_button_label_continue" />
\ No newline at end of file
diff --git 
a/app/src/main/res/layout/inflate_description_edit_tutorial_page_two.xml 
b/app/src/main/res/layout/inflate_description_edit_tutorial_page_two.xml
new file mode 100644
index 0000000..b1dc118
--- /dev/null
+++ b/app/src/main/res/layout/inflate_description_edit_tutorial_page_two.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<org.wikipedia.descriptions.DescriptionEditTutorialPageView
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:app="http://schemas.android.com/apk/res-auto";
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:background="@drawable/description_edit_tutorial_background"
+    app:image="@drawable/illustration_description_onboard_2"
+    app:primaryText="@string/description_edit_tutorial_keep_it_short"
+    
app:secondaryText="@string/description_edit_tutorial_keep_it_short_instructions"
+    app:tertiaryText="@string/description_edit_tutorial_promise"
+    
app:buttonText="@string/description_edit_tutorial_button_label_start_editing" />
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_description_edit_tutorial_page.xml 
b/app/src/main/res/layout/view_description_edit_tutorial_page.xml
new file mode 100644
index 0000000..0f6cdcf
--- /dev/null
+++ b/app/src/main/res/layout/view_description_edit_tutorial_page.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android";
+    xmlns:tools="http://schemas.android.com/tools";
+    
tools:parentTag="org.wikipedia.descriptions.DescriptionEditTutorialPageView"
+    tools:layout_width="match_parent"
+    tools:layout_height="match_parent">
+
+    <ImageView
+        android:id="@+id/view_description_edit_tutorial_page_image"
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="50"
+        android:layout_marginTop="72dp"
+        android:layout_marginLeft="45dp"
+        android:layout_marginRight="45dp"
+        android:contentDescription="@null" />
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        android:layout_weight="50"
+        android:orientation="vertical"
+        android:background="@color/light_blue"
+        android:gravity="center">
+
+        <org.wikipedia.views.AppTextView
+            android:id="@+id/view_description_edit_tutorial_page_primary_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_margin="8dp"
+            android:textColor="@android:color/black"
+            android:textSize="24sp"
+            android:fontFamily="sans-serif-medium" />
+
+        <!-- todo: decide on a policy for handling unique color values -->
+        <org.wikipedia.views.AppTextView
+            
android:id="@+id/view_description_edit_tutorial_page_secondary_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="24dp"
+            android:layout_marginRight="24dp"
+            android:textSize="16sp"
+            android:gravity="center"
+            android:textAlignment="center"
+            android:textColor="#8a000000" />
+
+        <org.wikipedia.views.AppTextView
+            android:id="@+id/view_description_edit_tutorial_page_button"
+            android:layout_width="wrap_content"
+            android:layout_height="36dp"
+            android:fontFamily="sans-serif-medium"
+            android:textAlignment="center"
+            android:layout_marginTop="28dp"
+            android:paddingLeft="17dp"
+            android:paddingRight="17dp"
+            android:textSize="14sp"
+            android:textAllCaps="true"
+            style="@style/ButtonBlue" />
+
+        <org.wikipedia.views.GoneIfEmptyTextView
+            android:id="@+id/view_description_edit_tutorial_page_tertiary_text"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/description_edit_tutorial_promise"
+            android:gravity="center"
+            android:textAlignment="center"
+            android:textSize="12sp"
+            android:textColor="#54595d" />
+
+    </LinearLayout>
+</merge>
\ No newline at end of file
diff --git a/app/src/main/res/values-qq/strings.xml 
b/app/src/main/res/values-qq/strings.xml
index f24a3e5..1b333c5 100644
--- a/app/src/main/res/values-qq/strings.xml
+++ b/app/src/main/res/values-qq/strings.xml
@@ -271,9 +271,6 @@
 Followed by {{msg-wm|Wikipedia-android-strings-alpha update notification 
text}}.</string>
   <string name="wiktionary_no_definitions_found">Message shown when a user 
requests a definition from Wiktionary but no definition is found.</string>
   <string name="alpha_update_notification_title">Title for notification when 
new alpha update is available.
-  
-  
-  
 
 Followed by {{msg-wm|Wikipedia-android-strings-alpha update notification 
text}}.</string>
   <string name="alpha_update_notification_text">Text for notification when new 
alpha update is available.
@@ -464,4 +461,11 @@
   <string name="description_edit_success_did_you_know">Heading for a tip about 
editing articles in the app
 {{Identical|Did you know}}</string>
   <string name="description_edit_success_article_edit_hint">A message 
informing the user about how to edit articles in the app.  The \"^1\" symbol is 
replaced with an edit pencil icon.</string>
+  <string name="description_edit_tutorial_title_descriptions">Heading for a 
tutorial about editing page title descriptions.</string>
+  <string name="description_edit_tutorial_title_descriptions_summary">Summary 
of what page title descriptions are for.</string>
+  <string name="description_edit_tutorial_button_label_continue">Label for a 
button the user can push to continue to the next page of the tutorial.</string>
+  <string name="description_edit_tutorial_keep_it_short">An instruction for 
the user to keep descriptions short.</string>
+  <string 
name="description_edit_tutorial_keep_it_short_instructions">Instructions for 
the description the user creates to be one line only and between two to twelve 
words.</string>
+  <string name="description_edit_tutorial_button_label_start_editing">Label 
for a button the user can push when ready to start editing.</string>
+  <string name="description_edit_tutorial_promise">A statement that the user 
promises not to misuse the feature.</string>
 </resources>
diff --git a/app/src/main/res/values/attrs.xml 
b/app/src/main/res/values/attrs.xml
index e0f9b64..c461d33 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -68,4 +68,11 @@
         <attr name="navTabViewStyle" format="reference" />
     </declare-styleable>
 
-</resources>
+    <declare-styleable name="DescriptionEditTutorialPageView">
+        <attr name="image" format="reference" />
+        <attr name="primaryText" format="string" />
+        <attr name="secondaryText" format="string" />
+        <attr name="tertiaryText" format="string" />
+        <attr name="buttonText" format="string" />
+    </declare-styleable>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/preference_keys.xml 
b/app/src/main/res/values/preference_keys.xml
index 3bb5dbd..5b4ee8b 100644
--- a/app/src/main/res/values/preference_keys.xml
+++ b/app/src/main/res/values/preference_keys.xml
@@ -49,4 +49,5 @@
     <string name="preference_key_page_last_shown">pageLastShown</string>
     <string name="preference_key_feed_hidden_cards">feedHiddenCards</string>
     <string name="preference_key_memory_leak_test">memoryLeakTest</string>
+    <string 
name="preference_key_description_edit_tutorial_enabled">descriptionEditTutorialEnabled</string>
 </resources>
diff --git a/app/src/main/res/values/strings.xml 
b/app/src/main/res/values/strings.xml
index eb74b59..95f2fc9 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -353,4 +353,14 @@
     <string name="description_edit_success_did_you_know">Did you know?</string>
     <string name="description_edit_success_article_edit_hint">You can also 
edit articles within this app. Try fixing typos and small sentences by clicking 
on the ^1 icon next time</string>
     <!-- /Description editing success -->
+
+    <!-- Description editing tutorial -->
+    <string name="description_edit_tutorial_title_descriptions">Title 
descriptions</string>
+    <string 
name="description_edit_tutorial_title_descriptions_summary">Summarizes an 
article to help readers understand the subject at a glance</string>
+    <string 
name="description_edit_tutorial_button_label_continue">Continue</string>
+    <string name="description_edit_tutorial_keep_it_short">Keep it 
short</string>
+    <string 
name="description_edit_tutorial_keep_it_short_instructions">Ideally one line, 
between two to twelve words</string>
+    <string name="description_edit_tutorial_button_label_start_editing">Start 
editing</string>
+    <string name="description_edit_tutorial_promise">By starting, I promise 
not to misuse this feature.</string>
+    <!-- /Description editing tutorial -->
 </resources>
diff --git a/app/src/main/res/xml/developer_preferences.xml 
b/app/src/main/res/xml/developer_preferences.xml
index 435b41a..522f50e 100644
--- a/app/src/main/res/xml/developer_preferences.xml
+++ b/app/src/main/res/xml/developer_preferences.xml
@@ -141,6 +141,10 @@
     <PreferenceCategory 
android:title="@string/preferences_developer_onboarding_heading">
 
         <SwitchPreferenceCompat
+            
android:key="@string/preference_key_description_edit_tutorial_enabled"
+            
android:title="@string/preference_key_description_edit_tutorial_enabled" />
+
+        <SwitchPreferenceCompat
             android:key="@string/preference_key_toc_tutorial_enabled"
             android:title="@string/preference_key_toc_tutorial_enabled" />
 

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I67c9d0960e979929ab832323e6435c4d1ce3dd6d
Gerrit-PatchSet: 14
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[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