@Override
 public void run() {
   // the effects have just been reset!
   enablingEffect = false;
   chkEqualizer.setChecked(Equalizer.isEnabled(audioSink));
   chkBass.setChecked(BassBoost.isEnabled(audioSink));
   chkVirtualizer.setChecked(Virtualizer.isEnabled(audioSink));
 }
 private void updateEffects() {
   chkEqualizer.setChecked(Equalizer.isEnabled(audioSink));
   if (bars != null && frequencies != null) {
     for (int i = bars.length - 1; i >= 0; i--) {
       final BgSeekBar bar = bars[i];
       if (bar != null) {
         final int level = Equalizer.getBandLevel(i, audioSink);
         bars[i].setText(format(frequencies[i], level));
         bars[i].setValue(
             ((level <= LevelThreshold) && (level >= -LevelThreshold))
                 ? (-min / 10)
                 : ((level - min) / 10));
       }
     }
   }
   chkBass.setChecked(BassBoost.isEnabled(audioSink));
   barBass.setValue(BassBoost.getStrength(audioSink));
   barBass.setText(format(BassBoost.getStrength(audioSink)));
   chkVirtualizer.setChecked(Virtualizer.isEnabled(audioSink));
   barVirtualizer.setValue(Virtualizer.getStrength(audioSink));
   barVirtualizer.setText(format(Virtualizer.getStrength(audioSink)));
 }
  private void prepareViewForMode(boolean isCreatingLayout) {
    LinearLayout.LayoutParams lp;
    final Context ctx = getApplication();
    updateEffects();
    if (Player.bassBoostMode) {
      UI.animationReset();
      UI.animationAddViewToHide(panelEqualizer);
      UI.animationAddViewToShow(panelSecondary);
      UI.animationCommit(isCreatingLayout, null);
      btnGoBack.setNextFocusDownId(R.id.chkBass);
      btnMenu.setNextFocusRightId(R.id.chkBass);
      btnMenu.setNextFocusDownId(R.id.chkBass);
      UI.setNextFocusForwardId(btnMenu, R.id.chkBass);
      btnChangeEffect.setNextFocusUpId(R.id.barVirtualizer);
      btnChangeEffect.setNextFocusLeftId(R.id.barVirtualizer);
    } else {
      if (btnChangeEffect != null) {
        UI.animationReset();
        UI.animationAddViewToHide(panelSecondary);
        UI.animationAddViewToShow(panelEqualizer);
        UI.animationCommit(isCreatingLayout, null);
      }
      chkEqualizer.setChecked(Equalizer.isEnabled(audioSink));

      final int bandCount = Equalizer.getBandCount();
      if (bars == null
          || frequencies == null
          || bars.length < bandCount
          || frequencies.length < bandCount) initBarsAndFrequencies(bandCount);
      int availableScreenW = getDecorViewWidth();
      int hMargin = getDecorViewHeight();
      // some times, when rotating the device, the decorview takes a little longer to be updated
      if (UI.isLandscape != (availableScreenW >= hMargin)) availableScreenW = hMargin;
      hMargin = ((UI.isLandscape || UI.isLargeScreen) ? UI.spToPxI(32) : UI.spToPxI(16));
      if (UI.usableScreenWidth > 0 && availableScreenW > UI.usableScreenWidth)
        availableScreenW = UI.usableScreenWidth;
      if (UI.isLargeScreen) {
        availableScreenW -=
            ((UI.getViewPaddingForLargeScreen() << 1) + (UI.controlLargeMargin << 1));
        if (UI.isLandscape) availableScreenW >>= 1;
      } else {
        availableScreenW -= (UI.controlMargin << 1);
      }
      while (hMargin > UI._1dp
          && ((bandCount * UI.defaultControlSize) + ((bandCount - 1) * hMargin)) > availableScreenW)
        hMargin--;
      int size = 0, textSize = 0, bgY = 0, y = 0;
      if (hMargin <= UI._1dp) {
        // oops... the bars didn't fit inside the screen... we must adjust everything!
        hMargin = ((bandCount >= 10) ? UI._1dp : UI.controlSmallMargin);
        size = UI.defaultControlSize - 1;
        while (size > UI._4dp
            && ((bandCount * size) + ((bandCount - 1) * hMargin)) > availableScreenW) size--;
        textSize = size - (UI.controlMargin << 1) - (UI.strokeSize << 1) - (UI._1dp << 1);
        if (textSize < UI._4dp) textSize = UI._4dp;
        UI.textPaint.setTextSize(textSize);
        final FontMetrics fm = UI.textPaint.getFontMetrics();
        final int box = (int) (fm.descent - fm.ascent + 0.5f);
        final int yInBox = box - (int) (fm.descent);
        bgY = (size - box) >> 1;
        y = bgY + yInBox;
      }
      if (panelBars == null) {
        panelBars = new LinearLayout(ctx);
        lp =
            new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
        panelBars.setLayoutParams(lp);
        panelBars.setOrientation(LinearLayout.HORIZONTAL);

        for (int i = 0; i < bandCount; i++) {
          final int level = Equalizer.getBandLevel(i, audioSink);
          final BgSeekBar bar = new BgSeekBar(ctx);
          bar.setVertical(true);
          final LinearLayout.LayoutParams p =
              new LinearLayout.LayoutParams(
                  LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT);
          if (i > 0) p.leftMargin = hMargin;
          bar.setLayoutParams(p);
          bar.setMax((max - min) / 10);
          bar.setText(format(frequencies[i], level));
          bar.setKeyIncrement(10);
          bar.setValue(
              ((level <= LevelThreshold) && (level >= -LevelThreshold))
                  ? (-min / 10)
                  : ((level - min) / 10));
          bar.setOnBgSeekBarChangeListener(this);
          bar.setInsideList(true);
          if (size != 0) bar.setSize(size, textSize, bgY, y);
          bars[i] = bar;
          bar.setId(i + 1);
          bar.setNextFocusLeftId(i);
          bar.setNextFocusRightId(i + 2);
          UI.setNextFocusForwardId(bar, i + 2);
          bar.setNextFocusDownId(R.id.btnChangeEffect);
          bar.setNextFocusUpId(R.id.chkEqualizer);

          panelBars.addView(bar);
        }
        if (bars != null && bars.length > 0) bars[0].setNextFocusLeftId(R.id.chkEqualizer);
        panelEqualizer.addView(panelBars);
      }
      if (btnChangeEffect != null) {
        if (bars != null && bars.length > 0) {
          bars[bandCount - 1].setNextFocusRightId(R.id.btnChangeEffect);
          UI.setNextFocusForwardId(bars[bandCount - 1], R.id.btnChangeEffect);
        }
        btnGoBack.setNextFocusDownId(R.id.chkEqualizer);
        btnMenu.setNextFocusRightId(R.id.chkEqualizer);
        btnMenu.setNextFocusDownId(R.id.chkEqualizer);
        UI.setNextFocusForwardId(btnMenu, R.id.chkEqualizer);
        btnChangeEffect.setNextFocusUpId(bandCount);
        btnChangeEffect.setNextFocusLeftId(bandCount);
      } else {
        if (bars != null && bars.length > 0) {
          bars[bandCount - 1].setNextFocusRightId(R.id.chkBass);
          UI.setNextFocusForwardId(bars[bandCount - 1], R.id.chkBass);
        }
        chkBass.setNextFocusLeftId(bandCount);
      }
      chkEqualizer.setNextFocusRightId(1);
      chkEqualizer.setNextFocusDownId(1);
      UI.setNextFocusForwardId(chkEqualizer, 1);
    }
  }