content: #!/usr/bin/python
  
  # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
  #
  # This source code is licensed under the MIT license found in the
  # LICENSE file in the root directory of this source tree.
  
  import fbchisellldbbase as fb
  import fbchisellldbviewhelpers as viewHelpers
  
  
  ACCESSIBILITY_ID = 0
  REPLACEMENT_TEXT = 1
  INPUT_TEXT = 0
  
  
  def lldbcommands():
      return [FBInputTexByAccessibilityIdCommand(), FBInputTexToFirstResponderCommand()]
  
  
  class FBInputTexByAccessibilityIdCommand(fb.FBCommand):
      def name(self):
          return "settext"
  
      def description(self):
          return "Set text on a view by accessibility id."
  
      def args(self):
          return [
              fb.FBCommandArgument(
                  arg="accessibilityId",
                  type="string",
                  help="The accessibility ID of the input view.",
              ),
              fb.FBCommandArgument(
                  arg="replacementText", type="string", help="The text to set."
              ),
          ]
  
      def run(self, arguments, options):
          self.findView(
              rootView(), arguments[ACCESSIBILITY_ID], arguments[REPLACEMENT_TEXT]
          )
  
      def findView(self, view, searchIdentifier, replacementText):
          views = subviewsOfView(view)
          for index in range(0, viewsCount(views)):
              subview = subviewAtIndex(views, index)
              self.findView(subview, searchIdentifier, replacementText)
          else:
              identifier = accessibilityIdentifier(view)
              if isEqualToString(identifier, searchIdentifier):
                  setTextInView(view, replacementText)
  
  
  class FBInputTexToFirstResponderCommand(fb.FBCommand):
      def name(self):
          return "setinput"
  
      def description(self):
          return "Input text into text field or text view that is first responder."
  
      def args(self):
          return [
              fb.FBCommandArgument(
                  arg="inputText", type="string", help="The text to input."
              )
          ]
  
      def run(self, arguments, options):
          self.findFirstResponder(rootView(), arguments[INPUT_TEXT])
  
      def findFirstResponder(self, view, replacementText):
          views = subviewsOfView(view)
          if isFirstResponder(view):
              setTextInView(view, replacementText)
          else:
              for index in range(0, viewsCount(views)):
                  subview = subviewAtIndex(views, index)
                  self.findFirstResponder(subview, replacementText)
  
  
  # Some helpers
  def rootView():
      return fb.evaluateObjectExpression("[[UIApplication sharedApplication] keyWindow]")
  
  
  def subviewsOfView(view):
      return fb.evaluateObjectExpression("[%s subviews]" % view)
  
  
  def subviewAtIndex(views, index):
      return fb.evaluateObjectExpression("[%s objectAtIndex:%i]" % (views, index))
  
  
  def viewsCount(views):
      return int(fb.evaluateExpression("(int)[%s count]" % views))
  
  
  def accessibilityIdentifier(view):
      return fb.evaluateObjectExpression("[%s accessibilityIdentifier]" % view)
  
  
  def isEqualToString(identifier, needle):
      return fb.evaluateBooleanExpression(
          '[%s isEqualToString:@"%s"]' % (identifier, needle)
      )
  
  
  def setTextInView(view, text):
      fb.evaluateObjectExpression('[%s setText:@"%s"]' % (view, text))
      viewHelpers.flushCoreAnimationTransaction()
  
  
  def isFirstResponder(view):
      return fb.evaluateBooleanExpression("[%s isFirstResponder]" % view)
  