예제 #1
1
  @Override
  public void setMessageObject(MessageObject messageObject) {
    boolean dataChanged = currentMessageObject == messageObject && isUserDataChanged();
    if (currentMessageObject != messageObject || dataChanged) {
      if (AndroidUtilities.isTablet()) {
        backgroundWidth =
            Math.min(
                AndroidUtilities.getMinTabletSide()
                    - AndroidUtilities.dp(
                        isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50),
                AndroidUtilities.dp(300));
      } else {
        backgroundWidth =
            Math.min(
                AndroidUtilities.displaySize.x
                    - AndroidUtilities.dp(
                        isChat && messageObject.messageOwner.from_id > 0 ? 102 : 50),
                AndroidUtilities.dp(300));
      }

      if (messageObject.isOutOwner()) {
        seekBar.type = 0;
        radialProgress.setProgressColor(theme.ChatMusicCell_radialProgress_color);
      } else {
        seekBar.type = 1;
        radialProgress.setProgressColor(theme.ChatMusicCell_radialProgress_color_2);
      }

      int maxWidth = backgroundWidth - AndroidUtilities.dp(86);

      CharSequence stringFinal =
          TextUtils.ellipsize(
              messageObject.getMusicTitle().replace("\n", " "),
              titlePaint,
              maxWidth,
              TextUtils.TruncateAt.END);
      titleLayout =
          new StaticLayout(
              stringFinal, titlePaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
      if (titleLayout.getLineCount() > 0) {
        titleX = (int) Math.ceil(titleLayout.getLineLeft(0));
      }

      stringFinal =
          TextUtils.ellipsize(
              messageObject.getMusicAuthor().replace("\n", " "),
              authorPaint,
              maxWidth,
              TextUtils.TruncateAt.END);
      authorLayout =
          new StaticLayout(
              stringFinal, authorPaint, maxWidth, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
      if (authorLayout.getLineCount() > 0) {
        authorX = (int) Math.ceil(authorLayout.getLineLeft(0));
      }

      super.setMessageObject(messageObject);
    }
    updateButtonState(dataChanged);
  }
예제 #2
0
  public void draw(Canvas canvas) {
    if (waveformBytes == null || width == 0) {
      return;
    }
    float totalBarsCount = width / AndroidUtilities.dp(3);
    if (totalBarsCount <= 0.1f) {
      return;
    }
    byte value;
    int samplesCount = (waveformBytes.length * 8 / 5);
    float samplesPerBar = samplesCount / totalBarsCount;
    float barCounter = 0;
    int nextBarNum = 0;

    paintInner.setColor(
        messageObject != null
                && !messageObject.isOutOwner()
                && messageObject.isContentUnread()
                && messageObject.messageOwner.to_id.channel_id == 0
            ? outerColor
            : (selected ? selectedColor : innerColor));
    paintOuter.setColor(outerColor);

    int y = (height - AndroidUtilities.dp(14)) / 2;
    int barNum = 0;
    int lastBarNum;
    int drawBarCount;

    for (int a = 0; a < samplesCount; a++) {
      if (a != nextBarNum) {
        continue;
      }
      drawBarCount = 0;
      lastBarNum = nextBarNum;
      while (lastBarNum == nextBarNum) {
        barCounter += samplesPerBar;
        nextBarNum = (int) barCounter;
        drawBarCount++;
      }

      int bitPointer = a * 5;
      int byteNum = bitPointer / 8;
      int byteBitOffset = bitPointer - byteNum * 8;
      int currentByteCount = 8 - byteBitOffset;
      int nextByteRest = 5 - currentByteCount;
      value =
          (byte)
              ((waveformBytes[byteNum] >> byteBitOffset)
                  & ((2 << (Math.min(5, currentByteCount) - 1)) - 1));
      if (nextByteRest > 0) {
        value <<= nextByteRest;
        value |= waveformBytes[byteNum + 1] & ((2 << (nextByteRest - 1)) - 1);
      }

      for (int b = 0; b < drawBarCount; b++) {
        int x = barNum * AndroidUtilities.dp(3);
        if (x < thumbX && x + AndroidUtilities.dp(2) < thumbX) {
          canvas.drawRect(
              x,
              y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)),
              x + AndroidUtilities.dp(2),
              y + AndroidUtilities.dp(14),
              paintOuter);
        } else {
          canvas.drawRect(
              x,
              y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)),
              x + AndroidUtilities.dp(2),
              y + AndroidUtilities.dp(14),
              paintInner);
          if (x < thumbX) {
            canvas.drawRect(
                x,
                y + AndroidUtilities.dp(14 - Math.max(1, 14.0f * value / 31.0f)),
                thumbX,
                y + AndroidUtilities.dp(14),
                paintOuter);
          }
        }
        barNum++;
      }
    }
  }