/**
   * Sets the adapter of ContentAdapter to this view for displaying contents
   *
   * @param adapter
   */
  public void setAdapter(ContentAdapter adapter) {
    mContentAdapter = adapter;
    mContentAdapter.mSubjectView = this;
    mContentWrapper.setAdapter(mContentAdapter);

    /** update avatar by confusing all subject's image */
    Debug.dumpLog(TAG, "adapter is confusing the select content because a new adapter is assigned");
    mContentAdapter.confuseSelectContent();
  }
  /**
   * Sets the layout align of subject of this view, the align has four places are left, top, right ,
   * and bottom
   *
   * @param align
   */
  public void setSubjectAlign(int align) {
    if (align != SUBJECT_ALIGN_LEFT
        && align != SUBJECT_ALIGN_TOP
        && align != SUBJECT_ALIGN_RIGHT
        && align != SUBJECT_ALIGN_BOTTOM) return;

    Debug.dumpLog(TAG, "sets layout params for resetting align of subject toolbar");

    int subjectScrollerId = 0;
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
      subjectScrollerId = GenerateIntID.generateViewId();
    else subjectScrollerId = View.generateViewId();

    FrameLayout subjectScroller = null;
    ScrollView.LayoutParams subjectWrapperLp = null;
    RelativeLayout.LayoutParams subjectScrollerLp = null;
    RelativeLayout.LayoutParams contentWrapperLp = null;
    switch (align) {
      case SUBJECT_ALIGN_LEFT:
        subjectScroller = new ScrollView(getContext());
        mSubjectWrapper.setOrientation(LinearLayout.VERTICAL);
        subjectWrapperLp =
            new ScrollView.LayoutParams(
                ScrollView.LayoutParams.WRAP_CONTENT, ScrollView.LayoutParams.MATCH_PARENT);
        subjectScrollerLp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        subjectScrollerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        contentWrapperLp =
            new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        contentWrapperLp.addRule(RIGHT_OF, subjectScrollerId);
        break;
      case SUBJECT_ALIGN_TOP:
        subjectScroller = new HorizontalScrollView(getContext());
        mSubjectWrapper.setOrientation(LinearLayout.HORIZONTAL);
        subjectWrapperLp =
            new ScrollView.LayoutParams(
                ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.WRAP_CONTENT);
        subjectScrollerLp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        subjectScrollerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        subjectScrollerLp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
        contentWrapperLp =
            new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        contentWrapperLp.addRule(RelativeLayout.BELOW, subjectScrollerId);
        break;
      case SUBJECT_ALIGN_RIGHT:
        subjectScroller = new ScrollView(getContext());
        mSubjectWrapper.setOrientation(LinearLayout.VERTICAL);
        subjectWrapperLp =
            new ScrollView.LayoutParams(
                ScrollView.LayoutParams.WRAP_CONTENT, ScrollView.LayoutParams.MATCH_PARENT);
        subjectScrollerLp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        subjectScrollerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        contentWrapperLp =
            new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        contentWrapperLp.addRule(LEFT_OF, subjectScrollerId);
        break;
      case SUBJECT_ALIGN_BOTTOM:
        subjectScroller = new HorizontalScrollView(getContext());
        mSubjectWrapper.setOrientation(LinearLayout.HORIZONTAL);
        subjectWrapperLp =
            new ScrollView.LayoutParams(
                ScrollView.LayoutParams.MATCH_PARENT, ScrollView.LayoutParams.WRAP_CONTENT);
        subjectScrollerLp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        subjectScrollerLp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        contentWrapperLp =
            new LayoutParams(LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        contentWrapperLp.addRule(ABOVE, subjectScrollerId);
        break;
    }

    do {
      if (subjectScroller == null) break;
      if (subjectWrapperLp == null) break;
      if (subjectScrollerLp == null) break;
      if (contentWrapperLp == null) break;

      // release
      if (mSubjectScrollView != null) mSubjectScrollView.removeAllViews();

      // adjust layout
      mSubjectScrollView = subjectScroller;
      mSubjectScrollView.setId(subjectScrollerId);
      mSubjectWrapper.setLayoutParams(subjectWrapperLp);
      mSubjectScrollView.addView(mSubjectWrapper);
      mSubjectScrollView.setLayoutParams(subjectScrollerLp);
      this.addView(mSubjectScrollView);
      mContentWrapper.setLayoutParams(contentWrapperLp);
      if (mContentWrapper.getParent() == null) this.addView(mContentWrapper);

      mSubjectAlign = align;
      this.invalidate();

      Debug.dumpLog(TAG, "resets subject toolbar success");
    } while (false);
  }