diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj
index 7d201e7d8..0b69d73f5 100644
--- a/CrossPlatformModules.csproj
+++ b/CrossPlatformModules.csproj
@@ -277,7 +277,7 @@
- webview.xml
+ webview.xml
@@ -436,6 +436,10 @@
action-bar.d.ts
+
+
+
+
repeater.d.ts
@@ -797,7 +801,7 @@
-
+
PreserveNewest
@@ -1683,6 +1687,7 @@
+
PreserveNewest
@@ -1747,7 +1752,7 @@
False
-
+
\ No newline at end of file
diff --git a/ui/html-view/html-view-common.ts b/ui/html-view/html-view-common.ts
new file mode 100644
index 000000000..d6ad1a000
--- /dev/null
+++ b/ui/html-view/html-view-common.ts
@@ -0,0 +1,23 @@
+import definition = require("ui/html-view");
+import dependencyObservable = require("ui/core/dependency-observable");
+import proxy = require("ui/core/proxy");
+import view = require("ui/core/view");
+
+export class HtmlView extends view.View implements definition.HtmlView {
+ public static htmlProperty = new dependencyObservable.Property(
+ "html",
+ "HtmlView",
+ new proxy.PropertyMetadata(false, dependencyObservable.PropertyMetadataSettings.AffectsLayout)
+ );
+
+ constructor(options?: definition.Options) {
+ super(options);
+ }
+
+ get html(): string {
+ return this._getValue(HtmlView.htmlProperty);
+ }
+ set html(value: string) {
+ this._setValue(HtmlView.htmlProperty, value);
+ }
+}
\ No newline at end of file
diff --git a/ui/html-view/html-view.android.ts b/ui/html-view/html-view.android.ts
new file mode 100644
index 000000000..0933a041a
--- /dev/null
+++ b/ui/html-view/html-view.android.ts
@@ -0,0 +1,34 @@
+import common = require("ui/html-view/html-view-common");
+import dependencyObservable = require("ui/core/dependency-observable");
+import proxy = require("ui/core/proxy");
+import types = require("utils/types");
+
+function onHtmlPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ if (!view.android) {
+ return;
+ }
+
+ if (types.isString(data.newValue)) {
+ view.android.setText(android.text.Html.fromHtml(data.newValue));
+ }
+}
+
+// register the setNativeValue callback
+(common.HtmlView.htmlProperty.metadata).onSetNativeValue = onHtmlPropertyChanged;
+
+// merge the exports of the common file with the exports of this file
+declare var exports;
+require("utils/module-merge").merge(common, exports);
+
+export class HtmlView extends common.HtmlView {
+ private _android: android.widget.TextView;
+
+ get android(): android.widget.TextView {
+ return this._android;
+ }
+
+ public _createUI() {
+ this._android = new android.widget.TextView(this._context);
+ }
+}
\ No newline at end of file
diff --git a/ui/html-view/html-view.d.ts b/ui/html-view/html-view.d.ts
new file mode 100644
index 000000000..f44eb7328
--- /dev/null
+++ b/ui/html-view/html-view.d.ts
@@ -0,0 +1,45 @@
+/**
+ * Contains the HtmlView class, which represents a standard html view widget.
+ */
+declare module "ui/html-view" {
+ import view = require("ui/core/view");
+ import dependencyObservable = require("ui/core/dependency-observable");
+
+ /**
+ * Represents a view with html content.
+ */
+ export class HtmlView extends view.View {
+
+ /**
+ * Dependency property used to support binding operations for the html of the current HtmlView instance.
+ */
+ public static htmlProperty: dependencyObservable.Property;
+
+ constructor(options?: Options);
+
+ /**
+ * Gets the native [android widget](http://developer.android.com/reference/android/widget/TextView.html) that represents the user interface for this component. Valid only when running on Android OS.
+ */
+ android: android.widget.TextView;
+
+ /**
+ * Gets the native [UILabel](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UILabel_Class/) that represents the user interface for this component. Valid only when running on iOS.
+ */
+ ios: UILabel;
+
+ /**
+ * Gets or sets html string for the HtmlView.
+ */
+ html: string;
+ }
+
+ /**
+ * Provides a set of most common options for creating a HtmlView.
+ */
+ export interface Options extends view.Options {
+ /**
+ * Gets or sets the html content of a HtmlView.
+ */
+ html?: string;
+ }
+}
\ No newline at end of file
diff --git a/ui/html-view/html-view.ios.ts b/ui/html-view/html-view.ios.ts
new file mode 100644
index 000000000..68aba2ccd
--- /dev/null
+++ b/ui/html-view/html-view.ios.ts
@@ -0,0 +1,82 @@
+import common = require("ui/html-view/html-view-common");
+import definition = require("ui/html-view");
+import dependencyObservable = require("ui/core/dependency-observable");
+import proxy = require("ui/core/proxy");
+import utils = require("utils/utils");
+import types = require("utils/types");
+import viewModule = require("ui/core/view");
+
+function onHtmlPropertyChanged(data: dependencyObservable.PropertyChangeData) {
+ var view = data.object;
+ if (!view.android) {
+ return;
+ }
+
+ if (types.isString(data.newValue)) {
+ var htmlString = NSString.stringWithString(data.newValue);
+ var nsData = htmlString.dataUsingEncoding(NSUnicodeStringEncoding);
+ var options = NSDictionary.new();
+ options.setValueForKey(NSDocumentTypeDocumentAttribute, NSHTMLTextDocumentType);
+ view.ios.attributedText = NSAttributedString.alloc().initWithDataOptionsDocumentAttributesError(nsData, options, null);
+ }
+}
+
+// register the setNativeValue callback
+(common.HtmlView.htmlProperty.metadata).onSetNativeValue = onHtmlPropertyChanged;
+
+// merge the exports of the common file with the exports of this file
+declare var exports;
+require("utils/module-merge").merge(common, exports);
+
+export class HtmlView extends common.HtmlView {
+ private _ios: UILabel;
+
+ constructor(options?: definition.Options) {
+ super(options);
+
+ this._ios = new UILabel();
+ super._prepareNativeView(this._ios);
+ }
+
+ get ios(): UILabel {
+ return this._ios;
+ }
+
+ get _nativeView(): UILabel {
+ return this._ios;
+ }
+
+ public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
+ var nativeView = this._nativeView;
+ if (nativeView) {
+
+ var width = utils.layout.getMeasureSpecSize(widthMeasureSpec);
+ var widthMode = utils.layout.getMeasureSpecMode(widthMeasureSpec);
+
+ var height = utils.layout.getMeasureSpecSize(heightMeasureSpec);
+ var heightMode = utils.layout.getMeasureSpecMode(heightMeasureSpec);
+
+ if (widthMode === utils.layout.UNSPECIFIED) {
+ width = Number.POSITIVE_INFINITY;
+ }
+
+ if (heightMode === utils.layout.UNSPECIFIED) {
+ height = Number.POSITIVE_INFINITY;
+ }
+
+ var nativeSize = nativeView.sizeThatFits(CGSizeMake(width, height));
+ var labelWidth = nativeSize.width;
+ //if (!this.textWrap) {
+ labelWidth = Math.min(labelWidth, width);
+ //}
+
+ var measureWidth = Math.max(labelWidth, this.minWidth);
+ var measureHeight = Math.max(nativeSize.height, this.minHeight);
+
+ var widthAndState = viewModule.View.resolveSizeAndState(measureWidth, width, widthMode, 0);
+ var heightAndState = viewModule.View.resolveSizeAndState(measureHeight, height, heightMode, 0);
+
+ this.setMeasuredDimension(widthAndState, heightAndState);
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/html-view/package.json b/ui/html-view/package.json
new file mode 100644
index 000000000..69b5ab220
--- /dev/null
+++ b/ui/html-view/package.json
@@ -0,0 +1,2 @@
+{ "name" : "html-view",
+ "main" : "html-view.js" }
\ No newline at end of file