Initial commit

This commit is contained in:
2026-01-17 02:34:23 +03:00
commit 9f433105a4
66 changed files with 2177 additions and 0 deletions

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

View File

@@ -0,0 +1,17 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="50"
android:viewportHeight="50">
<group android:scaleX="0.5557895"
android:scaleY="0.5557895"
android:translateX="11.105263"
android:translateY="11.105263">
<path
android:pathData="M42.5,7.5L16.09,7.5L7.5,16.037L33.963,16.037L33.963,42.5L42.5,33.91L42.5,7.5Z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M7.5,35.43L7.5,42.5L14.64,42.5L14.57,42.5L23.164,33.906L23.157,26.848L16.083,26.847L7.5,35.43Z"
android:fillColor="#FFFFFF"/>
</group>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="?attr/colorOnSurface"
android:pathData="M17.65,6.35C16.2,4.9 14.21,4 12,4c-4.42,0 -7.99,3.58 -7.99,8s3.57,8 7.99,8c3.73,0 6.84,-2.55 7.73,-6h-2.08c-0.82,2.33 -3.04,4 -5.65,4 -3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6c1.66,0 3.14,0.69 4.22,1.78L13,11h7V4l-2.35,2.35z"/>
</vector>

View File

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="50dp"
android:height="50dp"
android:viewportWidth="50"
android:viewportHeight="50">
<path
android:pathData="M42.5,7.5L16.09,7.5L7.5,16.037L33.963,16.037L33.963,42.5L42.5,33.91L42.5,7.5Z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M7.5,35.43L7.5,42.5L14.64,42.5L14.57,42.5L23.164,33.906L23.157,26.848L16.083,26.847L7.5,35.43Z"
android:fillColor="#FFFFFF"/>
</vector>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>

View File

@@ -0,0 +1,129 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- TOP APP BAR -->
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.appbar.MaterialToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:title="@string/app_name"/>
</com.google.android.material.appbar.AppBarLayout>
<RelativeLayout
android:id="@+id/content_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<!-- Progress bar -->
<com.google.android.material.progressindicator.LinearProgressIndicator
android:id="@+id/progressBar"
android:layout_width="match_parent"
android:layout_height="4dp"
android:visibility="gone" />
<!-- BOTTOM ACTION BAR -->
<LinearLayout
android:id="@+id/bottomBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="?colorSurface"
android:orientation="vertical"
android:padding="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="@string/user_link_hint">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/singleLinkInput"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/multiLinkBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:text="@string/list_button" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:orientation="horizontal">
<com.google.android.material.button.MaterialButton
android:id="@+id/addBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/add_button" />
<com.google.android.material.button.MaterialButton
android:id="@+id/showUsersBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="8dp"
android:text="@string/show_button" />
<com.google.android.material.button.MaterialButton
android:id="@+id/removeBtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:text="@string/remove_button" />
</LinearLayout>
</LinearLayout>
<!-- CONTENT -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/bottomBar"
android:layout_below="@id/progressBar"
android:orientation="vertical">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</LinearLayout>
</RelativeLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="16dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/multilink_dialog_hint">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/linksInput"
android:layout_width="match_parent"
android:layout_height="200dp"
android:gravity="top"
android:inputType="textMultiLine" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chatRecycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.checkbox.MaterialCheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chatCheck"
style="?attr/checkboxStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:textSize="16sp"/>

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_refresh"
android:icon="@drawable/ic_refresh"
android:title="@string/action_refresh"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_select_all"
android:title="@string/action_select_all" />
<item
android:id="@+id/action_deselect_all"
android:title="@string/action_deselect_all" />
<item
android:id="@+id/action_token_status"
android:title="@string/action_token_status" />
<item
android:id="@+id/action_sign_out"
android:title="@string/action_sign_out" />
</menu>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 804 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 426 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 622 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 574 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.VKChatManager" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<!-- Status bar -->
<item name="android:statusBarColor">?attr/colorSurface</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
</style>
</resources>

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.VKChatManager"
parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<!-- Status bar -->
<item name="android:statusBarColor">?attr/colorSurface</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
</resources>

View File

@@ -0,0 +1,46 @@
<resources>
<string name="app_name">VK Chat Manager</string>
<string name="user_link_hint">Ссылка на пользователя</string>
<string name="list_button">Список</string>
<string name="add_button">Добавить</string>
<string name="show_button">Показать</string>
<string name="remove_button">Удалить</string>
<string name="office_tab">AG Офис</string>
<string name="retail_tab">AG Розница</string>
<string name="warehouse_tab">AG Склад</string>
<string name="coffee_tab">AG Кофейни</string>
<string name="other_tab">Другое</string>
<string name="chats_updated_message">Список чатов обновлен</string>
<string name="chats_update_error_message">Ошибка обновления чатов</string>
<string name="users_loaded_message">Пользователей: %d</string>
<string name="user_list_empty">Список пользователей пуст</string>
<string name="users_dialog_title">Пользователи</string>
<string name="ok_button">OK</string>
<string name="no_chats_or_users_selected_message">Не выбраны чаты или пользователи</string>
<string name="add_users_dialog_message">Добавить пользователей:</string>
<string name="remove_users_dialog_message">Удалить пользователей:</string>
<string name="in_chats_dialog_message">В чаты:</string>
<string name="confirmation_dialog_title">Подтверждение</string>
<string name="confirm_button">Подтвердить</string>
<string name="cancel_button">Отмена</string>
<string name="operation_complete_message">Операция завершена</string>
<string name="action_refresh">Обновить</string>
<string name="action_select_all">Выбрать все</string>
<string name="action_deselect_all">Снять выбор</string>
<string name="action_token_status">Статус токена</string>
<string name="token_status_title">Статус токена</string>
<string name="token_status_perpetual">Токен бессрочный</string>
<string name="token_status_expires_in">Токен истекает через: %1$dч %2$dм</string>
<string name="token_status_expired">Токен истек</string>
<string name="multilink_dialog_title">Вставьте ссылки на страницы VK, каждую с новой строки:</string>
<string name="multilink_dialog_hint">https://vk.com/id1</string>
<string name="multilink_dialog_positive_button">ОК</string>
<string name="multilink_dialog_negative_button">Отмена</string>
<string name="op_unknown_error">неизвестная ошибка</string>
<string name="op_success_add_format">✅ %1$s в %2$s: Успешно</string>
<string name="op_success_remove_format">✅ %1$s из %2$s: Успешно</string>
<string name="op_failure_format">❌ %1$s в %2$s: %3$s</string>
<string name="action_sign_out">Выйти</string>
<string name="api_error">Ошибка API: %s</string>
<string name="token_expired_message">Ваша сессия истекла. Пожалуйста, войдите снова.</string>
</resources>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.VKChatManager" parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<!-- Status bar -->
<item name="android:statusBarColor">?attr/colorSurface</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement">true</item>
</style>
</resources>

View File

@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#4D64DA</color>
</resources>

View File

@@ -0,0 +1,46 @@
<resources>
<string name="app_name">VK Chat Manager</string>
<string name="user_link_hint">User link</string>
<string name="list_button">List</string>
<string name="add_button">Add</string>
<string name="show_button">Show</string>
<string name="remove_button">Remove</string>
<string name="office_tab">AG Office</string>
<string name="retail_tab">AG Retail</string>
<string name="warehouse_tab">AG Warehouse</string>
<string name="coffee_tab">AG Coffee</string>
<string name="other_tab">Other</string>
<string name="chats_updated_message">Chat list updated</string>
<string name="chats_update_error_message">Error updating chats</string>
<string name="users_loaded_message">Users: %d</string>
<string name="user_list_empty">User list is empty</string>
<string name="users_dialog_title">Users</string>
<string name="ok_button">OK</string>
<string name="no_chats_or_users_selected_message">No chats or users selected</string>
<string name="add_users_dialog_message">Add users:</string>
<string name="remove_users_dialog_message">Remove users:</string>
<string name="in_chats_dialog_message">In chats:</string>
<string name="confirmation_dialog_title">Confirmation</string>
<string name="confirm_button">Confirm</string>
<string name="cancel_button">Cancel</string>
<string name="operation_complete_message">Operation complete</string>
<string name="action_refresh">Refresh</string>
<string name="action_select_all">Select All</string>
<string name="action_deselect_all">Deselect All</string>
<string name="action_token_status">Token Status</string>
<string name="token_status_title">Token Status</string>
<string name="token_status_perpetual">Token is perpetual</string>
<string name="token_status_expires_in">Token expires in: %1$dh %2$dm</string>
<string name="token_status_expired">Token has expired</string>
<string name="multilink_dialog_title">Paste links to VK pages, each on a new line:</string>
<string name="multilink_dialog_hint">https://vk.com/id1</string>
<string name="multilink_dialog_positive_button">OK</string>
<string name="multilink_dialog_negative_button">Cancel</string>
<string name="op_unknown_error">unknown error</string>
<string name="op_success_add_format">✅ %1$s in %2$s: Success</string>
<string name="op_success_remove_format">✅ %1$s from %2$s: Success</string>
<string name="op_failure_format">❌ %1$s in %2$s: %3$s</string>
<string name="action_sign_out">Sign Out</string>
<string name="api_error">API error: %s</string>
<string name="token_expired_message">Your session has expired. Please log in again.</string>
</resources>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Widget.VKChat.Button"
parent="Widget.Material3.Button">
<item name="cornerRadius">12dp</item>
<item name="android:textAllCaps">false</item>
</style>
</resources>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.VKChatManager"
parent="Theme.Material3.DynamicColors.DayNight.NoActionBar">
<!-- Status bar -->
<item name="android:statusBarColor">?attr/colorSurface</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older than API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>