Intro
ВКонтакте Вы можете с легкостью посмотреть общих друзей с любым пользователем. Есть приложения, которые позволяют посмотреть общие аудиозаписи с каждым другом. Но в то же время, ВКонтакте не позволяет посмотреть список групп, общих с каким-то отдельным пользователем. Вы только можете видеть на его странице список групп, в которых он состоит; либо список друзей, которые вступили в конкретную группу.
Вследствие этого у меня появилась идея разработать приложение, которое бы предоставляло информацию о количестве общих групп с каждым другом и выводило их список. Также от приложения требовалась возможность сортировки друзей по количеству общих групп.
Инструменты для достижения цели
Для загрузки данных с сайта vk.com естественно был использован VkApi, который предоставляет все требуемые методы для получения списка друзей и групп пользователя, а также данных о том, какие друзья в каких группах состоят. При этом данные будут достоверными и актуальными, даже если какой-либо друг скрыл список своих групп в настройках приватности, так как приложение не загружает список групп каждого друга, а использует метод vkapi.groups.isMember, который позволяет получать данные о наличии или отсутствии друга в конкретной группе.
Так как количество друзей и групп пользователя может составлять несколько сотен, количество данных, которые необходимо загрузить оказывается достаточно большим. VkApi накладывает ряд ограничений на частоту запросов и количество вызовов методов в одном запросе. К примеру, обращаться к VkApi можно не чаще 3 раз в секунду, а одном обращении может быть не более 25 вызовов методов. Также в одном запросе можно получить информацию о наличии или отсутствии в группах не более 500 друзей.
Немного оптимизации
Таким образом, если, к примеру, пользователь имеет менее 500 друзей и состоит в 300 группах, данные о наличии его друзей в группах будут загружены и обработаны в течение 8-10 секунд. Около секунды из них тратится на загрузку списков друзей и групп. Остальное время тратится на выполнение запросов о наличии друзей в группах к VkApi, обработку результатов этих запросов, сортировку друзей в соответствии с количеством общих групп и сортировку групп в соответствии с количеством друзей в них.
Так как выполнение запросов к VkApi и обработка результатов могут выполняться длительное время и нерационально загружать данные заново при каждом запуске приложения, было решено реализовать сохранение загруженных данных в память устройства с целью быстрого доступа к ним в дальнейшем даже при отсутствии интернета. А чтобы данные не попали не в те руки, они удаляются при каждом выходе из аккаунта ВКонтакте в приложении.
Чтобы позволить пользователю быстро переключаться между режимами просмотра списка друзей (в алфавитном порядке и в порядке уменьшения количества общих групп), было решено выполнять сортировку сразу после загрузки друзей и хранить в оперативной памяти оба списка. Таким образом, мы избавляемся от необходимости производить сортировку при каждом переключении режима просмотра. Список групп также сохраняется в оперативной памяти в отсортированном порядке и в порядке по умолчанию (как он есть в разделе «Мои группы»).

Список друзей в алфавитном порядке и в порядке уменьшения количества общих групп
Дополнительные возможности
Список друзей или групп может быть достаточно большим, поэтому в приложении был реализован поиск. Результаты поиска, как и весь список, можно просматривать в отсортированном и неотсортированном порядке.

Результаты поиска по списку друзей и списку групп
Кроме того, в приложении имеется возможность просматривать список групп каждого друга и вступать в группы. Также имеется возможность добавлять и удалять пользователей из друзей и выходить из групп. При этом списки друзей и групп и данные о наличии друзей в группах автоматически обновляются.
Аватарки друзей и групп загружаются и по умолчанию кешируются в памяти устройства. Кеширование можно отключить и пользователь может в любой момент очистить кеш. Кроме того, очищается при каждом выходе из аккаунта ВКонтакте в приложении.
Вместе с тем, в приложение была добавлена функция отправки другу сообщения со списком общих групп.

Отправка сообщения
Open Source
Исходный код приложения «Общие группы ВКонтакте» находится в свободном доступе.