Custom icon picker

pull/848/head
Alex Baker 5 years ago
parent 24b2a70126
commit 12f803e3de

@ -2,7 +2,7 @@
"formatVersion": 1,
"database": {
"version": 64,
"identityHash": "d24b2db6e74861d39a229c3ad6ce2a70",
"identityHash": "abbb7bcb5c7617cdde59d165ccccff5e",
"entities": [
{
"tableName": "notification",
@ -59,7 +59,7 @@
},
{
"tableName": "tagdata",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `name` TEXT, `color` INTEGER, `tagOrdering` TEXT)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT, `remoteId` TEXT, `name` TEXT, `color` INTEGER, `tagOrdering` TEXT, `td_icon` INTEGER)",
"fields": [
{
"fieldPath": "id",
@ -90,6 +90,12 @@
"columnName": "tagOrdering",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "icon",
"columnName": "td_icon",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
@ -664,7 +670,7 @@
},
{
"tableName": "filters",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT, `sql` TEXT, `values` TEXT, `criterion` TEXT)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT, `sql` TEXT, `values` TEXT, `criterion` TEXT, `f_color` INTEGER, `f_icon` INTEGER)",
"fields": [
{
"fieldPath": "id",
@ -695,6 +701,18 @@
"columnName": "criterion",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "color",
"columnName": "f_color",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "icon",
"columnName": "f_icon",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
@ -708,7 +726,7 @@
},
{
"tableName": "google_task_lists",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`gtl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `gtl_account` TEXT, `gtl_remote_id` TEXT, `gtl_title` TEXT, `gtl_remote_order` INTEGER NOT NULL, `gtl_last_sync` INTEGER NOT NULL, `gtl_color` INTEGER)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`gtl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `gtl_account` TEXT, `gtl_remote_id` TEXT, `gtl_title` TEXT, `gtl_remote_order` INTEGER NOT NULL, `gtl_last_sync` INTEGER NOT NULL, `gtl_color` INTEGER, `gtl_icon` INTEGER)",
"fields": [
{
"fieldPath": "id",
@ -751,6 +769,12 @@
"columnName": "gtl_color",
"affinity": "INTEGER",
"notNull": false
},
{
"fieldPath": "icon",
"columnName": "gtl_icon",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
@ -764,7 +788,7 @@
},
{
"tableName": "caldav_lists",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`cdl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `cdl_account` TEXT, `cdl_uuid` TEXT, `cdl_name` TEXT, `cdl_color` INTEGER NOT NULL, `cdl_ctag` TEXT, `cdl_url` TEXT)",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`cdl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `cdl_account` TEXT, `cdl_uuid` TEXT, `cdl_name` TEXT, `cdl_color` INTEGER NOT NULL, `cdl_ctag` TEXT, `cdl_url` TEXT, `cdl_icon` INTEGER)",
"fields": [
{
"fieldPath": "id",
@ -807,6 +831,12 @@
"columnName": "cdl_url",
"affinity": "TEXT",
"notNull": false
},
{
"fieldPath": "icon",
"columnName": "cdl_icon",
"affinity": "INTEGER",
"notNull": false
}
],
"primaryKey": {
@ -984,7 +1014,7 @@
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd24b2db6e74861d39a229c3ad6ce2a70')"
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'abbb7bcb5c7617cdde59d165ccccff5e')"
]
}
}

@ -22,6 +22,7 @@ import com.todoroo.astrid.api.FilterListItem;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import org.tasks.billing.Inventory;
import org.tasks.filters.NavigationDrawerSubheader;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme;
@ -36,6 +37,7 @@ public class FilterAdapter extends BaseAdapter {
private final Activity activity;
private final ThemeAccent accent;
private final Locale locale;
private final Inventory inventory;
private final LayoutInflater inflater;
private final ThemeCache themeCache;
private Filter selected = null;
@ -43,10 +45,11 @@ public class FilterAdapter extends BaseAdapter {
@Inject
public FilterAdapter(
Activity activity, Theme theme, ThemeCache themeCache, Locale locale) {
Activity activity, Theme theme, ThemeCache themeCache, Locale locale, Inventory inventory) {
this.activity = activity;
this.accent = theme.getThemeAccent();
this.locale = locale;
this.inventory = inventory;
this.inflater = theme.getLayoutInflater(activity);
this.themeCache = themeCache;
}
@ -103,7 +106,7 @@ public class FilterAdapter extends BaseAdapter {
case ITEM:
viewHolder =
new FilterViewHolder(
convertView, accent, themeCache, false, locale, activity, null);
convertView, accent, themeCache, false, locale, activity, inventory, null);
break;
case SEPARATOR:
viewHolder = new FilterViewHolder(convertView);

@ -19,11 +19,17 @@ import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.todoroo.astrid.api.CaldavFilter;
import com.todoroo.astrid.api.CustomFilter;
import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.api.GtasksFilter;
import com.todoroo.astrid.api.TagFilter;
import org.tasks.R;
import org.tasks.billing.Inventory;
import org.tasks.filters.NavigationDrawerSubheader;
import org.tasks.locale.Locale;
import org.tasks.sync.SynchronizationPreferences;
import org.tasks.themes.CustomIcons;
import org.tasks.themes.ThemeAccent;
import org.tasks.themes.ThemeCache;
@ -49,6 +55,7 @@ public class FilterViewHolder extends RecyclerView.ViewHolder {
private Locale locale;
private Activity activity;
private View itemView;
private Inventory inventory;
FilterViewHolder(
@NonNull View itemView,
@ -57,8 +64,10 @@ public class FilterViewHolder extends RecyclerView.ViewHolder {
boolean navigationDrawer,
Locale locale,
Activity activity,
Inventory inventory,
OnClick onClick) {
super(itemView);
this.inventory = inventory;
ButterKnife.bind(this, itemView);
@ -109,7 +118,7 @@ public class FilterViewHolder extends RecyclerView.ViewHolder {
text.setChecked(selected);
}
icon.setImageResource(filter.icon);
icon.setImageResource(getIcon(filter));
icon.setColorFilter(
filter.tint >= 0
? themeCache.getThemeColor(filter.tint).getPrimaryColor()
@ -129,6 +138,24 @@ public class FilterViewHolder extends RecyclerView.ViewHolder {
}
}
private int getIcon(FilterListItem filter) {
if (filter.icon < 1000 || inventory.hasPro()) {
Integer icon = CustomIcons.getIconResId(filter.icon);
if (icon != null) {
return icon;
}
}
if (filter instanceof TagFilter) {
return R.drawable.ic_outline_label_24px;
} else if (filter instanceof GtasksFilter || filter instanceof CaldavFilter) {
return R.drawable.ic_outline_cloud_24px;
} else if (filter instanceof CustomFilter) {
return R.drawable.ic_outline_filter_list_24px;
} else {
return filter.icon;
}
}
public void bind(NavigationDrawerSubheader filter) {
text.setText(filter.listingTitle);
icon.setVisibility(filter.error ? View.VISIBLE : View.GONE);

@ -27,6 +27,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.inject.Inject;
import org.tasks.billing.Inventory;
import org.tasks.filters.NavigationDrawerSubheader;
import org.tasks.locale.Locale;
import org.tasks.themes.Theme;
@ -42,6 +43,7 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, FilterV
private final Activity activity;
private final ThemeAccent accent;
private final Locale locale;
private final Inventory inventory;
private final LayoutInflater inflater;
private final ThemeCache themeCache;
private OnClick onClick;
@ -51,11 +53,12 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, FilterV
@Inject
public NavigationDrawerAdapter(
Activity activity, Theme theme, ThemeCache themeCache, Locale locale) {
Activity activity, Theme theme, ThemeCache themeCache, Locale locale, Inventory inventory) {
super(new DiffCallback());
this.activity = activity;
this.accent = theme.getThemeAccent();
this.locale = locale;
this.inventory = inventory;
this.inflater = theme.getLayoutInflater(activity);
this.themeCache = themeCache;
}
@ -109,7 +112,7 @@ public class NavigationDrawerAdapter extends ListAdapter<FilterListItem, FilterV
View view = inflater.inflate(type.layout, parent, false);
if (type == ITEM) {
return new FilterViewHolder(
view, accent, themeCache, true, locale, activity, onClick);
view, accent, themeCache, true, locale, activity, inventory, onClick);
} else if (type == SUBHEADER) {
return new FilterViewHolder(view, activity);
} else {

@ -35,7 +35,6 @@ public class CaldavFilter extends Filter {
}
};
private static final int TAG = R.drawable.ic_outline_cloud_24px;
private CaldavCalendar calendar;
private CaldavFilter() {
@ -46,7 +45,7 @@ public class CaldavFilter extends Filter {
super(calendar.getName(), queryTemplate(calendar), getValuesForNewTask(calendar));
this.calendar = calendar;
tint = calendar.getColor();
icon = TAG;
icon = calendar.getIcon();
}
private static QueryTemplate queryTemplate(CaldavCalendar caldavCalendar) {

@ -10,8 +10,6 @@ import org.tasks.R;
public class CustomFilter extends Filter {
private static final int FILTER = R.drawable.ic_outline_filter_list_24px;
/** Parcelable Creator Object */
public static final Parcelable.Creator<CustomFilter> CREATOR =
new Parcelable.Creator<CustomFilter>() {
@ -38,7 +36,8 @@ public class CustomFilter extends Filter {
filter.getTitle(), filter.getSql().replace("tasks.userId=0", "1"), filter.getValuesAsMap());
this.id = filter.getId();
this.criterion = filter.getCriterion();
this.icon = FILTER;
this.tint = filter.getColor();
this.icon = filter.getIcon();
}
private CustomFilter(Parcel parcel) {
@ -50,6 +49,8 @@ public class CustomFilter extends Filter {
filter.setId(id);
filter.setTitle(listingTitle);
filter.setSql(sqlQuery);
filter.setIcon(icon);
filter.setColor(tint);
if (valuesForNewTasks != null && valuesForNewTasks.size() > 0) {
filter.setValues(mapToSerializedString(valuesForNewTasks));
}

@ -23,7 +23,7 @@ public abstract class FilterListItem implements Parcelable {
/** Title of this item displayed on the Filters page */
public String listingTitle = null;
public int icon = 0;
public int icon = -1;
public int tint = -1;
public int count = -1;

@ -36,7 +36,6 @@ public class GtasksFilter extends Filter {
}
};
private static final int CLOUD = R.drawable.ic_outline_cloud_24px;
private GoogleTaskList list;
private GtasksFilter() {
@ -47,7 +46,7 @@ public class GtasksFilter extends Filter {
super(list.getTitle(), getQueryTemplate(list), getValuesForNewTasks(list));
this.list = list;
tint = list.getColor();
icon = CLOUD;
icon = list.getIcon();
}
public static String toManualOrder(String query) {

@ -36,7 +36,6 @@ public class TagFilter extends Filter {
}
};
private static final int TAG = R.drawable.ic_outline_label_24px;
private TagData tagData;
private TagFilter() {
@ -47,7 +46,7 @@ public class TagFilter extends Filter {
super(tagData.getName(), queryTemplate(tagData.getRemoteId()), getValuesForNewTask(tagData));
this.tagData = tagData;
tint = tagData.getColor();
icon = TAG;
icon = tagData.getIcon();
}
private static QueryTemplate queryTemplate(String uuid) {

@ -27,6 +27,7 @@ import org.tasks.R;
import org.tasks.data.Tag;
import org.tasks.injection.ForApplication;
import org.tasks.preferences.Preferences;
import org.tasks.themes.CustomIcons;
/**
* Exposes Astrid's built in filters to the NavigationDrawerFragment
@ -105,7 +106,7 @@ public final class BuiltInFilterExposer {
public Filter getMyTasksFilter() {
Filter myTasksFilter = getMyTasksFilter(context.getResources());
myTasksFilter.icon = R.drawable.ic_outline_all_inbox_24px;
myTasksFilter.icon = CustomIcons.getALL_INBOX();
return myTasksFilter;
}
@ -116,17 +117,17 @@ public final class BuiltInFilterExposer {
if (preferences.getBoolean(R.string.p_show_today_filter, true)) {
Filter todayFilter = getTodayFilter(r);
todayFilter.icon = R.drawable.ic_outline_today_24px;
todayFilter.icon = CustomIcons.getTODAY();
filters.add(todayFilter);
}
if (preferences.getBoolean(R.string.p_show_recently_modified_filter, true)) {
Filter recentlyModifiedFilter = getRecentlyModifiedFilter(r);
recentlyModifiedFilter.icon = R.drawable.ic_outline_history_24px;
recentlyModifiedFilter.icon = CustomIcons.getHISTORY();
filters.add(recentlyModifiedFilter);
}
if (preferences.getBoolean(R.string.p_show_not_in_list_filter, true)) {
Filter uncategorizedFilter = getUncategorizedFilter(r);
uncategorizedFilter.icon = R.drawable.ic_outline_label_off_24px;
uncategorizedFilter.icon = CustomIcons.getLABEL_OFF();
filters.add(uncategorizedFilter);
}
// transmit filter list

@ -11,34 +11,25 @@ import static android.text.TextUtils.isEmpty;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.inputmethod.InputMethodManager;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnTextChanged;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import com.todoroo.astrid.activity.MainActivity;
import com.todoroo.astrid.activity.TaskListFragment;
import com.todoroo.astrid.api.CustomFilter;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.caldav.BaseListSettingsActivity;
import org.tasks.data.FilterDao;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import org.tasks.ui.MenuColorizer;
public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity
implements Toolbar.OnMenuItemClickListener {
public class FilterSettingsActivity extends BaseListSettingsActivity {
public static final String TOKEN_FILTER = "token_filter";
@Inject FilterDao filterDao;
@Inject DialogBuilder dialogBuilder;
@Inject Preferences preferences;
@BindView(R.id.name)
TextInputEditText name;
@ -46,41 +37,32 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity
@BindView(R.id.name_layout)
TextInputLayout nameLayout;
@BindView(R.id.toolbar)
Toolbar toolbar;
private CustomFilter filter;
@Override
protected void onCreate(Bundle savedInstanceState) {
filter = getIntent().getParcelableExtra(TOKEN_FILTER);
super.onCreate(savedInstanceState);
setContentView(R.layout.filter_settings_activity);
ButterKnife.bind(this);
if (savedInstanceState == null) {
selectedTheme = filter.tint;
selectedIcon = filter.icon;
}
filter = getIntent().getParcelableExtra(TOKEN_FILTER);
name.setText(filter.listingTitle);
final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setNavigationIcon(
ContextCompat.getDrawable(
this,
backButtonSavesTask
? R.drawable.ic_outline_clear_24px
: R.drawable.ic_outline_save_24px));
toolbar.setTitle(filter.listingTitle);
toolbar.setNavigationOnClickListener(
v -> {
if (backButtonSavesTask) {
discard();
} else {
save();
}
});
toolbar.inflateMenu(R.menu.menu_tag_settings);
toolbar.setOnMenuItemClickListener(this);
MenuColorizer.colorToolbar(this, toolbar);
updateTheme();
}
name.setText(filter.listingTitle);
@Override
protected boolean isNew() {
return false;
}
@Override
protected String getToolbarTitle() {
return filter.listingTitle;
}
@OnTextChanged(R.id.name)
@ -93,26 +75,39 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity
component.inject(this);
}
private void save() {
String oldName = filter.listingTitle;
String newName = name.getText().toString().trim();
@Override
protected void save() {
String newName = getNewName();
if (isEmpty(newName)) {
nameLayout.setError(getString(R.string.name_cannot_be_empty));
return;
}
boolean nameChanged = !oldName.equals(newName);
if (nameChanged) {
if (hasChanges()) {
filter.listingTitle = newName;
filter.tint = selectedTheme;
filter.icon = selectedIcon;
filterDao.update(filter.toStoreObject());
setResult(
RESULT_OK, new Intent(TaskListFragment.ACTION_RELOAD).putExtra(TOKEN_FILTER, filter));
RESULT_OK,
new Intent(TaskListFragment.ACTION_RELOAD).putExtra(MainActivity.OPEN_FILTER, filter));
}
finish();
}
private String getNewName() {
return name.getText().toString().trim();
}
@Override
protected boolean hasChanges() {
return !(getNewName().equals(filter.listingTitle)
&& selectedTheme == filter.tint
&& selectedIcon == filter.icon);
}
@Override
public void finish() {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
@ -121,50 +116,16 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity
}
@Override
public void onBackPressed() {
if (preferences.backButtonSavesTask()) {
save();
} else {
discard();
}
}
private void deleteTag() {
dialogBuilder
.newMessageDialog(R.string.delete_tag_confirmation, filter.listingTitle)
.setPositiveButton(
R.string.delete,
(dialog, which) -> {
filterDao.delete(filter.getId());
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_DELETED).putExtra(TOKEN_FILTER, filter));
finish();
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
private void discard() {
String tagName = this.name.getText().toString().trim();
if (filter.listingTitle.equals(tagName)) {
finish();
} else {
dialogBuilder
.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.keep_editing, null)
.setNegativeButton(R.string.discard, (dialog, which) -> finish())
.show();
}
protected int getLayout() {
return R.layout.filter_settings_activity;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
deleteTag();
break;
}
return onOptionsItemSelected(item);
protected void delete() {
filterDao.delete(filter.getId());
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_DELETED).putExtra(TOKEN_FILTER, filter));
finish();
}
}

@ -5,18 +5,11 @@ import static android.text.TextUtils.isEmpty;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProviders;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import com.google.android.material.textfield.TextInputEditText;
import com.google.api.services.tasks.model.TaskList;
import com.rey.material.widget.ProgressView;
@ -28,72 +21,47 @@ import com.todoroo.astrid.gtasks.api.GtasksInvoker;
import com.todoroo.astrid.service.TaskDeleter;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.caldav.BaseListSettingsActivity;
import org.tasks.data.GoogleTaskAccount;
import org.tasks.data.GoogleTaskList;
import org.tasks.data.GoogleTaskListDao;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.gtasks.GoogleAccountManager;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ForApplication;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
import org.tasks.ui.MenuColorizer;
import timber.log.Timber;
public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActivity
implements Toolbar.OnMenuItemClickListener {
public class GoogleTaskListSettingsActivity extends BaseListSettingsActivity {
public static final String EXTRA_ACCOUNT = "extra_account";
public static final String EXTRA_STORE_DATA = "extra_store_data";
private static final String EXTRA_SELECTED_THEME = "extra_selected_theme";
private static final int REQUEST_COLOR_PICKER = 10109;
@Inject @ForApplication Context context;
@Inject GoogleTaskListDao googleTaskListDao;
@Inject DialogBuilder dialogBuilder;
@Inject Preferences preferences;
@Inject GtasksListService gtasksListService;
@Inject Tracker tracker;
@Inject ThemeCache themeCache;
@Inject ThemeColor themeColor;
@Inject TaskDeleter taskDeleter;
@Inject GtasksInvoker gtasksInvoker;
@BindView(R.id.name)
TextInputEditText name;
@BindView(R.id.color)
TextInputEditText color;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.progress_bar)
ProgressView progressView;
private boolean isNewList;
private GoogleTaskList gtasksList;
private int selectedTheme;
private CreateListViewModel createListViewModel;
private RenameListViewModel renameListViewModel;
private DeleteListViewModel deleteListViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA);
setContentView(R.layout.activity_google_task_list_settings);
ButterKnife.bind(this);
super.onCreate(savedInstanceState);
createListViewModel = ViewModelProviders.of(this).get(CreateListViewModel.class);
renameListViewModel = ViewModelProviders.of(this).get(RenameListViewModel.class);
deleteListViewModel = ViewModelProviders.of(this).get(DeleteListViewModel.class);
Intent intent = getIntent();
gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA);
if (gtasksList == null) {
isNewList = true;
gtasksList = new GoogleTaskList();
@ -103,36 +71,10 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
if (savedInstanceState == null) {
selectedTheme = gtasksList.getColor();
} else {
selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME);
selectedIcon = gtasksList.getIcon();
}
final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setTitle(isNewList ? getString(R.string.new_list) : gtasksList.getTitle());
toolbar.setNavigationIcon(
ContextCompat.getDrawable(
this,
backButtonSavesTask
? R.drawable.ic_outline_clear_24px
: R.drawable.ic_outline_save_24px));
toolbar.setNavigationOnClickListener(
v -> {
if (backButtonSavesTask) {
discard();
} else {
save();
}
});
toolbar.inflateMenu(R.menu.menu_tag_settings);
toolbar.setOnMenuItemClickListener(this);
toolbar.showOverflowMenu();
color.setInputType(InputType.TYPE_NULL);
MenuColorizer.colorToolbar(this, toolbar);
if (isNewList) {
toolbar.getMenu().findItem(R.id.delete).setVisible(false);
name.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(name, InputMethodManager.SHOW_IMPLICIT);
@ -140,8 +82,6 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
name.setText(gtasksList.getTitle());
}
updateTheme();
if (createListViewModel.inProgress()
|| renameListViewModel.inProgress()
|| deleteListViewModel.inProgress()) {
@ -150,6 +90,18 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
createListViewModel.observe(this, this::onListCreated, this::requestFailed);
renameListViewModel.observe(this, this::onListRenamed, this::requestFailed);
deleteListViewModel.observe(this, this::onListDeleted, this::requestFailed);
updateTheme();
}
@Override
protected boolean isNew() {
return gtasksList == null;
}
@Override
protected String getToolbarTitle() {
return isNew() ? getString(R.string.new_list) : gtasksList.getTitle();
}
private void showProgressIndicator() {
@ -164,36 +116,13 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
return progressView.getVisibility() == View.VISIBLE;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_SELECTED_THEME, selectedTheme);
}
@OnFocusChange(R.id.color)
void onFocusChange(boolean focused) {
if (focused) {
color.clearFocus();
showThemePicker();
}
}
@OnClick(R.id.color)
protected void showThemePicker() {
Intent intent = new Intent(GoogleTaskListSettingsActivity.this, ColorPickerActivity.class);
intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS);
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme);
intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true);
startActivityForResult(intent, REQUEST_COLOR_PICKER);
}
@Override
public void inject(ActivityComponent component) {
component.inject(this);
}
private void save() {
@Override
protected void save() {
if (requestInProgress()) {
return;
}
@ -212,8 +141,9 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
showProgressIndicator();
renameListViewModel.renameList(gtasksInvoker, gtasksList, newName);
} else {
if (colorChanged()) {
if (colorChanged() || iconChanged()) {
gtasksList.setColor(selectedTheme);
gtasksList.setIcon(selectedIcon);
googleTaskListDao.insertOrReplace(gtasksList);
setResult(
RESULT_OK,
@ -232,54 +162,27 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
}
@Override
public void onBackPressed() {
if (preferences.backButtonSavesTask()) {
save();
} else {
discard();
}
protected int getLayout() {
return R.layout.activity_google_task_list_settings;
}
private void deleteTag() {
if (requestInProgress()) {
return;
@Override
protected void promptDelete() {
if (!requestInProgress()) {
super.promptDelete();
}
dialogBuilder
.newMessageDialog(R.string.delete_tag_confirmation, gtasksList.getTitle())
.setPositiveButton(
R.string.delete,
(dialog, which) -> {
showProgressIndicator();
deleteListViewModel.deleteList(gtasksInvoker, gtasksList);
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
deleteTag();
break;
}
return onOptionsItemSelected(item);
protected void delete() {
showProgressIndicator();
deleteListViewModel.deleteList(gtasksInvoker, gtasksList);
}
private void discard() {
if (requestInProgress()) {
return;
}
if (hasChanges()) {
dialogBuilder
.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.keep_editing, null)
.setNegativeButton(R.string.discard, (dialog, which) -> finish())
.show();
} else {
finish();
@Override
protected void discard() {
if (!requestInProgress()) {
super.discard();
}
}
@ -287,26 +190,31 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
return name.getText().toString().trim();
}
private boolean hasChanges() {
@Override
protected boolean hasChanges() {
if (isNewList) {
return selectedTheme >= 0 || !isEmpty(getNewName());
}
return colorChanged() || nameChanged();
return colorChanged() || nameChanged() || iconChanged();
}
private boolean colorChanged() {
return selectedTheme != gtasksList.getColor();
}
private boolean iconChanged() {
return selectedIcon != gtasksList.getIcon();
}
private boolean nameChanged() {
return !getNewName().equals(gtasksList.getTitle());
}
private void onListCreated(TaskList taskList) {
tracker.reportEvent(Tracking.Events.GTASK_NEW_LIST);
gtasksList.setRemoteId(taskList.getId());
gtasksList.setTitle(taskList.getTitle());
gtasksList.setColor(selectedTheme);
gtasksList.setIcon(selectedIcon);
gtasksList.setId(googleTaskListDao.insertOrReplace(gtasksList));
setResult(
RESULT_OK, new Intent().putExtra(MainActivity.OPEN_FILTER, new GtasksFilter(gtasksList)));
@ -315,7 +223,6 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
private void onListDeleted(boolean deleted) {
if (deleted) {
tracker.reportEvent(Tracking.Events.GTASK_DELETE_LIST);
taskDeleter.delete(gtasksList);
setResult(RESULT_OK, new Intent(TaskListFragment.ACTION_DELETED));
finish();
@ -323,9 +230,9 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
}
private void onListRenamed(TaskList taskList) {
tracker.reportEvent(Tracking.Events.GTASK_RENAME_LIST);
gtasksList.setTitle(taskList.getTitle());
gtasksList.setColor(selectedTheme);
gtasksList.setIcon(selectedIcon);
googleTaskListDao.insertOrReplace(gtasksList);
setResult(
RESULT_OK,
@ -334,36 +241,9 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi
finish();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_COLOR_PICKER) {
if (resultCode == RESULT_OK) {
int index = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0);
tracker.reportEvent(Tracking.Events.GTASK_SET_COLOR, Integer.toString(index));
selectedTheme = index;
updateTheme();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void requestFailed(Throwable error) {
Timber.e(error);
hideProgressIndicator();
Toast.makeText(this, R.string.gtasks_GLA_errorIOAuth, Toast.LENGTH_LONG).show();
}
private void updateTheme() {
ThemeColor themeColor;
if (selectedTheme < 0) {
themeColor = this.themeColor;
color.setText(R.string.none);
} else {
themeColor = themeCache.getThemeColor(selectedTheme);
color.setText(themeColor.getName());
}
themeColor.apply(toolbar);
themeColor.applyToSystemBars(this);
}
}

@ -11,15 +11,8 @@ import static android.text.TextUtils.isEmpty;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.inputmethod.InputMethodManager;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import butterknife.OnTextChanged;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
@ -30,34 +23,20 @@ import com.todoroo.astrid.helper.UUIDHelper;
import com.todoroo.astrid.tags.TagService;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.caldav.BaseListSettingsActivity;
import org.tasks.data.TagDao;
import org.tasks.data.TagData;
import org.tasks.data.TagDataDao;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
implements Toolbar.OnMenuItemClickListener {
public class TagSettingsActivity extends BaseListSettingsActivity {
public static final String TOKEN_AUTOPOPULATE_NAME = "autopopulateName"; // $NON-NLS-1$
public static final String EXTRA_TAG_DATA = "tagData"; // $NON-NLS-1$
private static final String EXTRA_TAG_UUID = "uuid"; // $NON-NLS-1$
private static final String EXTRA_SELECTED_THEME = "extra_selected_theme";
private static final int REQUEST_COLOR_PICKER = 10109;
@Inject TagService tagService;
@Inject TagDataDao tagDataDao;
@Inject TagDao tagDao;
@Inject DialogBuilder dialogBuilder;
@Inject Preferences preferences;
@Inject ThemeCache themeCache;
@Inject ThemeColor themeColor;
@Inject Tracker tracker;
@BindView(R.id.name)
TextInputEditText name;
@ -65,24 +44,15 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
@BindView(R.id.name_layout)
TextInputLayout nameLayout;
@BindView(R.id.color)
TextInputEditText color;
@BindView(R.id.toolbar)
Toolbar toolbar;
private boolean isNewTag;
private TagData tagData;
private int selectedTheme;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
tagData = getIntent().getParcelableExtra(EXTRA_TAG_DATA);
setContentView(R.layout.tag_settings_activity);
ButterKnife.bind(this);
super.onCreate(savedInstanceState);
tagData = getIntent().getParcelableExtra(EXTRA_TAG_DATA);
if (tagData == null) {
isNewTag = true;
tagData = new TagData();
@ -90,32 +60,9 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
}
if (savedInstanceState == null) {
selectedTheme = tagData.getColor();
} else {
selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME);
selectedIcon = tagData.getIcon();
}
final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setTitle(isNewTag ? getString(R.string.new_tag) : tagData.getName());
toolbar.setNavigationIcon(
ContextCompat.getDrawable(
this,
backButtonSavesTask
? R.drawable.ic_outline_clear_24px
: R.drawable.ic_outline_save_24px));
toolbar.setNavigationOnClickListener(
v -> {
if (backButtonSavesTask) {
discard();
} else {
save();
}
});
toolbar.inflateMenu(R.menu.menu_tag_settings);
toolbar.setOnMenuItemClickListener(this);
toolbar.showOverflowMenu();
color.setInputType(InputType.TYPE_NULL);
name.setText(tagData.getName());
String autopopulateName = getIntent().getStringExtra(TOKEN_AUTOPOPULATE_NAME);
@ -123,7 +70,6 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
name.setText(autopopulateName);
getIntent().removeExtra(TOKEN_AUTOPOPULATE_NAME);
} else if (isNewTag) {
toolbar.getMenu().findItem(R.id.delete).setVisible(false);
name.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(name, InputMethodManager.SHOW_IMPLICIT);
@ -132,33 +78,19 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
updateTheme();
}
@OnTextChanged(R.id.name)
void onTextChanged(CharSequence ignored) {
nameLayout.setError(null);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_SELECTED_THEME, selectedTheme);
protected boolean isNew() {
return tagData == null;
}
@OnFocusChange(R.id.color)
void onFocusChange(boolean focused) {
if (focused) {
color.clearFocus();
showThemePicker();
}
@Override
protected String getToolbarTitle() {
return isNew() ? getString(R.string.new_tag) : tagData.getName();
}
@OnClick(R.id.color)
protected void showThemePicker() {
Intent intent = new Intent(TagSettingsActivity.this, ColorPickerActivity.class);
intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS);
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme);
intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true);
startActivityForResult(intent, REQUEST_COLOR_PICKER);
@OnTextChanged(R.id.name)
void onTextChanged(CharSequence ignored) {
nameLayout.setError(null);
}
@Override
@ -175,7 +107,8 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
&& tagDataDao.getTagByName(newName) != null;
}
private void save() {
@Override
protected void save() {
String newName = getNewName();
if (isEmpty(newName)) {
@ -191,27 +124,33 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
if (isNewTag) {
tagData.setName(newName);
tagData.setColor(selectedTheme);
tagData.setIcon(selectedIcon);
tagDataDao.createNew(tagData);
setResult(RESULT_OK, new Intent().putExtra(MainActivity.OPEN_FILTER, new TagFilter(tagData)));
} else if (hasChanges()) {
tagData.setName(newName);
tagData.setColor(selectedTheme);
tagData.setIcon(selectedIcon);
tagService.rename(tagData.getRemoteId(), newName);
tagDataDao.update(tagData);
tagDao.rename(tagData.getRemoteId(), newName);
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_RELOAD).putExtra(MainActivity.OPEN_FILTER, new TagFilter(tagData)));
new Intent(TaskListFragment.ACTION_RELOAD)
.putExtra(MainActivity.OPEN_FILTER, new TagFilter(tagData)));
}
finish();
}
private boolean hasChanges() {
@Override
protected boolean hasChanges() {
if (isNewTag) {
return selectedTheme >= 0 || !isEmpty(getNewName());
return selectedTheme >= 0 || selectedIcon >= 0 || !isEmpty(getNewName());
}
return !(selectedTheme == tagData.getColor() && getNewName().equals(tagData.getName()));
return !(selectedTheme == tagData.getColor()
&& selectedIcon == tagData.getIcon()
&& getNewName().equals(tagData.getName()));
}
@Override
@ -222,78 +161,20 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity
}
@Override
public void onBackPressed() {
if (preferences.backButtonSavesTask()) {
save();
} else {
discard();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_COLOR_PICKER) {
if (resultCode == RESULT_OK) {
int index = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0);
tracker.reportEvent(Tracking.Events.SET_TAG_COLOR, Integer.toString(index));
selectedTheme = index;
updateTheme();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void deleteTag() {
dialogBuilder
.newMessageDialog(R.string.delete_tag_confirmation, tagData.getName())
.setPositiveButton(
R.string.delete,
(dialog, which) -> {
if (tagData != null) {
String uuid = tagData.getRemoteId();
tagDao.deleteTag(uuid);
tagDataDao.delete(tagData.getId());
setResult(RESULT_OK, new Intent(TaskListFragment.ACTION_DELETED).putExtra(EXTRA_TAG_UUID, uuid));
}
finish();
})
.setNegativeButton(android.R.string.cancel, null)
.show();
}
private void discard() {
if (!hasChanges()) {
finish();
} else {
dialogBuilder
.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, (dialog, which) -> finish())
.setNegativeButton(android.R.string.cancel, null)
.show();
}
}
private void updateTheme() {
ThemeColor themeColor;
if (selectedTheme < 0) {
themeColor = this.themeColor;
color.setText(R.string.none);
} else {
themeColor = themeCache.getThemeColor(selectedTheme);
color.setText(themeColor.getName());
}
themeColor.apply(toolbar);
themeColor.applyToSystemBars(this);
protected int getLayout() {
return R.layout.activity_tag_settings;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
deleteTag();
break;
protected void delete() {
if (tagData != null) {
String uuid = tagData.getRemoteId();
tagDao.deleteTag(uuid);
tagDataDao.delete(tagData.getId());
setResult(
RESULT_OK,
new Intent(TaskListFragment.ACTION_DELETED).putExtra(EXTRA_TAG_UUID, uuid));
}
return onOptionsItemSelected(item);
finish();
}
}

@ -0,0 +1,206 @@
package org.tasks.caldav;
import static org.tasks.dialogs.IconPickerDialog.newIconPicker;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.drawable.DrawableCompat;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.activities.ColorPickerActivity;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.dialogs.IconPickerDialog.IconPickerCallback;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import org.tasks.themes.CustomIcons;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
import org.tasks.ui.MenuColorizer;
public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatActivity
implements IconPickerCallback, OnMenuItemClickListener {
private static final String EXTRA_SELECTED_THEME = "extra_selected_theme";
private static final String EXTRA_SELECTED_ICON = "extra_selected_icon";
private static final String FRAG_TAG_ICON_PICKER = "frag_tag_icon_picker";
private static final int REQUEST_COLOR_PICKER = 10109;
@BindView(R.id.color)
ImageView color;
@BindView(R.id.icon)
ImageView icon;
@BindView(R.id.toolbar)
Toolbar toolbar;
@Inject ThemeCache themeCache;
@Inject ThemeColor themeColor;
@Inject Preferences preferences;
@Inject DialogBuilder dialogBuilder;
protected int selectedTheme = -1;
protected int selectedIcon = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayout());
ButterKnife.bind(this);
if (savedInstanceState != null) {
selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME);
selectedIcon = savedInstanceState.getInt(EXTRA_SELECTED_ICON);
}
final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setTitle(getToolbarTitle());
toolbar.setNavigationIcon(
ContextCompat.getDrawable(
this,
backButtonSavesTask
? R.drawable.ic_outline_clear_24px
: R.drawable.ic_outline_save_24px));
toolbar.setNavigationOnClickListener(
v -> {
if (backButtonSavesTask) {
discard();
} else {
save();
}
});
if (!isNew()) {
toolbar.inflateMenu(R.menu.menu_tag_settings);
}
toolbar.setOnMenuItemClickListener(this);
MenuColorizer.colorToolbar(this, toolbar);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_SELECTED_THEME, selectedTheme);
outState.putInt(EXTRA_SELECTED_ICON, selectedIcon);
}
@Override
public void onBackPressed() {
if (preferences.backButtonSavesTask()) {
save();
} else {
discard();
}
}
protected abstract int getLayout();
protected abstract boolean hasChanges();
protected abstract void save();
protected abstract boolean isNew();
protected abstract String getToolbarTitle();
protected abstract void delete();
protected void discard() {
if (!hasChanges()) {
finish();
} else {
dialogBuilder
.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, (dialog, which) -> finish())
.setNegativeButton(android.R.string.cancel, null)
.show();
}
}
@OnClick(R.id.color_row)
protected void showThemePicker() {
Intent intent = new Intent(BaseListSettingsActivity.this, ColorPickerActivity.class);
intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS);
intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true);
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme);
startActivityForResult(intent, REQUEST_COLOR_PICKER);
}
@OnClick(R.id.icon_row)
protected void showIconPicker() {
newIconPicker(selectedIcon).show(getSupportFragmentManager(), FRAG_TAG_ICON_PICKER);
}
@Override
public void onSelected(DialogInterface dialogInterface, int icon) {
this.selectedIcon = icon;
dialogInterface.dismiss();
updateTheme();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_COLOR_PICKER) {
if (resultCode == RESULT_OK) {
selectedTheme = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0);
updateTheme();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (item.getItemId() == R.id.delete) {
promptDelete();
return true;
}
return onOptionsItemSelected(item);
}
protected void promptDelete() {
dialogBuilder
.newMessageDialog(R.string.delete_tag_confirmation, getToolbarTitle())
.setPositiveButton(
R.string.delete,
(dialog, which) -> delete())
.setNegativeButton(android.R.string.cancel, null)
.show();
}
protected void updateTheme() {
ThemeColor themeColor;
if (selectedTheme < 0) {
themeColor = this.themeColor;
color.setVisibility(View.GONE);
} else {
themeColor = themeCache.getThemeColor(selectedTheme);
Drawable colorIcon = ContextCompat.getDrawable(this, R.drawable.ic_baseline_lens_24px);
Drawable wrappedColorIcon = DrawableCompat.wrap(colorIcon.mutate());
DrawableCompat.setTint(wrappedColorIcon, themeColor.getPrimaryColor());
color.setImageDrawable(wrappedColorIcon);
color.setVisibility(View.VISIBLE);
}
themeColor.apply(toolbar);
themeColor.applyToSystemBars(this);
Integer icon = CustomIcons.getIconResId(selectedIcon);
if (icon == null) {
icon = CustomIcons.getIconResId(CustomIcons.getCLOUD());
}
this.icon.setImageResource(icon == null ? R.drawable.ic_outline_cloud_24px : icon);
}
}

@ -5,20 +5,13 @@ import static android.text.TextUtils.isEmpty;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.ViewModelProviders;
import at.bitfire.dav4jvm.exception.HttpException;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnFocusChange;
import butterknife.OnTextChanged;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.textfield.TextInputEditText;
@ -32,39 +25,19 @@ import com.todoroo.astrid.service.TaskDeleter;
import java.net.ConnectException;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.activities.ColorPickerActivity;
import org.tasks.activities.CreateCalendarViewModel;
import org.tasks.activities.DeleteCalendarViewModel;
import org.tasks.analytics.Tracker;
import org.tasks.analytics.Tracking;
import org.tasks.analytics.Tracking.Events;
import org.tasks.data.CaldavAccount;
import org.tasks.data.CaldavCalendar;
import org.tasks.data.CaldavDao;
import org.tasks.dialogs.DialogBuilder;
import org.tasks.injection.ActivityComponent;
import org.tasks.injection.ForApplication;
import org.tasks.injection.ThemedInjectingAppCompatActivity;
import org.tasks.preferences.Preferences;
import org.tasks.sync.SyncAdapters;
import org.tasks.themes.ThemeCache;
import org.tasks.themes.ThemeColor;
import org.tasks.ui.DisplayableException;
import org.tasks.ui.MenuColorizer;
public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActivity
implements OnMenuItemClickListener {
public class CaldavCalendarSettingsActivity extends BaseListSettingsActivity {
public static final String EXTRA_CALDAV_CALENDAR = "extra_caldav_calendar";
public static final String EXTRA_CALDAV_ACCOUNT = "extra_caldav_account";
private static final String EXTRA_SELECTED_THEME = "extra_selected_theme";
private static final int REQUEST_COLOR_PICKER = 10109;
@Inject @ForApplication Context context;
@Inject DialogBuilder dialogBuilder;
@Inject Preferences preferences;
@Inject ThemeCache themeCache;
@Inject ThemeColor themeColor;
@Inject Tracker tracker;
@Inject CaldavDao caldavDao;
@Inject SyncAdapters syncAdapters;
@Inject TaskDeleter taskDeleter;
@ -76,37 +49,32 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
@BindView(R.id.name)
TextInputEditText name;
@BindView(R.id.color)
TextInputEditText color;
@BindView(R.id.name_layout)
TextInputLayout nameLayout;
@BindView(R.id.toolbar)
Toolbar toolbar;
@BindView(R.id.progress_bar)
ProgressView progressView;
private CaldavCalendar caldavCalendar;
private CaldavAccount caldavAccount;
private int selectedTheme = -1;
private CreateCalendarViewModel createCalendarViewModel;
private DeleteCalendarViewModel deleteCalendarViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
protected int getLayout() {
return R.layout.activity_caldav_calendar_settings;
}
setContentView(R.layout.activity_caldav_calendar_settings);
@Override
protected void onCreate(Bundle savedInstanceState) {
Intent intent = getIntent();
caldavCalendar = intent.getParcelableExtra(EXTRA_CALDAV_CALENDAR);
ButterKnife.bind(this);
super.onCreate(savedInstanceState);
createCalendarViewModel = ViewModelProviders.of(this).get(CreateCalendarViewModel.class);
deleteCalendarViewModel = ViewModelProviders.of(this).get(DeleteCalendarViewModel.class);
Intent intent = getIntent();
caldavCalendar = intent.getParcelableExtra(EXTRA_CALDAV_CALENDAR);
if (caldavCalendar == null) {
caldavAccount = intent.getParcelableExtra(EXTRA_CALDAV_ACCOUNT);
} else {
@ -122,38 +90,10 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
if (caldavCalendar != null) {
name.setText(caldavCalendar.getName());
selectedTheme = caldavCalendar.getColor();
selectedIcon = caldavCalendar.getIcon();
}
} else {
selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME);
}
final boolean backButtonSavesTask = preferences.backButtonSavesTask();
toolbar.setTitle(
caldavCalendar == null ? getString(R.string.new_list) : caldavCalendar.getName());
toolbar.setNavigationIcon(
ContextCompat.getDrawable(
this,
backButtonSavesTask
? R.drawable.ic_outline_clear_24px
: R.drawable.ic_outline_save_24px));
toolbar.setNavigationOnClickListener(
v -> {
if (backButtonSavesTask) {
discard();
} else {
save();
}
});
if (caldavCalendar != null) {
toolbar.inflateMenu(R.menu.menu_caldav_calendar_settings);
}
toolbar.setOnMenuItemClickListener(this);
MenuColorizer.colorToolbar(this, toolbar);
color.setInputType(InputType.TYPE_NULL);
updateTheme();
if (caldavCalendar == null) {
name.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
@ -162,13 +102,18 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
createCalendarViewModel.observe(this, this::createSuccessful, this::requestFailed);
deleteCalendarViewModel.observe(this, this::onDeleted, this::requestFailed);
updateTheme();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
protected boolean isNew() {
return caldavCalendar == null;
}
outState.putInt(EXTRA_SELECTED_THEME, selectedTheme);
@Override
protected String getToolbarTitle() {
return isNew() ? getString(R.string.new_list) : caldavCalendar.getName();
}
@OnTextChanged(R.id.name)
@ -176,29 +121,13 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
nameLayout.setError(null);
}
@OnFocusChange(R.id.color)
void onFocusChange(boolean focused) {
if (focused) {
color.clearFocus();
showThemePicker();
}
}
@OnClick(R.id.color)
protected void showThemePicker() {
Intent intent = new Intent(CaldavCalendarSettingsActivity.this, ColorPickerActivity.class);
intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerActivity.ColorPalette.COLORS);
intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true);
intent.putExtra(ColorPickerActivity.EXTRA_THEME_INDEX, selectedTheme);
startActivityForResult(intent, REQUEST_COLOR_PICKER);
}
@Override
public void inject(ActivityComponent component) {
component.inject(this);
}
private void save() {
@Override
protected void save() {
if (requestInProgress()) {
return;
}
@ -272,7 +201,6 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
caldavCalendar.setName(getNewName());
caldavCalendar.setColor(selectedTheme);
caldavCalendar.setId(caldavDao.insert(caldavCalendar));
tracker.reportEvent(Events.CALDAV_LIST_ADDED);
setResult(
RESULT_OK,
new Intent().putExtra(MainActivity.OPEN_FILTER, new CaldavFilter(caldavCalendar)));
@ -282,6 +210,7 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
private void updateAccount() {
caldavCalendar.setName(getNewName());
caldavCalendar.setColor(selectedTheme);
caldavCalendar.setIcon(selectedIcon);
caldavDao.update(caldavCalendar);
setResult(
RESULT_OK,
@ -290,11 +219,13 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
finish();
}
private boolean hasChanges() {
@Override
protected boolean hasChanges() {
if (caldavCalendar == null) {
return !isEmpty(getNewName()) || selectedTheme != -1;
return !isEmpty(getNewName()) || selectedTheme != -1 || selectedIcon != -1;
}
return !caldavCalendar.getName().equals(getNewName())
|| selectedIcon != caldavCalendar.getIcon()
|| selectedTheme != caldavCalendar.getColor();
}
@ -310,88 +241,28 @@ public class CaldavCalendarSettingsActivity extends ThemedInjectingAppCompatActi
}
@Override
public void onBackPressed() {
if (preferences.backButtonSavesTask()) {
save();
} else {
discard();
protected void discard() {
if (!requestInProgress()) {
super.discard();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_COLOR_PICKER) {
if (resultCode == RESULT_OK) {
int index = data.getIntExtra(ColorPickerActivity.EXTRA_THEME_INDEX, 0);
tracker.reportEvent(Tracking.Events.SET_TAG_COLOR, Integer.toString(index));
selectedTheme = index;
updateTheme();
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
private void discard() {
if (requestInProgress()) {
return;
}
if (!hasChanges()) {
finish();
} else {
dialogBuilder
.newMessageDialog(R.string.discard_changes)
.setPositiveButton(R.string.discard, (dialog, which) -> finish())
.setNegativeButton(android.R.string.cancel, null)
.show();
protected void promptDelete() {
if (!requestInProgress()) {
super.promptDelete();
}
}
private void updateTheme() {
ThemeColor themeColor;
if (selectedTheme < 0) {
themeColor = this.themeColor;
color.setText(R.string.none);
} else {
themeColor = themeCache.getThemeColor(selectedTheme);
color.setText(themeColor.getName());
}
themeColor.apply(toolbar);
themeColor.applyToSystemBars(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.delete:
deleteCollection();
break;
}
return onOptionsItemSelected(item);
}
private void deleteCollection() {
if (requestInProgress()) {
return;
}
dialogBuilder
.newMessageDialog(R.string.delete_tag_confirmation, caldavCalendar.getName())
.setPositiveButton(
R.string.delete,
(dialog, which) -> {
showProgressIndicator();
deleteCalendarViewModel.deleteCalendar(client, caldavAccount, caldavCalendar);
})
.setNegativeButton(android.R.string.cancel, null)
.show();
protected void delete() {
showProgressIndicator();
deleteCalendarViewModel.deleteCalendar(client, caldavAccount, caldavCalendar);
}
private void onDeleted(boolean deleted) {
if (deleted) {
taskDeleter.delete(caldavCalendar);
tracker.reportEvent(Events.CALDAV_LIST_DELETED);
setResult(RESULT_OK, new Intent(TaskListFragment.ACTION_DELETED));
finish();
}

@ -8,6 +8,7 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import org.tasks.themes.CustomIcons;
@Entity(tableName = "caldav_lists")
public final class CaldavCalendar implements Parcelable {
@ -47,6 +48,9 @@ public final class CaldavCalendar implements Parcelable {
@ColumnInfo(name = "cdl_url")
private String url = "";
@ColumnInfo(name = "cdl_icon")
private Integer icon = -1;
public CaldavCalendar() {}
@Ignore
@ -64,6 +68,7 @@ public final class CaldavCalendar implements Parcelable {
color = source.readInt();
ctag = source.readString();
url = source.readString();
icon = source.readInt();
}
public long getId() {
@ -122,6 +127,14 @@ public final class CaldavCalendar implements Parcelable {
this.url = url;
}
public Integer getIcon() {
return icon == null ? CustomIcons.getCLOUD() : icon;
}
public void setIcon(Integer icon) {
this.icon = icon;
}
@Override
public int describeContents() {
return 0;
@ -136,31 +149,7 @@ public final class CaldavCalendar implements Parcelable {
dest.writeInt(color);
dest.writeString(ctag);
dest.writeString(url);
}
@Override
public String toString() {
return "CaldavCalendar{"
+ "id="
+ id
+ ", account='"
+ account
+ '\''
+ ", uuid='"
+ uuid
+ '\''
+ ", name='"
+ name
+ '\''
+ ", color="
+ color
+ ", ctag='"
+ ctag
+ '\''
+ ", url='"
+ url
+ '\''
+ '}';
dest.writeInt(getIcon());
}
@Override
@ -192,7 +181,10 @@ public final class CaldavCalendar implements Parcelable {
if (ctag != null ? !ctag.equals(that.ctag) : that.ctag != null) {
return false;
}
return url != null ? url.equals(that.url) : that.url == null;
if (url != null ? !url.equals(that.url) : that.url != null) {
return false;
}
return icon != null ? icon.equals(that.icon) : that.icon == null;
}
@Override
@ -204,6 +196,34 @@ public final class CaldavCalendar implements Parcelable {
result = 31 * result + color;
result = 31 * result + (ctag != null ? ctag.hashCode() : 0);
result = 31 * result + (url != null ? url.hashCode() : 0);
result = 31 * result + (icon != null ? icon.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "CaldavCalendar{"
+ "id="
+ id
+ ", account='"
+ account
+ '\''
+ ", uuid='"
+ uuid
+ '\''
+ ", name='"
+ name
+ '\''
+ ", color="
+ color
+ ", ctag='"
+ ctag
+ '\''
+ ", url='"
+ url
+ '\''
+ ", icon="
+ icon
+ '}';
}
}

@ -6,6 +6,7 @@ import androidx.room.PrimaryKey;
import com.google.common.base.Strings;
import com.todoroo.andlib.utility.AndroidUtilities;
import java.util.Map;
import org.tasks.themes.CustomIcons;
@Entity(tableName = "filters")
public class Filter {
@ -26,6 +27,12 @@ public class Filter {
@ColumnInfo(name = "criterion")
private String criterion;
@ColumnInfo(name = "f_color")
private Integer color = -1;
@ColumnInfo(name = "f_icon")
private Integer icon = -1;
public long getId() {
return id;
}
@ -70,6 +77,66 @@ public class Filter {
this.criterion = criterion;
}
public Integer getColor() {
return color == null ? -1 : color;
}
public void setColor(Integer color) {
this.color = color;
}
public Integer getIcon() {
return icon == null ? CustomIcons.getFILTER() : icon;
}
public void setIcon(Integer icon) {
this.icon = icon;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Filter)) {
return false;
}
Filter filter = (Filter) o;
if (id != filter.id) {
return false;
}
if (title != null ? !title.equals(filter.title) : filter.title != null) {
return false;
}
if (sql != null ? !sql.equals(filter.sql) : filter.sql != null) {
return false;
}
if (values != null ? !values.equals(filter.values) : filter.values != null) {
return false;
}
if (criterion != null ? !criterion.equals(filter.criterion) : filter.criterion != null) {
return false;
}
if (color != null ? !color.equals(filter.color) : filter.color != null) {
return false;
}
return icon != null ? icon.equals(filter.icon) : filter.icon == null;
}
@Override
public int hashCode() {
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (title != null ? title.hashCode() : 0);
result = 31 * result + (sql != null ? sql.hashCode() : 0);
result = 31 * result + (values != null ? values.hashCode() : 0);
result = 31 * result + (criterion != null ? criterion.hashCode() : 0);
result = 31 * result + (color != null ? color.hashCode() : 0);
result = 31 * result + (icon != null ? icon.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "Filter{"
@ -87,6 +154,10 @@ public class Filter {
+ ", criterion='"
+ criterion
+ '\''
+ ", color="
+ color
+ ", icon="
+ icon
+ '}';
}
}

@ -6,6 +6,7 @@ import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import org.tasks.themes.CustomIcons;
@Entity(tableName = "google_task_lists")
public class GoogleTaskList implements Parcelable {
@ -45,6 +46,9 @@ public class GoogleTaskList implements Parcelable {
@ColumnInfo(name = "gtl_color")
private Integer color;
@ColumnInfo(name = "gtl_icon")
private Integer icon = -1;
public GoogleTaskList() {}
@Ignore
@ -56,6 +60,7 @@ public class GoogleTaskList implements Parcelable {
remoteOrder = parcel.readInt();
lastSync = parcel.readLong();
color = parcel.readInt();
icon = parcel.readInt();
}
public long getId() {
@ -114,6 +119,31 @@ public class GoogleTaskList implements Parcelable {
this.color = color;
}
public Integer getIcon() {
return icon == null ? CustomIcons.getCLOUD() : icon;
}
public void setIcon(Integer icon) {
this.icon = icon;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeLong(id);
parcel.writeString(account);
parcel.writeString(remoteId);
parcel.writeString(title);
parcel.writeInt(remoteOrder);
parcel.writeLong(lastSync);
parcel.writeInt(getColor());
parcel.writeInt(getIcon());
}
@Override
public boolean equals(Object o) {
if (this == o) {
@ -143,7 +173,10 @@ public class GoogleTaskList implements Parcelable {
if (title != null ? !title.equals(that.title) : that.title != null) {
return false;
}
return color != null ? color.equals(that.color) : that.color == null;
if (color != null ? !color.equals(that.color) : that.color != null) {
return false;
}
return icon != null ? icon.equals(that.icon) : that.icon == null;
}
@Override
@ -155,6 +188,7 @@ public class GoogleTaskList implements Parcelable {
result = 31 * result + remoteOrder;
result = 31 * result + (int) (lastSync ^ (lastSync >>> 32));
result = 31 * result + (color != null ? color.hashCode() : 0);
result = 31 * result + (icon != null ? icon.hashCode() : 0);
return result;
}
@ -178,22 +212,8 @@ public class GoogleTaskList implements Parcelable {
+ lastSync
+ ", color="
+ color
+ ", icon="
+ icon
+ '}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeLong(id);
parcel.writeString(account);
parcel.writeString(remoteId);
parcel.writeString(title);
parcel.writeInt(remoteOrder);
parcel.writeLong(lastSync);
parcel.writeInt(getColor());
}
}

@ -9,6 +9,7 @@ import androidx.room.Ignore;
import androidx.room.PrimaryKey;
import com.todoroo.astrid.data.Task;
import org.tasks.backup.XmlReader;
import org.tasks.themes.CustomIcons;
@Entity(tableName = "tagdata")
public final class TagData implements Parcelable {
@ -42,6 +43,9 @@ public final class TagData implements Parcelable {
@ColumnInfo(name = "tagOrdering")
private String tagOrdering = "[]";
@ColumnInfo(name = "td_icon")
private Integer icon = -1;
public TagData() {}
@Ignore
@ -60,6 +64,7 @@ public final class TagData implements Parcelable {
name = parcel.readString();
color = parcel.readInt();
tagOrdering = parcel.readString();
icon = parcel.readInt();
}
public Long getId() {
@ -102,6 +107,14 @@ public final class TagData implements Parcelable {
this.color = color;
}
public Integer getIcon() {
return icon == null ? CustomIcons.getLABEL() : icon;
}
public void setIcon(Integer icon) {
this.icon = icon;
}
@Override
public int describeContents() {
return 0;
@ -114,6 +127,7 @@ public final class TagData implements Parcelable {
dest.writeString(name);
dest.writeInt(color);
dest.writeString(tagOrdering);
dest.writeInt(getIcon());
}
@Override
@ -121,7 +135,7 @@ public final class TagData implements Parcelable {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
if (!(o instanceof TagData)) {
return false;
}
@ -139,9 +153,12 @@ public final class TagData implements Parcelable {
if (color != null ? !color.equals(tagData.color) : tagData.color != null) {
return false;
}
return tagOrdering != null
? tagOrdering.equals(tagData.tagOrdering)
: tagData.tagOrdering == null;
if (tagOrdering != null
? !tagOrdering.equals(tagData.tagOrdering)
: tagData.tagOrdering != null) {
return false;
}
return icon != null ? icon.equals(tagData.icon) : tagData.icon == null;
}
@Override
@ -151,6 +168,7 @@ public final class TagData implements Parcelable {
result = 31 * result + (name != null ? name.hashCode() : 0);
result = 31 * result + (color != null ? color.hashCode() : 0);
result = 31 * result + (tagOrdering != null ? tagOrdering.hashCode() : 0);
result = 31 * result + (icon != null ? icon.hashCode() : 0);
return result;
}
@ -167,6 +185,8 @@ public final class TagData implements Parcelable {
+ '\''
+ ", color="
+ color
+ ", icon="
+ icon
+ ", tagOrdering='"
+ tagOrdering
+ '\''

@ -277,7 +277,7 @@ public class Migrations {
database.execSQL("DROP TABLE `caldav_account`");
database.execSQL(
"CREATE TABLE IF NOT EXISTS `caldav_lists` (`cdl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `cdl_account` TEXT, `cdl_uuid` TEXT, `cdl_name` TEXT, `cdl_color` INTEGER NOT NULL, `cdl_ctag` TEXT, `cdl_url` TEXT)");
"CREATE TABLE IF NOT EXISTS `caldav_lists` (`cdl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `cdl_account` TEXT, `cdl_uuid` TEXT, `cdl_name` TEXT, `cdl_color` INTEGER NOT NULL, `cdl_ctag` TEXT, `cdl_url` TEXT, `cdl_icon` INTEGER)");
database.execSQL(
"INSERT INTO `caldav_lists` (`cdl_id`, `cdl_account`, `cdl_uuid`, `cdl_name`, `cdl_color`, `cdl_ctag`, `cdl_url`) "
+ "SELECT `_id`, `account`, `uuid`, `name`, `color`, `ctag`, `url` FROM caldav_calendar");
@ -293,11 +293,15 @@ public class Migrations {
database.execSQL("ALTER TABLE `google_task_lists` RENAME TO `gtl-temp`");
database.execSQL(
"CREATE TABLE IF NOT EXISTS `google_task_lists` (`gtl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `gtl_account` TEXT, `gtl_remote_id` TEXT, `gtl_title` TEXT, `gtl_remote_order` INTEGER NOT NULL, `gtl_last_sync` INTEGER NOT NULL, `gtl_color` INTEGER)");
"CREATE TABLE IF NOT EXISTS `google_task_lists` (`gtl_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `gtl_account` TEXT, `gtl_remote_id` TEXT, `gtl_title` TEXT, `gtl_remote_order` INTEGER NOT NULL, `gtl_last_sync` INTEGER NOT NULL, `gtl_color` INTEGER, `gtl_icon` INTEGER)");
database.execSQL(
"INSERT INTO `google_task_lists` (`gtl_id`, `gtl_account`, `gtl_remote_id`, `gtl_title`, `gtl_remote_order`, `gtl_last_sync`, `gtl_color`) "
+ "SELECT `_id`, `account`, `remote_id`, `title`, `remote_order`, `last_sync`, `color` FROM `gtl-temp`");
database.execSQL("DROP TABLE `gtl-temp`");
database.execSQL("ALTER TABLE `filters` ADD COLUMN `f_color` INTEGER");
database.execSQL("ALTER TABLE `filters` ADD COLUMN `f_icon` INTEGER");
database.execSQL("ALTER TABLE `tagdata` ADD COLUMN `td_icon` INTEGER");
}
};

@ -104,8 +104,8 @@ public class AlertDialogBuilder {
}
public AlertDialogBuilder setNeutralButton(
int reverse, DialogInterface.OnClickListener onClickListener) {
builder.setNeutralButton(reverse, onClickListener);
int resId, DialogInterface.OnClickListener onClickListener) {
builder.setNeutralButton(resId, onClickListener);
return this;
}

@ -0,0 +1,25 @@
package org.tasks.dialogs;
import android.content.Context;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import org.tasks.R;
class IconLayoutManager extends GridLayoutManager {
private int iconSize;
IconLayoutManager(Context context) {
super(context, DEFAULT_SPAN_COUNT, RecyclerView.VERTICAL, false);
this.iconSize = (int) context.getResources().getDimension(R.dimen.icon_picker_size);
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
int width = getWidth();
if (getSpanCount() == DEFAULT_SPAN_COUNT && iconSize > 0 && width > 0 && getHeight() > 0) {
setSpanCount(Math.max(1, (width - getPaddingRight() - getPaddingLeft()) / iconSize));
}
super.onLayoutChildren(recycler, state);
}
}

@ -0,0 +1,59 @@
package org.tasks.dialogs;
import android.app.Activity;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil.ItemCallback;
import androidx.recyclerview.widget.ListAdapter;
import org.tasks.Callback;
import org.tasks.R;
import org.tasks.billing.Inventory;
import org.tasks.themes.CustomIcons;
public class IconPickerAdapter extends ListAdapter<Integer, IconPickerHolder> {
private final Activity activity;
private final Inventory inventory;
private final int current;
private final Callback<Integer> onSelected;
public IconPickerAdapter(
Activity activity, Inventory inventory, int current, Callback<Integer> onSelected) {
super(new DiffCallback());
this.activity = activity;
this.inventory = inventory;
this.current = current;
this.onSelected = onSelected;
}
@NonNull
@Override
public IconPickerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new IconPickerHolder(
activity,
inventory,
activity.getLayoutInflater().inflate(R.layout.dialog_icon_picker_cell, parent, false),
onSelected);
}
@Override
public void onBindViewHolder(@NonNull IconPickerHolder holder, int position) {
int index = CustomIcons.getIndex(position);
Integer icon = CustomIcons.getIconResId(index);
if (icon != null) {
holder.bind(index, icon, index == current);
}
}
private static class DiffCallback extends ItemCallback<Integer> {
@Override
public boolean areItemsTheSame(@NonNull Integer oldItem, @NonNull Integer newItem) {
return oldItem.equals(newItem);
}
@Override
public boolean areContentsTheSame(@NonNull Integer oldItem, @NonNull Integer newItem) {
return true;
}
}
}

@ -0,0 +1,92 @@
package org.tasks.dialogs;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import javax.inject.Inject;
import org.tasks.R;
import org.tasks.billing.Inventory;
import org.tasks.billing.PurchaseActivity;
import org.tasks.injection.DialogFragmentComponent;
import org.tasks.injection.ForActivity;
import org.tasks.injection.InjectingDialogFragment;
import org.tasks.themes.CustomIcons;
public class IconPickerDialog extends InjectingDialogFragment {
private static final String EXTRA_CURRENT = "extra_current";
@BindView(R.id.icons)
RecyclerView recyclerView;
@Inject DialogBuilder dialogBuilder;
@Inject @ForActivity Context context;
@Inject Inventory inventory;
private IconPickerCallback callback;
public static IconPickerDialog newIconPicker(int currentIcon) {
IconPickerDialog dialog = new IconPickerDialog();
Bundle args = new Bundle();
args.putInt(EXTRA_CURRENT, currentIcon);
dialog.setArguments(args);
return dialog;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.dialog_icon_picker, null);
ButterKnife.bind(this, view);
Bundle arguments = getArguments();
int current = arguments.getInt(EXTRA_CURRENT);
IconPickerAdapter iconPickerAdapter =
new IconPickerAdapter((Activity) context, inventory, current, this::onSelected);
recyclerView.setLayoutManager(new IconLayoutManager(context));
recyclerView.setAdapter(iconPickerAdapter);
iconPickerAdapter.submitList(CustomIcons.getIconList());
AlertDialogBuilder builder =
dialogBuilder.newDialog().setNegativeButton(android.R.string.cancel, null).setView(view);
if (!inventory.hasPro()) {
builder.setPositiveButton(
R.string.button_subscribe,
(dialog, which) -> startActivity(new Intent(context, PurchaseActivity.class)));
}
return builder.show();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
callback = (IconPickerCallback) activity;
}
private void onSelected(int index) {
callback.onSelected(getDialog(), index);
}
@Override
protected void inject(DialogFragmentComponent component) {
component.inject(this);
}
public interface IconPickerCallback {
void onSelected(DialogInterface d, int icon);
}
}

@ -0,0 +1,67 @@
package org.tasks.dialogs;
import static org.tasks.preferences.ResourceResolver.getData;
import static org.tasks.preferences.ResourceResolver.getDimen;
import android.content.Context;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.core.graphics.drawable.DrawableCompat;
import androidx.recyclerview.widget.RecyclerView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import org.tasks.Callback;
import org.tasks.R;
import org.tasks.billing.Inventory;
public class IconPickerHolder extends RecyclerView.ViewHolder {
private final Context context;
private final Callback<Integer> onClick;
private final Inventory inventory;
@BindView(R.id.icon)
AppCompatImageView imageView;
private int index;
public IconPickerHolder(
Context context, Inventory inventory, @NonNull View view, Callback<Integer> onClick) {
super(view);
this.inventory = inventory;
ButterKnife.bind(this, view);
this.context = context;
this.onClick = onClick;
}
@OnClick(R.id.icon)
void onClick() {
if (isEnabled()) {
onClick.call(index);
} else {
Toast.makeText(context, R.string.requires_pro_subscription, Toast.LENGTH_SHORT).show();
}
}
public void bind(int index, int icon, boolean selected) {
this.index = index;
imageView.setImageResource(icon);
if (inventory.hasPro()) {
imageView.setAlpha(getDimen(context, R.dimen.alpha_secondary));
} else {
imageView.setAlpha(index < 1000 ? 1.0f : getDimen(context, R.dimen.alpha_disabled));
}
DrawableCompat.setTint(
imageView.getDrawable(),
getData(context, selected ? R.attr.colorAccent : R.attr.icon_tint));
}
private boolean isEnabled() {
return index < 1000 || inventory.hasPro();
}
}

@ -6,6 +6,7 @@ import org.tasks.activities.RemoteListSupportPicker;
import org.tasks.dialogs.AddAttachmentDialog;
import org.tasks.dialogs.ColorPickerDialog;
import org.tasks.dialogs.GeofenceDialog;
import org.tasks.dialogs.IconPickerDialog;
import org.tasks.dialogs.RecordAudioDialog;
import org.tasks.dialogs.SeekBarDialog;
import org.tasks.dialogs.SortDialog;
@ -40,4 +41,6 @@ public interface DialogFragmentComponent {
void inject(GeofenceDialog geofenceDialog);
void inject(SeekBarDialog seekBarDialog);
void inject(IconPickerDialog iconPickerDialog);
}

@ -0,0 +1,140 @@
package org.tasks.themes
import org.tasks.R
object CustomIcons {
@kotlin.jvm.JvmStatic
val LABEL = 1
@kotlin.jvm.JvmStatic
val FILTER = 2
@kotlin.jvm.JvmStatic
val CLOUD = 3
@kotlin.jvm.JvmStatic
val ALL_INBOX = 4
@kotlin.jvm.JvmStatic
val LABEL_OFF = 5
@kotlin.jvm.JvmStatic
val HISTORY = 6
@kotlin.jvm.JvmStatic
val TODAY = 7
@kotlin.jvm.JvmField
var ICONS = mapOf(
LABEL to R.drawable.ic_outline_label_24px,
FILTER to R.drawable.ic_outline_filter_list_24px,
CLOUD to R.drawable.ic_outline_cloud_24px,
ALL_INBOX to R.drawable.ic_outline_all_inbox_24px,
LABEL_OFF to R.drawable.ic_outline_label_off_24px,
HISTORY to R.drawable.ic_outline_history_24px,
TODAY to R.drawable.ic_outline_today_24px,
1000 to R.drawable.ic_outline_flag_24px,
1062 to R.drawable.ic_outline_home_24px,
1041 to R.drawable.ic_outline_work_outline_24px,
1001 to R.drawable.ic_outline_pets_24px,
1002 to R.drawable.ic_outline_payment_24px,
1003 to R.drawable.ic_outline_attach_money_24px,
1059 to R.drawable.ic_outline_euro_symbol_24px,
1042 to R.drawable.ic_outline_store_24px,
1043 to R.drawable.ic_outline_shopping_cart_24px,
1004 to R.drawable.ic_outline_hourglass_empty_24px,
1005 to R.drawable.ic_outline_favorite_border_24px,
1006 to R.drawable.ic_outline_school_24px,
1007 to R.drawable.ic_outline_drive_eta_24px,
1008 to R.drawable.ic_outline_whatshot_24px,
1009 to R.drawable.ic_outline_star_border_24px,
1010 to R.drawable.ic_outline_account_balance_24px,
1011 to R.drawable.ic_outline_location_city_24px,
1012 to R.drawable.ic_outline_cake_24px,
1013 to R.drawable.ic_outline_kitchen_24px,
1014 to R.drawable.ic_outline_fitness_center_24px,
1015 to R.drawable.ic_outline_child_friendly_24px,
1016 to R.drawable.ic_outline_free_breakfast_24px,
1017 to R.drawable.ic_outline_golf_course_24px,
1018 to R.drawable.ic_outline_beach_access_24px,
1019 to R.drawable.ic_outline_restaurant_menu_24px,
1020 to R.drawable.ic_outline_local_pharmacy_24px,
1021 to R.drawable.ic_outline_fastfood_24px,
1022 to R.drawable.ic_outline_hotel_24px,
1023 to R.drawable.ic_outline_flight_24px,
1057 to R.drawable.ic_outline_flight_takeoff_24px,
1058 to R.drawable.ic_outline_flight_land_24px,
1024 to R.drawable.ic_outline_directions_run_24px,
1025 to R.drawable.ic_outline_wb_sunny_24px,
1026 to R.drawable.ic_outline_desktop_mac_24px,
1027 to R.drawable.ic_outline_computer_24px,
1028 to R.drawable.ic_outline_format_paint_24px,
1029 to R.drawable.ic_outline_storage_24px,
1030 to R.drawable.ic_outline_send_24px,
1031 to R.drawable.ic_outline_weekend_24px,
1032 to R.drawable.ic_outline_link_24px,
1033 to R.drawable.ic_outline_business_24px,
1034 to R.drawable.ic_outline_chat_bubble_outline_24px,
1035 to R.drawable.ic_outline_voicemail_24px,
1036 to R.drawable.ic_outline_email_24px,
1037 to R.drawable.ic_outline_call_24px,
1039 to R.drawable.ic_outline_movie_24px,
1040 to R.drawable.ic_outline_equalizer_24px,
1071 to R.drawable.ic_outline_pie_chart_24px,
1072 to R.drawable.ic_outline_show_chart_24px,
1044 to R.drawable.ic_outline_schedule_24px,
1045 to R.drawable.ic_outline_photo_camera_24px,
1046 to R.drawable.ic_outline_delete_24px,
1047 to R.drawable.ic_outline_attachment_24px,
1048 to R.drawable.ic_outline_vpn_key_24px,
1049 to R.drawable.ic_outline_event_24px,
1050 to R.drawable.ic_outline_place_24px,
1051 to R.drawable.ic_outline_markunread_mailbox_24px,
1052 to R.drawable.ic_outline_label_important_24px,
1053 to R.drawable.ic_outline_android_24px,
1054 to R.drawable.ic_outline_build_24px,
1055 to R.drawable.ic_outline_bug_report_24px,
1056 to R.drawable.ic_outline_book_24px,
1060 to R.drawable.ic_outline_explore_24px,
1061 to R.drawable.ic_outline_gavel_24px,
1063 to R.drawable.ic_outline_print_24px,
1064 to R.drawable.ic_outline_receipt_24px,
1038 to R.drawable.ic_outline_new_releases_24px,
1065 to R.drawable.ic_outline_report_problem_24px,
1068 to R.drawable.ic_outline_error_outline_24px,
1069 to R.drawable.ic_outline_not_interested_24px,
1070 to R.drawable.ic_outline_report_24px,
1066 to R.drawable.ic_outline_turned_in_24px,
1067 to R.drawable.ic_outline_turned_in_not_24px,
1073 to R.drawable.ic_outline_headset_24px,
1074 to R.drawable.ic_outline_mic_none_24px,
1075 to R.drawable.ic_outline_timer_24px,
1076 to R.drawable.ic_outline_clear_24px,
1077 to R.drawable.ic_outline_search_24px,
1078 to R.drawable.ic_outline_repeat_24px,
1079 to R.drawable.ic_outline_notifications_24px,
1080 to R.drawable.ic_outline_star_half_24px,
1081 to R.drawable.ic_outline_share_24px,
1082 to R.drawable.ic_outline_sentiment_very_satisfied_24px,
1083 to R.drawable.ic_outline_sentiment_very_dissatisfied_24px,
1084 to R.drawable.ic_outline_sentiment_satisfied_24px,
1085 to R.drawable.ic_outline_sentiment_dissatisfied_24px,
1086 to R.drawable.ic_outline_mood_bad_24px,
1087 to R.drawable.ic_outline_mood_24px,
1088 to R.drawable.ic_outline_spa_24px,
1089 to R.drawable.ic_outline_room_service_24px,
1090 to R.drawable.ic_outline_meeting_room_24px,
1091 to R.drawable.ic_outline_hot_tub_24px,
1092 to R.drawable.ic_outline_business_center_24px,
1093 to R.drawable.ic_outline_priority_high_24px)
@kotlin.jvm.JvmStatic
fun getIconList() = ICONS.keys.toList()
@kotlin.jvm.JvmStatic
fun getIconResId(index: Int) = ICONS[index]
@kotlin.jvm.JvmStatic
fun getIndex(position: Int) = getIconList()[position]
}

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6.5,10h-2v7h2v-7zM12.5,10h-2v7h2v-7zM21,19L2,19v2h19v-2zM18.5,10h-2v7h2v-7zM11.5,3.26L16.71,6L6.29,6l5.21,-2.74m0,-2.26L2,6v2h19L21,6l-9.5,-5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6,18c0,0.55 0.45,1 1,1h1v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L11,19h2v3.5c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5L16,19h1c0.55,0 1,-0.45 1,-1L18,8L6,8v10zM3.5,8C2.67,8 2,8.67 2,9.5v7c0,0.83 0.67,1.5 1.5,1.5S5,17.33 5,16.5v-7C5,8.67 4.33,8 3.5,8zM20.5,8c-0.83,0 -1.5,0.67 -1.5,1.5v7c0,0.83 0.67,1.5 1.5,1.5s1.5,-0.67 1.5,-1.5v-7c0,-0.83 -0.67,-1.5 -1.5,-1.5zM15.53,2.16l1.3,-1.3c0.2,-0.2 0.2,-0.51 0,-0.71s-0.51,-0.2 -0.71,0l-1.48,1.48C13.85,1.23 12.95,1 12,1c-0.96,0 -1.86,0.23 -2.66,0.63L7.85,0.15c-0.2,-0.2 -0.51,-0.2 -0.71,0 -0.2,0.2 -0.2,0.51 0,0.71l1.31,1.31C6.97,3.26 6,5.01 6,7h12c0,-1.99 -0.97,-3.75 -2.47,-4.84zM10,5L9,5L9,4h1v1zM15,5h-1L14,4h1v1z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21,19.57l-1.427,1.428 -6.442,-6.442 1.43,-1.428zM13.12,3c-2.58,0 -5.16,0.98 -7.14,2.95l-0.01,0.01c-3.95,3.95 -3.95,10.36 0,14.31l14.3,-14.31C18.3,3.99 15.71,3 13.12,3zM6.14,17.27C5.4,16.03 5,14.61 5,13.12c0,-0.93 0.16,-1.82 0.46,-2.67 0.19,1.91 0.89,3.79 2.07,5.44l-1.39,1.38zM8.98,14.43C7.63,12.38 7.12,9.93 7.6,7.6c0.58,-0.12 1.16,-0.18 1.75,-0.18 1.8,0 3.55,0.55 5.08,1.56l-5.45,5.45zM10.45,5.46c0.85,-0.3 1.74,-0.46 2.67,-0.46 1.49,0 2.91,0.4 4.15,1.14l-1.39,1.39c-1.65,-1.18 -3.52,-1.88 -5.43,-2.07z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18,2L6,2c-1.1,0 -2,0.9 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.1 -0.9,-2 -2,-2zM9,4h2v5l-1,-0.75L9,9L9,4zM18,20L6,20L6,4h1v9l3,-2.25L13,13L13,4h5v16z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5s-0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM16,12v3c0,0.22 -0.03,0.47 -0.07,0.7l-0.1,0.65 -0.37,0.65c-0.72,1.24 -2.04,2 -3.46,2s-2.74,-0.77 -3.46,-2l-0.37,-0.64 -0.1,-0.65C8.03,15.48 8,15.23 8,15v-4c0,-0.23 0.03,-0.48 0.07,-0.7l0.1,-0.65 0.37,-0.65c0.3,-0.52 0.72,-0.97 1.21,-1.31l0.57,-0.39 0.74,-0.18c0.31,-0.08 0.63,-0.12 0.94,-0.12 0.32,0 0.63,0.04 0.95,0.12l0.68,0.16 0.61,0.42c0.5,0.34 0.91,0.78 1.21,1.31l0.38,0.65 0.1,0.65c0.04,0.22 0.07,0.47 0.07,0.69v1zM10,14h4v2h-4zM10,10h4v2h-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M22.61,18.99l-9.08,-9.08c0.93,-2.34 0.45,-5.1 -1.44,-7C9.79,0.61 6.21,0.4 3.66,2.26L7.5,6.11 6.08,7.52 2.25,3.69C0.39,6.23 0.6,9.82 2.9,12.11c1.86,1.86 4.57,2.35 6.89,1.48l9.11,9.11c0.39,0.39 1.02,0.39 1.41,0l2.3,-2.3c0.4,-0.38 0.4,-1.01 0,-1.41zM19.61,20.59l-9.46,-9.46c-0.61,0.45 -1.29,0.72 -2,0.82 -1.36,0.2 -2.79,-0.21 -3.83,-1.25C3.37,9.76 2.93,8.5 3,7.26l3.09,3.09 4.24,-4.24 -3.09,-3.09c1.24,-0.07 2.49,0.37 3.44,1.31 1.08,1.08 1.49,2.57 1.24,3.96 -0.12,0.71 -0.42,1.37 -0.88,1.96l9.45,9.45 -0.88,0.89z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,7L12,3L2,3v18h20L22,7L12,7zM6,19L4,19v-2h2v2zM6,15L4,15v-2h2v2zM6,11L4,11L4,9h2v2zM6,7L4,7L4,5h2v2zM10,19L8,19v-2h2v2zM10,15L8,15v-2h2v2zM10,11L8,11L8,9h2v2zM10,7L8,7L8,5h2v2zM20,19h-8v-2h2v-2h-2v-2h2v-2h-2L12,9h8v10zM18,11h-2v2h2v-2zM18,15h-2v2h2v-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,7h-4L16,5l-2,-2h-4L8,5v2L4,7c-1.1,0 -2,0.9 -2,2v5c0,0.75 0.4,1.38 1,1.73L3,19c0,1.11 0.89,2 2,2h14c1.11,0 2,-0.89 2,-2v-3.28c0.59,-0.35 1,-0.99 1,-1.72L22,9c0,-1.1 -0.9,-2 -2,-2zM10,5h4v2h-4L10,5zM4,9h16v5h-5v-3L9,11v3L4,14L4,9zM13,15h-2v-2h2v2zM19,19L5,19v-3h4v1h6v-1h4v3z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,6c1.11,0 2,-0.9 2,-2 0,-0.38 -0.1,-0.73 -0.29,-1.03L12,0l-1.71,2.97c-0.19,0.3 -0.29,0.65 -0.29,1.03 0,1.1 0.9,2 2,2zM18,9h-5L13,7h-2v2L6,9c-1.66,0 -3,1.34 -3,3v9c0,0.55 0.45,1 1,1h16c0.55,0 1,-0.45 1,-1v-9c0,-1.66 -1.34,-3 -3,-3zM19,20L5,20v-3c0.9,-0.01 1.76,-0.37 2.4,-1.01l1.09,-1.07 1.07,1.07c1.31,1.31 3.59,1.3 4.89,0l1.08,-1.07 1.07,1.07c0.64,0.64 1.5,1 2.4,1.01v3zM19,15.5c-0.51,-0.01 -0.99,-0.2 -1.35,-0.57l-2.13,-2.13 -2.14,2.13c-0.74,0.74 -2.03,0.74 -2.77,0L8.48,12.8l-2.14,2.13c-0.35,0.36 -0.83,0.56 -1.34,0.57L5,12c0,-0.55 0.45,-1 1,-1h12c0.55,0 1,0.45 1,1v3.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6.54,5c0.06,0.89 0.21,1.76 0.45,2.59l-1.2,1.2c-0.41,-1.2 -0.67,-2.47 -0.76,-3.79h1.51m9.86,12.02c0.85,0.24 1.72,0.39 2.6,0.45v1.49c-1.32,-0.09 -2.59,-0.35 -3.8,-0.75l1.2,-1.19M7.5,3H4c-0.55,0 -1,0.45 -1,1 0,9.39 7.61,17 17,17 0.55,0 1,-0.45 1,-1v-3.49c0,-0.55 -0.45,-1 -1,-1 -1.24,0 -2.45,-0.2 -3.57,-0.57 -0.1,-0.04 -0.21,-0.05 -0.31,-0.05 -0.26,0 -0.51,0.1 -0.71,0.29l-2.2,2.2c-2.83,-1.45 -5.15,-3.76 -6.59,-6.59l2.2,-2.2c0.28,-0.28 0.36,-0.67 0.25,-1.02C8.7,6.45 8.5,5.25 8.5,4c0,-0.55 -0.45,-1 -1,-1z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,2L4,2c-1.1,0 -2,0.9 -2,2v18l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,16L6,16l-2,2L4,4h16v12z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M13,2v8h8c0,-4.42 -3.58,-8 -8,-8zM15,8L15,4.34c1.7,0.6 3.05,1.95 3.66,3.66L15,8zM6.44,11l-0.95,-2L2,9v2h2.22s1.89,4.07 2.12,4.42c-1.1,0.59 -1.84,1.75 -1.84,3.08C4.5,20.43 6.07,22 8,22c1.76,0 3.22,-1.3 3.46,-3h2.08c0.24,1.7 1.7,3 3.46,3 1.93,0 3.5,-1.57 3.5,-3.5 0,-1.04 -0.46,-1.97 -1.18,-2.61C20.37,14.54 21,12.84 21,11L6.44,11zM8,20c-0.83,0 -1.5,-0.67 -1.5,-1.5S7.17,17 8,17s1.5,0.67 1.5,1.5S8.83,20 8,20zM17,20c-0.83,0 -1.5,-0.67 -1.5,-1.5S16.17,17 17,17s1.5,0.67 1.5,1.5S17.83,20 17,20zM17.74,14.66l-0.29,0.37c-0.14,-0.02 -0.3,-0.03 -0.45,-0.03 -1.39,0 -2.6,0.82 -3.16,2h-2.68c-0.5,-1.04 -1.5,-1.8 -2.68,-1.97l-0.44,-0.67c-0.1,-0.17 -0.34,-0.69 -0.67,-1.36h11.29c-0.21,0.59 -0.52,1.15 -0.92,1.66z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,18c1.1,0 1.99,-0.9 1.99,-2L22,6c0,-1.1 -0.9,-2 -2,-2H4c-1.1,0 -2,0.9 -2,2v10c0,1.1 0.9,2 2,2H0v2h24v-2h-4zM4,6h16v10H4V6z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21,2L3,2c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h7l-2,3v1h8v-1l-2,-3h7c1.1,0 2,-0.9 2,-2L23,4c0,-1.1 -0.9,-2 -2,-2zM21,14L3,14L3,4h18v10z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M13.49,5.48c1.1,0 2,-0.9 2,-2s-0.9,-2 -2,-2 -2,0.9 -2,2 0.9,2 2,2zM9.89,19.38l1,-4.4 2.1,2v6h2v-7.5l-2.1,-2 0.6,-3c1.3,1.5 3.3,2.5 5.5,2.5v-2c-1.9,0 -3.5,-1 -4.3,-2.4l-1,-1.6c-0.4,-0.6 -1,-1 -1.7,-1 -0.3,0 -0.5,0.1 -0.8,0.1l-5.2,2.2v4.7h2v-3.4l1.8,-0.7 -1.6,8.1 -4.9,-1 -0.4,2 7,1.4z"/>
</vector>

@ -0,0 +1,7 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18.92,5.01C18.72,4.42 18.16,4 17.5,4h-11c-0.66,0 -1.21,0.42 -1.42,1.01L3,11v8c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-1h12v1c0,0.55 0.45,1 1,1h1c0.55,0 1,-0.45 1,-1v-8l-2.08,-5.99zM6.85,6h10.29l1.04,3H5.81l1.04,-3zM19,16H5v-4.66l0.12,-0.34h13.77l0.11,0.34V16z"/>
<path android:fillColor="#FF000000" android:pathData="M7.5,13.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M16.5,13.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M22,6c0,-1.1 -0.9,-2 -2,-2L4,4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,6zM20,6l-8,5 -8,-5h16zM20,18L4,18L4,8l8,5 8,-5v10z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M10,20h4L14,4h-4v16zM4,20h4v-8L4,12v8zM16,9v11h4L20,9h-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M11,15h2v2h-2v-2zM11,7h2v6h-2L11,7zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15,18.5c-2.51,0 -4.68,-1.42 -5.76,-3.5H15v-2H8.58c-0.05,-0.33 -0.08,-0.66 -0.08,-1s0.03,-0.67 0.08,-1H15V9H9.24C10.32,6.92 12.5,5.5 15,5.5c1.61,0 3.09,0.59 4.23,1.57L21,5.3C19.41,3.87 17.3,3 15,3c-3.92,0 -7.24,2.51 -8.48,6H3v2h3.06c-0.04,0.33 -0.06,0.66 -0.06,1s0.02,0.67 0.06,1H3v2h3.52c1.24,3.49 4.56,6 8.48,6 2.31,0 4.41,-0.87 6,-2.3l-1.78,-1.77c-1.13,0.98 -2.6,1.57 -4.22,1.57z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM6.5,17.5l7.51,-3.49L17.5,6.5 9.99,9.99 6.5,17.5zM12,10.9c0.61,0 1.1,0.49 1.1,1.1s-0.49,1.1 -1.1,1.1 -1.1,-0.49 -1.1,-1.1 0.49,-1.1 1.1,-1.1z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M1,21.98c0,0.56 0.45,1.01 1.01,1.01H15c0.56,0 1.01,-0.45 1.01,-1.01V21H1v0.98zM8.5,8.99C4.75,8.99 1,11 1,15h15c0,-4 -3.75,-6.01 -7.5,-6.01zM3.62,13c1.11,-1.55 3.47,-2.01 4.88,-2.01s3.77,0.46 4.88,2.01H3.62zM1,17h15v2H1zM18,5V1h-2v4h-5l0.23,2h9.56l-1.4,14H18v2h1.72c0.84,0 1.53,-0.65 1.63,-1.47L23,5h-5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20.57,14.86L22,13.43 20.57,12 17,15.57 8.43,7 12,3.43 10.57,2 9.14,3.43 7.71,2 5.57,4.14 4.14,2.71 2.71,4.14l1.43,1.43L2,7.71l1.43,1.43L2,10.57 3.43,12 7,8.43 15.57,17 12,20.57 13.43,22l1.43,-1.43L16.29,22l2.14,-2.14 1.43,1.43 1.43,-1.43 -1.43,-1.43L22,16.29l-1.43,-1.43z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21,16v-2l-8,-5V3.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S10,2.67 10,3.5V9l-8,5v2l8,-2.5V19l-2,1.5V22l3.5,-1 3.5,1v-1.5L13,19v-5.5l8,2.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M2.5,19h19v2h-19v-2zM19.34,15.85c0.8,0.21 1.62,-0.26 1.84,-1.06 0.21,-0.8 -0.26,-1.62 -1.06,-1.84l-5.31,-1.42 -2.76,-9.02L10.12,2v8.28L5.15,8.95l-0.93,-2.32 -1.45,-0.39v5.17l16.57,4.44z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M2.5,19h19v2h-19v-2zM22.07,9.64c-0.21,-0.8 -1.04,-1.28 -1.84,-1.06L14.92,10l-6.9,-6.43 -1.93,0.51 4.14,7.17 -4.97,1.33 -1.97,-1.54 -1.45,0.39 2.59,4.49L21,11.49c0.81,-0.23 1.28,-1.05 1.07,-1.85z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18,4L18,3c0,-0.55 -0.45,-1 -1,-1L5,2c-0.55,0 -1,0.45 -1,1v4c0,0.55 0.45,1 1,1h12c0.55,0 1,-0.45 1,-1L18,6h1v4L9,10v11c0,0.55 0.45,1 1,1h2c0.55,0 1,-0.45 1,-1v-9h8L21,4h-3zM16,6L6,6L6,4h10v2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M4,19h16v2L4,21zM20,3L4,3v10c0,2.21 1.79,4 4,4h6c2.21,0 4,-1.79 4,-4v-3h2c1.11,0 2,-0.9 2,-2L22,5c0,-1.11 -0.89,-2 -2,-2zM16,13c0,1.1 -0.9,2 -2,2L8,15c-1.1,0 -2,-0.9 -2,-2L6,5h10v8zM20,8h-2L18,5h2v3z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M1,21h12v2H1v-2zM5.24,8.07l2.83,-2.83 14.14,14.14 -2.83,2.83L5.24,8.07zM12.32,1l5.66,5.66 -2.83,2.83 -5.66,-5.66L12.32,1zM3.83,9.48l5.66,5.66 -2.83,2.83L1,12.31l2.83,-2.83z"/>
</vector>

@ -0,0 +1,6 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19.5,19.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M17,5.92L9,2v18H7v-1.73c-1.79,0.35 -3,0.99 -3,1.73 0,1.1 2.69,2 6,2s6,-0.9 6,-2c0,-0.99 -2.16,-1.81 -5,-1.97V8.98l6,-3.06z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19,14v3c0,0.55 -0.45,1 -1,1h-1v-4h2M7,14v4H6c-0.55,0 -1,-0.45 -1,-1v-3h2m5,-13c-4.97,0 -9,4.03 -9,9v7c0,1.66 1.34,3 3,3h3v-8H5v-2c0,-3.87 3.13,-7 7,-7s7,3.13 7,7v2h-4v8h3c1.66,0 3,-1.34 3,-3v-7c0,-4.97 -4.03,-9 -9,-9z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,5.69l5,4.5V18h-2v-6H9v6H7v-7.81l5,-4.5M12,3L2,12h3v8h6v-6h2v6h6v-8h3L12,3z"/>
</vector>

@ -0,0 +1,6 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M7,6m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
<path android:fillColor="#FF000000" android:pathData="M11.15,12c-0.31,-0.22 -0.59,-0.46 -0.82,-0.72l-1.4,-1.55c-0.19,-0.21 -0.43,-0.38 -0.69,-0.5 -0.29,-0.14 -0.62,-0.23 -0.96,-0.23h-0.03C6.01,9 5,10.01 5,11.25L5,12L2,12v8c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2v-8L11.15,12zM7,20L5,20v-6h2v6zM11,20L9,20v-6h2v6zM15,20h-2v-6h2v6zM19,20h-2v-6h2v6zM17.42,7.21c0.57,0.62 0.82,1.41 0.67,2.2l-0.11,0.59h1.91l0.06,-0.43c0.21,-1.36 -0.27,-2.71 -1.3,-3.71l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L18,3h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06zM13.42,7.21c0.57,0.62 0.82,1.41 0.67,2.2l-0.11,0.59h1.91l0.06,-0.43c0.21,-1.36 -0.27,-2.71 -1.3,-3.71l-0.07,-0.07c-0.57,-0.62 -0.82,-1.41 -0.67,-2.2L14,3h-1.89l-0.06,0.43c-0.2,1.36 0.27,2.71 1.3,3.72l0.07,0.06z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M7,14c1.66,0 3,-1.34 3,-3S8.66,8 7,8s-3,1.34 -3,3 1.34,3 3,3zM7,10c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM19,7h-8v8L3,15L3,5L1,5v15h2v-3h18v3h2v-9c0,-2.21 -1.79,-4 -4,-4zM21,15h-8L13,9h6c1.1,0 2,0.9 2,2v4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M6,2v6h0.01L6,8.01 10,12l-4,4 0.01,0.01L6,16.01L6,22h12v-5.99h-0.01L18,16l-4,-4 4,-3.99 -0.01,-0.01L18,8L18,2L6,2zM16,16.5L16,20L8,20v-3.5l4,-4 4,4zM12,11.5l-4,-4L8,4h8v3.5l-4,4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M8,5h2v3L8,8zM8,12h2v5L8,17zM18,2.01L6,2c-1.1,0 -2,0.89 -2,2v16c0,1.1 0.9,2 2,2h12c1.1,0 2,-0.9 2,-2L20,4c0,-1.11 -0.9,-1.99 -2,-1.99zM18,20L6,20v-9.02h12L18,20zM18,9L6,9L6,4h12v5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M4,18.99h11c0.67,0 1.27,-0.32 1.63,-0.83L21,12l-4.37,-6.16C16.27,5.33 15.67,5 15,5H4l5,7 -5,6.99z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M17,7h-4v2h4c1.65,0 3,1.35 3,3s-1.35,3 -3,3h-4v2h4c2.76,0 5,-2.24 5,-5s-2.24,-5 -5,-5zM11,15L7,15c-1.65,0 -3,-1.35 -3,-3s1.35,-3 3,-3h4L11,7L7,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5h4v-2zM8,11h8v2L8,13z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M21,5h-2.64l1.14,-3.14L17.15,1l-1.46,4L3,5v2l2,6 -2,6v2h18v-2l-2,-6 2,-6L21,5zM17.1,13.63L18.89,19L5.11,19l1.79,-5.37 0.21,-0.63 -0.21,-0.63L5.11,7h13.78l-1.79,5.37 -0.21,0.63 0.21,0.63zM13,9h-2v3L8,12v2h3v3h2v-3h3v-2h-3z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15,11L15,5l-3,-3 -3,3v2L3,7v14h18L21,11h-6zM7,19L5,19v-2h2v2zM7,15L5,15v-2h2v2zM7,11L5,11L5,9h2v2zM13,19h-2v-2h2v2zM13,15h-2v-2h2v2zM13,11h-2L11,9h2v2zM13,7h-2L11,5h2v2zM19,19h-2v-2h2v2zM19,15h-2v-2h2v2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,6H10v2h10v12H4V8h2v4h2V4h6V0H6v6H4c-1.1,0 -2,0.9 -2,2v12c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V8c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19,19L19,4h-4L15,3L5,3v16L3,19v2h12L15,6h2v15h4v-2h-2zM13,19L7,19L7,5h6v14zM10,11h2v2h-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM15.5,11c0.83,0 1.5,-0.67 1.5,-1.5S16.33,8 15.5,8 14,8.67 14,9.5s0.67,1.5 1.5,1.5zM8.5,11c0.83,0 1.5,-0.67 1.5,-1.5S9.33,8 8.5,8 7,8.67 7,9.5 7.67,11 8.5,11zM12,13.5c-2.33,0 -4.31,1.46 -5.11,3.5h10.22c-0.8,-2.04 -2.78,-3.5 -5.11,-3.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M4,6.47L5.76,10H20v8H4V6.47M22,4h-4l2,4h-3l-2,-4h-2l2,4h-3l-2,-4H8l2,4H7L5,4H4c-1.1,0 -1.99,0.9 -1.99,2L2,18c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2V4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M23,12l-2.44,-2.78 0.34,-3.68 -3.61,-0.82 -1.89,-3.18L12,3 8.6,1.54 6.71,4.72l-3.61,0.81 0.34,3.68L1,12l2.44,2.78 -0.34,3.69 3.61,0.82 1.89,3.18L12,21l3.4,1.46 1.89,-3.18 3.61,-0.82 -0.34,-3.68L23,12zM18.49,14.11l0.26,2.79 -2.74,0.62 -1.43,2.41L12,18.82l-2.58,1.11 -1.43,-2.41 -2.74,-0.62 0.26,-2.8L3.66,12l1.85,-2.12 -0.26,-2.78 2.74,-0.61 1.43,-2.41L12,5.18l2.58,-1.11 1.43,2.41 2.74,0.62 -0.26,2.79L20.34,12l-1.85,2.11zM11,15h2v2h-2zM11,7h2v6h-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8 0,-1.85 0.63,-3.55 1.69,-4.9L16.9,18.31C15.55,19.37 13.85,20 12,20zM18.31,16.9L7.1,5.69C8.45,4.63 10.15,4 12,4c4.42,0 8,3.58 8,8 0,1.85 -0.63,3.55 -1.69,4.9z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z"/>
</vector>

@ -0,0 +1,9 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M4.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
<path android:fillColor="#FF000000" android:pathData="M9,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
<path android:fillColor="#FF000000" android:pathData="M15,5.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
<path android:fillColor="#FF000000" android:pathData="M19.5,9.5m-2.5,0a2.5,2.5 0,1 1,5 0a2.5,2.5 0,1 1,-5 0"/>
<path android:fillColor="#FF000000" android:pathData="M17.34,14.86c-0.87,-1.02 -1.6,-1.89 -2.48,-2.91 -0.46,-0.54 -1.05,-1.08 -1.75,-1.32 -0.11,-0.04 -0.22,-0.07 -0.33,-0.09 -0.25,-0.04 -0.52,-0.04 -0.78,-0.04s-0.53,0 -0.79,0.05c-0.11,0.02 -0.22,0.05 -0.33,0.09 -0.7,0.24 -1.28,0.78 -1.75,1.32 -0.87,1.02 -1.6,1.89 -2.48,2.91 -1.31,1.31 -2.92,2.76 -2.62,4.79 0.29,1.02 1.02,2.03 2.33,2.32 0.73,0.15 3.06,-0.44 5.54,-0.44h0.18c2.48,0 4.81,0.58 5.54,0.44 1.31,-0.29 2.04,-1.31 2.33,-2.32 0.31,-2.04 -1.3,-3.49 -2.61,-4.8z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM19.93,11L13,11L13,4.07c3.61,0.45 6.48,3.32 6.93,6.93zM4,12c0,-4.07 3.06,-7.44 7,-7.93v15.86c-3.94,-0.49 -7,-3.86 -7,-7.93zM13,19.93L13,13h6.93c-0.45,3.61 -3.32,6.48 -6.93,6.93z"/>
</vector>

@ -0,0 +1,6 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19,8h-1L18,3L6,3v5L5,8c-1.66,0 -3,1.34 -3,3v6h4v4h12v-4h4v-6c0,-1.66 -1.34,-3 -3,-3zM8,5h8v3L8,8L8,5zM16,17v2L8,19v-4h8v2zM18,15v-2L6,13v2L4,15v-4c0,-0.55 0.45,-1 1,-1h14c0.55,0 1,0.45 1,1v4h-2z"/>
<path android:fillColor="#FF000000" android:pathData="M18,11.5m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"/>
</vector>

@ -0,0 +1,6 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,19m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0"/>
<path android:fillColor="#FF000000" android:pathData="M10,3h4v12h-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M19.5,3.5L18,2l-1.5,1.5L15,2l-1.5,1.5L12,2l-1.5,1.5L9,2 7.5,3.5 6,2 4.5,3.5 3,2v20l1.5,-1.5L6,22l1.5,-1.5L9,22l1.5,-1.5L12,22l1.5,-1.5L15,22l1.5,-1.5L18,22l1.5,-1.5L21,22L21,2l-1.5,1.5zM19,19.09L5,19.09L5,4.91h14v14.18zM6,15h12v2L6,17zM6,11h12v2L6,13zM6,7h12v2L6,9z"/>
</vector>

@ -0,0 +1,7 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15.73,3H8.27L3,8.27v7.46L8.27,21h7.46L21,15.73V8.27L15.73,3zM19,14.9L14.9,19H9.1L5,14.9V9.1L9.1,5h5.8L19,9.1v5.8z"/>
<path android:fillColor="#FF000000" android:pathData="M12,16m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0"/>
<path android:fillColor="#FF000000" android:pathData="M11,7h2v7h-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,5.99L19.53,19L4.47,19L12,5.99M12,2L1,21h22L12,2zM13,16h-2v2h2v-2zM13,10h-2v4h2v-4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M8.1,13.34l2.83,-2.83L3.91,3.5c-1.56,1.56 -1.56,4.09 0,5.66l4.19,4.18zM14.88,11.53c1.53,0.71 3.68,0.21 5.27,-1.38 1.91,-1.91 2.28,-4.65 0.81,-6.12 -1.46,-1.46 -4.2,-1.1 -6.12,0.81 -1.59,1.59 -2.09,3.74 -1.38,5.27L3.7,19.87l1.41,1.41L12,14.41l6.88,6.88 1.41,-1.41L13.41,13l1.47,-1.47z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18.98,17L2,17v2h20v-2zM21,16c-0.27,-4.07 -3.25,-7.4 -7.16,-8.21 0.1,-0.24 0.16,-0.51 0.16,-0.79 0,-1.1 -0.9,-2 -2,-2s-2,0.9 -2,2c0,0.28 0.06,0.55 0.16,0.79C6.25,8.6 3.27,11.93 3,16h18zM12,9.58c2.95,0 5.47,1.83 6.5,4.41h-13c1.03,-2.58 3.55,-4.41 6.5,-4.41z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,3L1,9l4,2.18v6L12,21l7,-3.82v-6l2,-1.09L21,17h2L23,9L12,3zM18.82,9L12,12.72 5.18,9 12,5.28 18.82,9zM17,15.99l-5,2.73 -5,-2.73v-3.72L12,15l5,-2.73v3.72z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M4.01,6.03l7.51,3.22 -7.52,-1 0.01,-2.22m7.5,8.72L4,17.97v-2.22l7.51,-1M2.01,3L2,10l15,2 -15,2 0.01,7L23,12 2.01,3z"/>
</vector>

@ -0,0 +1,7 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M12,14c-2.33,0 -4.32,1.45 -5.12,3.5h1.67c0.69,-1.19 1.97,-2 3.45,-2s2.75,0.81 3.45,2h1.67c-0.8,-2.05 -2.79,-3.5 -5.12,-3.5zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector>

@ -0,0 +1,7 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M8.5,9.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0"/>
<path android:fillColor="#FF000000" android:pathData="M12,16c-1.48,0 -2.75,-0.81 -3.45,-2L6.88,14c0.8,2.05 2.79,3.5 5.12,3.5s4.32,-1.45 5.12,-3.5h-1.67c-0.7,1.19 -1.97,2 -3.45,2zM11.99,2C6.47,2 2,6.48 2,12s4.47,10 9.99,10C17.52,22 22,17.52 22,12S17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M12,13.5c-2.33,0 -4.31,1.46 -5.11,3.5h10.22c-0.8,-2.04 -2.78,-3.5 -5.11,-3.5zM7.82,12l1.06,-1.06L9.94,12 11,10.94 9.94,9.88 11,8.82 9.94,7.76 8.88,8.82 7.82,7.76 6.76,8.82l1.06,1.06 -1.06,1.06zM11.99,2C6.47,2 2,6.47 2,12s4.47,10 9.99,10S22,17.53 22,12 17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM16.18,7.76l-1.06,1.06 -1.06,-1.06L13,8.82l1.06,1.06L13,10.94 14.06,12l1.06,-1.06L16.18,12l1.06,-1.06 -1.06,-1.06 1.06,-1.06z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M11.99,2C6.47,2 2,6.47 2,12s4.47,10 9.99,10S22,17.53 22,12 17.52,2 11.99,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8zM13,9.94L14.06,11l1.06,-1.06L16.18,11l1.06,-1.06 -2.12,-2.12L13,9.94zM8.88,9.94L9.94,11 11,9.94 8.88,7.82 6.76,9.94 7.82,11l1.06,-1.06zM12,17.5c2.33,0 4.31,-1.46 5.11,-3.5L6.89,14c0.8,2.04 2.78,3.5 5.11,3.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92s2.92,-1.31 2.92,-2.92c0,-1.61 -1.31,-2.92 -2.92,-2.92zM18,4c0.55,0 1,0.45 1,1s-0.45,1 -1,1 -1,-0.45 -1,-1 0.45,-1 1,-1zM6,13c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1zM18,20.02c-0.55,0 -1,-0.45 -1,-1s0.45,-1 1,-1 1,0.45 1,1 -0.45,1 -1,1z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15.55,13c0.75,0 1.41,-0.41 1.75,-1.03l3.58,-6.49c0.37,-0.66 -0.11,-1.48 -0.87,-1.48L5.21,4l-0.94,-2L1,2v2h2l3.6,7.59 -1.35,2.44C4.52,15.37 5.48,17 7,17h12v-2L7,15l1.1,-2h7.45zM6.16,6h12.15l-2.76,5L8.53,11L6.16,6zM7,18c-1.1,0 -1.99,0.9 -1.99,2S5.9,22 7,22s2,-0.9 2,-2 -0.9,-2 -2,-2zM17,18c-1.1,0 -1.99,0.9 -1.99,2s0.89,2 1.99,2 2,-0.9 2,-2 -0.9,-2 -2,-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M3.5,18.49l6,-6.01 4,4L22,6.92l-1.41,-1.41 -7.09,7.97 -4,-4L2,16.99l1.5,1.5z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M15.49,9.63c-0.18,-2.79 -1.31,-5.51 -3.43,-7.63 -2.14,2.14 -3.32,4.86 -3.55,7.63 1.28,0.68 2.46,1.56 3.49,2.63 1.03,-1.06 2.21,-1.94 3.49,-2.63zM12.05,5.19c0.63,1.03 1.07,2.18 1.3,3.38 -0.47,0.3 -0.91,0.63 -1.34,0.98 -0.42,-0.34 -0.87,-0.67 -1.33,-0.97 0.25,-1.2 0.71,-2.35 1.37,-3.39zM12,15.45c-0.82,-1.25 -1.86,-2.34 -3.06,-3.2 -0.13,-0.09 -0.27,-0.16 -0.4,-0.26 0.13,0.09 0.27,0.17 0.39,0.25C6.98,10.83 4.59,10 2,10c0,5.32 3.36,9.82 8.03,11.49 0.63,0.23 1.29,0.4 1.97,0.51 0.68,-0.12 1.33,-0.29 1.97,-0.51C18.64,19.82 22,15.32 22,10c-4.18,0 -7.85,2.17 -10,5.45zM13.32,19.6c-0.44,0.15 -0.88,0.27 -1.33,0.37 -0.44,-0.09 -0.87,-0.21 -1.28,-0.36 -3.29,-1.18 -5.7,-3.99 -6.45,-7.35 1.1,0.26 2.15,0.71 3.12,1.33l-0.02,0.01c0.13,0.09 0.26,0.18 0.39,0.25l0.07,0.04c0.99,0.72 1.84,1.61 2.51,2.65L12,19.1l1.67,-2.55c0.69,-1.05 1.55,-1.95 2.53,-2.66l0.07,-0.05c0.09,-0.05 0.18,-0.11 0.27,-0.17l-0.01,-0.02c0.98,-0.65 2.07,-1.13 3.21,-1.4 -0.75,3.37 -3.15,6.18 -6.42,7.35zM8.99,12.28c-0.02,-0.01 -0.04,-0.03 -0.05,-0.04 0,0 0.01,0 0.01,0.01 0.01,0.01 0.02,0.02 0.04,0.03z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4l-3.76,2.27 1,-4.28 -3.32,-2.88 4.38,-0.38L12,6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M22,9.24l-7.19,-0.62L12,2 9.19,8.63 2,9.24l5.46,4.73L5.82,21 12,17.27 18.18,21l-1.63,-7.03L22,9.24zM12,15.4V6.1l1.71,4.04 4.38,0.38 -3.32,2.88 1,4.28L12,15.4z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M2,20h20v-4L2,16v4zM4,17h2v2L4,19v-2zM2,4v4h20L22,4L2,4zM6,7L4,7L4,5h2v2zM2,14h20v-4L2,10v4zM4,11h2v2L4,13v-2z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M18.36,9l0.6,3L5.04,12l0.6,-3h12.72M20,4L4,4v2h16L20,4zM20,7L4,7l-1,5v2h1v6h10v-6h4v6h2v-6h1v-2l-1,-5zM6,18v-4h6v4L6,18z"/>
</vector>

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#FF000000" android:pathData="M17,3H7c-1.1,0 -1.99,0.9 -1.99,2L5,21l7,-3 7,3V5c0,-1.1 -0.9,-2 -2,-2z"/>
</vector>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save