/**
     * Displays a prompt message to the user and read two values, login/password.
     *
     * <p><i>Asks user for login/password information.</i>
     *
     * <p>This method shows a question in the standard output, asking for login and password.</br>
     * <b>Method Output:</b></br> Title</br> Message</br> Login: (Wait for user input)</br>
     * Password: (Wait for user input)</br>
     *
     * <p>
     *
     * @param title The title of the iteration.
     * @param message The message to be displayed.
     * @return A {@link Pair} holding the entered login and password. The <b>first element</b> is
     *     always the <b>Login</b>, and the <b>second element</b> is always the <b>Password</b>.
     *     This method will never return null, in case of error the pair will be filled with empty
     *     strings.
     * @see ITaskMonitor#displayLoginPasswordPrompt(String, String)
     */
    public Pair<String, String> displayLoginPasswordPrompt(String title, String message) {
      String login = ""; // $NON-NLS-1$
      String password = ""; // $NON-NLS-1$
      mSdkLog.printf("\n%1$s\n%2$s", title, message);
      byte[] readBuffer = new byte[2048];
      try {
        mSdkLog.printf("\nLogin: "******"\nPassword: "******""; // $NON-NLS-1$
        password = ""; // $NON-NLS-1$
        // Just print the error to console.
        mSdkLog.printf("\nError occurred during login/pass query: %s\n", e.getMessage());
      }

      return Pair.of(login, password);
    }
  /**
   * Returns a pair of (tag-balance,bracket-balance) for the range textStart to offset.
   *
   * @param doc the document
   * @param start the offset of the starting character (inclusive)
   * @param end the offset of the ending character (exclusive)
   * @return the balance of tags and brackets
   */
  private static Pair<Integer, Integer> getBalance(IStructuredDocument doc, int start, int end) {
    // Balance of open and closing tags
    // <foo></foo> has tagBalance = 0, <foo> has tagBalance = 1
    int tagBalance = 0;
    // Balance of open and closing brackets
    // <foo attr1="value1"> has bracketBalance = 1, <foo has bracketBalance = 1
    int bracketBalance = 0;
    IStructuredDocumentRegion region = doc.getRegionAtCharacterOffset(start);

    if (region != null) {
      boolean inOpenTag = true;
      while (region != null && region.getStartOffset() < end) {
        int regionStart = region.getStartOffset();
        ITextRegionList subRegions = region.getRegions();
        for (int i = 0, n = subRegions.size(); i < n; i++) {
          ITextRegion subRegion = subRegions.get(i);
          int subRegionStart = regionStart + subRegion.getStart();
          int subRegionEnd = regionStart + subRegion.getEnd();
          if (subRegionEnd < start || subRegionStart >= end) {
            continue;
          }
          String type = subRegion.getType();

          if (XML_TAG_OPEN.equals(type)) {
            bracketBalance++;
            inOpenTag = true;
          } else if (XML_TAG_CLOSE.equals(type)) {
            bracketBalance--;
            if (inOpenTag) {
              tagBalance++;
            } else {
              tagBalance--;
            }
          } else if (XML_END_TAG_OPEN.equals(type)) {
            bracketBalance++;
            inOpenTag = false;
          } else if (XML_EMPTY_TAG_CLOSE.equals(type)) {
            bracketBalance--;
          }
        }

        region = region.getNext();
      }
    }

    return Pair.of(tagBalance, bracketBalance);
  }
示例#3
0
  /**
   * Computes the minimum SDK and target SDK versions for the project
   *
   * @param project the project to look up the versions for
   * @return a pair of (minimum SDK, target SDK) versions, never null
   */
  @NonNull
  public static Pair<Integer, Integer> computeSdkVersions(IProject project) {
    int mMinSdkVersion = 1;
    int mTargetSdkVersion = 1;

    IAbstractFile manifestFile = AndroidManifest.getManifest(new IFolderWrapper(project));
    if (manifestFile != null) {
      try {
        Object value = AndroidManifest.getMinSdkVersion(manifestFile);
        mMinSdkVersion = 1; // Default case if missing
        if (value instanceof Integer) {
          mMinSdkVersion = ((Integer) value).intValue();
        } else if (value instanceof String) {
          // handle codename, only if we can resolve it.
          if (Sdk.getCurrent() != null) {
            IAndroidTarget target =
                Sdk.getCurrent().getTargetFromHashString("android-" + value); // $NON-NLS-1$
            if (target != null) {
              // codename future API level is current api + 1
              mMinSdkVersion = target.getVersion().getApiLevel() + 1;
            }
          }
        }

        Integer i = AndroidManifest.getTargetSdkVersion(manifestFile);
        if (i == null) {
          mTargetSdkVersion = mMinSdkVersion;
        } else {
          mTargetSdkVersion = i.intValue();
        }
      } catch (XPathExpressionException e) {
        // do nothing we'll use 1 below.
      } catch (StreamException e) {
        // do nothing we'll use 1 below.
      }
    }

    return Pair.of(mMinSdkVersion, mTargetSdkVersion);
  }
示例#4
0
  private Pair<List<String>, List<String>> findViews(final boolean layoutsOnly) {
    final Set<String> customViews = new HashSet<String>();
    final Set<String> thirdPartyViews = new HashSet<String>();

    ProjectState state = Sdk.getProjectState(mProject);
    final List<IProject> libraries =
        state != null ? state.getFullLibraryProjects() : Collections.<IProject>emptyList();

    SearchRequestor requestor =
        new SearchRequestor() {
          @Override
          public void acceptSearchMatch(SearchMatch match) throws CoreException {
            // Ignore matches in comments
            if (match.isInsideDocComment()) {
              return;
            }

            Object element = match.getElement();
            if (element instanceof ResolvedBinaryType) {
              // Third party view
              ResolvedBinaryType type = (ResolvedBinaryType) element;
              IPackageFragment fragment = type.getPackageFragment();
              IPath path = fragment.getPath();
              String last = path.lastSegment();
              // Filter out android.jar stuff
              if (last.equals(FN_FRAMEWORK_LIBRARY)) {
                return;
              }
              if (!isValidView(type, layoutsOnly)) {
                return;
              }

              IProject matchProject = match.getResource().getProject();
              if (mProject == matchProject || libraries.contains(matchProject)) {
                String fqn = type.getFullyQualifiedName();
                thirdPartyViews.add(fqn);
              }
            } else if (element instanceof ResolvedSourceType) {
              // User custom view
              IProject matchProject = match.getResource().getProject();
              if (mProject == matchProject || libraries.contains(matchProject)) {
                ResolvedSourceType type = (ResolvedSourceType) element;
                if (!isValidView(type, layoutsOnly)) {
                  return;
                }
                String fqn = type.getFullyQualifiedName();
                fqn = fqn.replace('$', '.');
                customViews.add(fqn);
              }
            }
          }
        };
    try {
      IJavaProject javaProject = BaseProjectHelper.getJavaProject(mProject);
      if (javaProject != null) {
        String className = layoutsOnly ? CLASS_VIEWGROUP : CLASS_VIEW;
        IType viewType = javaProject.findType(className);
        if (viewType != null) {
          IJavaSearchScope scope = SearchEngine.createHierarchyScope(viewType);
          SearchParticipant[] participants =
              new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()};
          int matchRule = SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE;

          SearchPattern pattern =
              SearchPattern.createPattern(
                  "*", IJavaSearchConstants.CLASS, IJavaSearchConstants.IMPLEMENTORS, matchRule);
          SearchEngine engine = new SearchEngine();
          engine.search(pattern, participants, scope, requestor, new NullProgressMonitor());
        }
      }
    } catch (CoreException e) {
      AdtPlugin.log(e, null);
    }

    List<String> custom = new ArrayList<String>(customViews);
    List<String> thirdParty = new ArrayList<String>(thirdPartyViews);

    if (!layoutsOnly) {
      // Update our cached answers (unless we were filtered on only layouts)
      mCustomViews = custom;
      mThirdPartyViews = thirdParty;
    }

    return Pair.of(custom, thirdParty);
  }
  public void testDropZones() {
    List<Pair<Point, String[]>> zones = new ArrayList<Pair<Point, String[]>>();

    zones.add(
        Pair.of(
            new Point(51 + 10, 181 + 10),
            new String[] {"above=@+id/Centered", "toLeftOf=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(71 + 10, 181 + 10),
            new String[] {"above=@+id/Centered", "alignLeft=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(104 + 10, 181 + 10),
            new String[] {"above=@+id/Centered", "alignRight=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(137 + 10, 181 + 10),
            new String[] {"above=@+id/Centered", "alignRight=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(170 + 10, 181 + 10),
            new String[] {"above=@+id/Centered", "toRightOf=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(51 + 10, 279 + 10),
            new String[] {"below=@+id/Centered", "toLeftOf=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(71 + 10, 279 + 10),
            new String[] {"below=@+id/Centered", "alignLeft=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(104 + 10, 279 + 10),
            new String[] {"below=@+id/Centered", "alignLeft=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(137 + 10, 279 + 10),
            new String[] {"below=@+id/Centered", "alignRight=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(170 + 10, 279 + 10),
            new String[] {"below=@+id/Centered", "toRightOf=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(51 + 10, 201 + 10),
            new String[] {"toLeftOf=@+id/Centered", "alignTop=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(51 + 10, 227 + 10),
            new String[] {"toLeftOf=@+id/Centered", "alignTop=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(170 + 10, 201 + 10),
            new String[] {"toRightOf=@+id/Centered", "alignTop=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(51 + 10, 253 + 10),
            new String[] {"toLeftOf=@+id/Centered", "alignBottom=@+id/Centered"}));
    zones.add(
        Pair.of(
            new Point(170 + 10, 227 + 10),
            new String[] {
              "toRightOf=@+id/Centered", "alignTop=@+id/Centered", "alignBottom=@+id/Centered"
            }));
    zones.add(
        Pair.of(
            new Point(170 + 10, 253 + 10),
            new String[] {"toRightOf=@+id/Centered", "alignBottom=@+id/Centered"}));

    for (Pair<Point, String[]> zonePair : zones) {
      Point dropPoint = zonePair.getFirst();
      String[] attachments = zonePair.getSecond();
      // If we drag right into the button itself, not a valid drop position

      INode inserted =
          dragInto(
              new Rect(0, 0, 105, 80),
              new Point(120, 240),
              dropPoint,
              1,
              -1,
              attachments,

              // Bounds rectangle
              "useStyle(DROP_RECIPIENT), drawRect(Rect[0,0,240,480])",

              // Drop zones
              "useStyle(DROP_ZONE), "
                  + "drawRect(Rect[51,181,20,20]), drawRect(Rect[71,181,33,20]), "
                  + "drawRect(Rect[104,181,33,20]), drawRect(Rect[137,181,33,20]), "
                  + "drawRect(Rect[170,181,20,20]), drawRect(Rect[51,279,20,20]), "
                  + "drawRect(Rect[71,279,33,20]), drawRect(Rect[104,279,33,20]), "
                  + "drawRect(Rect[137,279,33,20]), drawRect(Rect[170,279,20,20]), "
                  + "drawRect(Rect[51,201,20,26]), drawRect(Rect[51,227,20,26]), "
                  + "drawRect(Rect[51,253,20,26]), drawRect(Rect[170,201,20,26]), "
                  + "drawRect(Rect[170,227,20,26]), drawRect(Rect[170,253,20,26])");

      for (String attachment : attachments) {
        String[] elements = attachment.split("=");
        String name = "layout_" + elements[0];
        String value = elements[1];
        assertEquals(value, inserted.getStringAttr(ANDROID_URI, name));
      }
    }
  }