@Override
        public int compare(Tag tag, Tag tag2) {
          if (!TextUtils.equals(tag.getCategory(), tag2.getCategory())) {
            return Config.Tags.CATEGORY_DISPLAY_ORDERS.get(tag.getCategory())
                - Config.Tags.CATEGORY_DISPLAY_ORDERS.get(tag2.getCategory());
          } else if (tag.getOrderInCategory() != tag2.getOrderInCategory()) {
            return tag.getOrderInCategory() - tag2.getOrderInCategory();
          }

          return tag.getName().compareTo(tag2.getName());
        }
  public TagMetadata(Cursor cursor) {
    while (cursor.moveToNext()) {
      Tag tag =
          new Tag(
              cursor.getString(TagsQuery.TAG_ID),
              cursor.getString(TagsQuery.TAG_NAME),
              cursor.getString(TagsQuery.TAG_CATEGORY),
              cursor.getInt(TagsQuery.TAG_ORDER_IN_CATEGORY),
              cursor.getString(TagsQuery.TAG_ABSTRACT),
              cursor.getInt(TagsQuery.TAG_COLOR));
      mTagsById.put(tag.getId(), tag);
      if (!mTagsInCategory.containsKey(tag.getCategory())) {
        mTagsInCategory.put(tag.getCategory(), new ArrayList<Tag>());
      }
      mTagsInCategory.get(tag.getCategory()).add(tag);
    }

    for (ArrayList<Tag> list : mTagsInCategory.values()) {
      Collections.sort(list);
    }
  }
 /** Given the set of tags on a session, returns its group label. */
 public Tag getSessionGroupTag(String[] sessionTags) {
   int bestOrder = Integer.MAX_VALUE;
   Tag bestTag = null;
   for (String tagId : sessionTags) {
     Tag tag = getTag(tagId);
     if (tag != null
         && Config.Tags.SESSION_GROUPING_TAG_CATEGORY.equals(tag.getCategory())
         && tag.getOrderInCategory() < bestOrder) {
       bestOrder = tag.getOrderInCategory();
       bestTag = tag;
     }
   }
   return bestTag;
 }