Convert MVC intro doc to markdown

Change-Id: I8c2e1a1af2cd603b7af5fa38f150005cb9d07c66
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1546716
Reviewed-by: Theresa <[email protected]>
Reviewed-by: Ted Choc <[email protected]>
Commit-Queue: Matthew Jones <[email protected]>
Cr-Commit-Position: refs/heads/master@{#647308}
diff --git a/docs/ui/android/mvc_architecture_tutorial.md b/docs/ui/android/mvc_architecture_tutorial.md
new file mode 100644
index 0000000..f05183d
--- /dev/null
+++ b/docs/ui/android/mvc_architecture_tutorial.md
@@ -0,0 +1,120 @@
+# So, you want to do MVC...
+
+### Overview
+A full explanation of the MVC framework can be found [here](https://docs.google.com/document/d/1nP9NjTvsSMZvkR_aWRZPdy67wRINomgQ7AfEtbsIwzg). This document is intended to go over the logistics of the most basic implementation of the framework in Chrome’s codebase.
+
+For this example, we’ll be implementing a simple progress bar; a rectangle that changes length based on the loading state of the underlying webpage.
+
+#### Additional Resources
+[Testing MVC primer doc](https://docs.google.com/document/d/1Mel7f4lE_osFjnttkxu1wcUf_k9CmIzPv6oxwCw9tx4/edit#)
+
+#### File Structure
+The file structure of our component will be the following:
+* ./org/chromium/chrome/browser/simple_progress/
+  * [`SimpleProgressCoordinator.java`](#SimpleProgressCoordinator)
+  * [`SimpleProgressMediator.java`](#SimpleProgressMediator)
+  * [`SimpleProgressViewBinder.java`](#SimpleProgressViewBinder)
+  * [`SimpleProgressProperties.java`](#SimpleProgressProperties)
+  * `SimpleProgressView.java` (assuming it requires interesting logic)
+
+#### SimpleProgressCoordinator
+The class responsible for setting up the component. This should be the only public class in the component's package and is the only class with direct access to the mediator.
+
+```java
+public class SimpleProgressCoordinator {
+
+   private SimpleProgressMediator mMediator;
+
+   public SimpleProgressCoordinator (Tab tabProgressBarIsFor) {
+
+       PropertyModel model = new PropertyModel.Builder(SimpleProgressProperties.ALL_KEYS)
+               .with(SimpleProgressProperties.PROGRESS_FRACTION, 0f)
+               .with(SimpleProgressProperties.FOREGROUND_COLOR, Color.RED)
+               .build();
+
+       // This view can come from multiple places, in this case we find it in the existing
+       // view hierarchy.
+       View view = tabProgressBarIsFor.getActivity().findViewById(
+               R.id.my_simple_progress_bar);
+
+       PropertyModelChangeProcessor.create(model, view, SimpleProgressViewBinder::bind);
+
+       mMediator = new SimpleProgressMediator(model, tabProgressBarIsFor);
+   }
+
+   public void destroy() {
+       mMediator.destroy();
+   }
+}
+```
+
+#### SimpleProgressMediator
+The class that handles all of the signals coming from the outside world. External classes should never interact with this class directly.
+
+```java
+class SimpleProgressMediator extends EmptyTabObserver {
+
+   private PropertyModel mModel;
+
+   private Tab mObservedTab;
+
+   public SimpleProgressMediator(PropertyModel model, Tab tabProgressBarIsFor) {
+       mModel = model;
+       mObservedTab = tabProgressBarIsFor;
+       mObservedTab.addObserver(this);
+   }
+
+   @Override
+   public void onLoadProgressChanged(Tab tab, int progress) {
+       mModel.set(SimpleProgressProperties.PROGRESS_FRACTION, progress / 100f);
+   }
+
+   @Override
+   public void onDidChangeThemeColor(Tab tab, int color) {
+       mModel.set(SimpleProgressProperties.FOREGROUND_COLOR, color);
+   }
+
+   void destroy() {
+       // Be sure to clean up anything that needs to be (in this case, detach the tab
+       // observer).
+       mObservedTab.removeObserver(this);
+   }
+}
+```
+
+#### SimpleProgressViewBinder
+The class responsible for applying a model to a specific view. In general there is a 1:1 relationship between a type of view and its binder. Multiple binders can know how to take a single type of model and apply it to a view. The binder's method should be stateless; this is implied by the 'static' identifier.
+
+```java
+class SimpleProgressViewBinder {
+
+    public static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
+        if (SimpleProgressProperties.PROGRESS_FRACTION == propertyKey) {
+
+            // Apply width modification to 'view' here.
+
+        } else if (SimpleProgressProperties.FOREGROUND_COLOR == propertyKey) {
+
+            // Apply color modification to 'view' here.
+
+        }
+    }
+}
+```
+
+#### SimpleProgressProperties
+These are properties associated with the view the model will be applied to.
+
+```java
+class SimpleProgressProperties {
+
+    public static final WritableFloatPropertyKey PROGRESS_FRACTION =
+            new WritableFloatPropertyKey();
+
+    public static final WritableIntPropertyKey FOREGROUND_COLOR =
+            new WritableIntPropertyKey();
+
+    public static final PropertyKey[] ALL_KEYS = {PROGRESS_FRACTION, FOREGROUND_COLOR};
+}
+```
+