[go: nahoru, domu]

[Text Selection] Move SelectionContainer.

-- Move SelectionContainer and SelectionHandles to ui-foundation, to be
able to use Popup.

Test: ./gradlew test
Change-Id: Iaf3aa82b4e248e106838e307433374ca45c60ac9
diff --git a/ui/ui-foundation/api/0.1.0-dev01.txt b/ui/ui-foundation/api/0.1.0-dev01.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/0.1.0-dev01.txt
+++ b/ui/ui-foundation/api/0.1.0-dev01.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev01.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev01.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev01.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev01.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-foundation/api/public_plus_experimental_current.txt b/ui/ui-foundation/api/public_plus_experimental_current.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/public_plus_experimental_current.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_current.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev01.txt b/ui/ui-foundation/api/restricted_0.1.0-dev01.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev01.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev01.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index eb7f0a5..a22542a 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -196,6 +196,15 @@
     method public static void MutuallyExclusiveSetItem(boolean selected, kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> children);
   }
 
+  public final class SelectionContainerKt {
+    ctor public SelectionContainerKt();
+    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
+  }
+
+  public final class SelectionHandlesKt {
+    ctor public SelectionHandlesKt();
+  }
+
   public final class ToggleableKt {
     ctor public ToggleableKt();
     method public static void Toggleable(androidx.ui.foundation.selection.ToggleableState value = ToggleableState.Checked, kotlin.jvm.functions.Function0<kotlin.Unit>?  kotlin.jvm.functions.Function0<kotlin.Unit> children);
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionContainer.kt
similarity index 93%
rename from ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
rename to ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionContainer.kt
index c872805..e8afb64 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionContainer.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionContainer.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.foundation.selection
 
 import androidx.compose.Composable
 import androidx.compose.composer
@@ -29,6 +29,10 @@
 import androidx.ui.core.ipx
 import androidx.ui.core.px
 import androidx.ui.core.round
+import androidx.ui.core.selection.Selection
+import androidx.ui.core.selection.SelectionManager
+import androidx.ui.core.selection.SelectionMode
+import androidx.ui.core.selection.SelectionRegistrarAmbient
 import androidx.ui.text.style.TextDirection
 
 /**
@@ -119,11 +123,11 @@
                     selection.endLayoutCoordinates != null
                 ) {
                     val startOffset = manager.containerLayoutCoordinates.childToLocal(
-                        selection.startLayoutCoordinates,
+                        selection.startLayoutCoordinates!!,
                         selection.startCoordinates
                     )
                     val endOffset = manager.containerLayoutCoordinates.childToLocal(
-                        selection.endLayoutCoordinates,
+                        selection.endLayoutCoordinates!!,
                         selection.endCoordinates
                     )
                     val startAdjustedDistance =
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionHandles.kt
similarity index 96%
rename from ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
rename to ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionHandles.kt
index 30b32d7..b7df9be 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/selection/SelectionHandles.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.ui.core.selection
+package androidx.ui.foundation.selection
 
 import androidx.compose.Composable
 import androidx.compose.composer
@@ -22,6 +22,7 @@
 import androidx.compose.unaryPlus
 import androidx.ui.core.Draw
 import androidx.ui.core.px
+import androidx.ui.core.selection.Selection
 import androidx.ui.engine.geometry.Rect
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Paint
diff --git a/ui/ui-framework/api/0.1.0-dev01.txt b/ui/ui-framework/api/0.1.0-dev01.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/0.1.0-dev01.txt
+++ b/ui/ui-framework/api/0.1.0-dev01.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev01.txt b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev01.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev01.txt
+++ b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev01.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/api/public_plus_experimental_current.txt b/ui/ui-framework/api/public_plus_experimental_current.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/public_plus_experimental_current.txt
+++ b/ui/ui-framework/api/public_plus_experimental_current.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/api/restricted_0.1.0-dev01.txt b/ui/ui-framework/api/restricted_0.1.0-dev01.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/restricted_0.1.0-dev01.txt
+++ b/ui/ui-framework/api/restricted_0.1.0-dev01.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 2e726d6..0f938ce 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -273,21 +273,35 @@
     method public androidx.ui.core.LayoutCoordinates? getStartLayoutCoordinates();
   }
 
-  public final class SelectionContainerKt {
-    ctor public SelectionContainerKt();
-    method public static void SelectionContainer(androidx.ui.core.selection.Selection? selection, kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange, androidx.ui.core.selection.SelectionMode mode = SelectionMode.Vertical, kotlin.jvm.functions.Function0<kotlin.Unit> children);
-  }
-
-  public final class SelectionHandlesKt {
-    ctor public SelectionHandlesKt();
-  }
-
   public final class SelectionKt {
     ctor public SelectionKt();
   }
 
+  public final class SelectionManager implements androidx.ui.core.selection.SelectionRegistrar {
+    ctor public SelectionManager();
+    method public androidx.ui.core.PxPosition getAdjustedCoordinates(androidx.ui.core.PxPosition p);
+    method public androidx.ui.core.LayoutCoordinates getContainerLayoutCoordinates();
+    method public androidx.ui.core.selection.SelectionMode getMode();
+    method public kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> getOnSelectionChange();
+    method public androidx.ui.core.selection.Selection? getSelection();
+    method public androidx.ui.core.gesture.DragObserver handleDragObserver(boolean dragStartHandle);
+    method public void onPress(androidx.ui.core.PxPosition position);
+    method public void setContainerLayoutCoordinates(androidx.ui.core.LayoutCoordinates p);
+    method public void setMode(androidx.ui.core.selection.SelectionMode p);
+    method public void setOnSelectionChange(kotlin.jvm.functions.Function1<? super androidx.ui.core.selection.Selection,kotlin.Unit> p);
+    method public void setSelection(androidx.ui.core.selection.Selection? p);
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+    property public final androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+    property public final androidx.ui.core.selection.SelectionMode mode;
+    property public final kotlin.jvm.functions.Function1<androidx.ui.core.selection.Selection,kotlin.Unit> onSelectionChange;
+    property public final androidx.ui.core.selection.Selection? selection;
+    field public androidx.ui.core.LayoutCoordinates containerLayoutCoordinates;
+  }
+
   public final class SelectionManagerKt {
     ctor public SelectionManagerKt();
+    method public static androidx.compose.Ambient<androidx.ui.core.selection.SelectionRegistrar> getSelectionRegistrarAmbient();
   }
 
   public enum SelectionMode {
@@ -295,6 +309,15 @@
     enum_constant public static final androidx.ui.core.selection.SelectionMode Vertical;
   }
 
+  public interface SelectionRegistrar {
+    method public Object subscribe(androidx.ui.core.selection.TextSelectionHandler handler);
+    method public void unsubscribe(Object key);
+  }
+
+  public interface TextSelectionHandler {
+    method public androidx.ui.core.selection.Selection? getSelection(kotlin.Pair<androidx.ui.core.PxPosition,androidx.ui.core.PxPosition> selectionCoordinates, androidx.ui.core.LayoutCoordinates containerLayoutCoordinates, androidx.ui.core.selection.SelectionMode mode);
+  }
+
 }
 
 package androidx.ui.graphics.vector {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
index d7edee4..4af3009 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionManager.kt
@@ -22,7 +22,10 @@
 import androidx.ui.core.gesture.DragObserver
 import androidx.ui.core.px
 
-internal class SelectionManager : SelectionRegistrar {
+/**
+ * A bridge class between user interaction to the text widgets for text selection.
+ */
+class SelectionManager : SelectionRegistrar {
     /**
      * The current selection.
      */
@@ -185,5 +188,7 @@
     }
 }
 
-/** Ambient of SelectionRegistrar for SelectionManager. */
-internal val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
+/**
+ * Ambient of SelectionRegistrar for SelectionManager.
+ */
+val SelectionRegistrarAmbient = Ambient.of<SelectionRegistrar> { SelectionManager() }
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionRegistrar.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionRegistrar.kt
index 598dea6..143d8bc 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionRegistrar.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/SelectionRegistrar.kt
@@ -20,7 +20,7 @@
  *  An interface allowing a Text composable to "register" and "unregister" itself with the class
  *  implementing the interface.
  */
-internal interface SelectionRegistrar {
+interface SelectionRegistrar {
     // TODO(qqd): Replace Any with a type in future.
     fun subscribe(handler: TextSelectionHandler): Any
 
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionHandler.kt b/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionHandler.kt
index d58caf5..8673878 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionHandler.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/selection/TextSelectionHandler.kt
@@ -24,7 +24,7 @@
  * selection in a selection container as a pair, and the layout coordinates of the selection
  * container.
  */
-internal interface TextSelectionHandler {
+interface TextSelectionHandler {
     fun getSelection(
         selectionCoordinates: Pair<PxPosition, PxPosition>,
         containerLayoutCoordinates: LayoutCoordinates,
diff --git a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
index 4211daf..4b508f9 100644
--- a/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
+++ b/ui/ui-text/integration-tests/text-demos/src/main/java/androidx/ui/text/demos/ComposeText.kt
@@ -23,7 +23,6 @@
 import androidx.ui.core.Text
 import androidx.ui.core.px
 import androidx.ui.core.selection.Selection
-import androidx.ui.core.selection.SelectionContainer
 import androidx.ui.core.selection.SelectionMode
 import androidx.ui.engine.geometry.Offset
 import androidx.ui.text.style.BaselineShift
@@ -46,6 +45,7 @@
 import androidx.ui.text.style.TextOverflow
 import androidx.ui.core.Sp
 import androidx.ui.core.sp
+import androidx.ui.foundation.selection.SelectionContainer
 import androidx.ui.text.AnnotatedString
 import androidx.ui.text.LocaleList
 import androidx.ui.text.style.TextIndent