diff --git a/src/googleplay/java/org/tasks/activities/GoogleTaskListSettingsActivity.java b/src/googleplay/java/org/tasks/activities/GoogleTaskListSettingsActivity.java index c1c965378..4ac2dea0c 100644 --- a/src/googleplay/java/org/tasks/activities/GoogleTaskListSettingsActivity.java +++ b/src/googleplay/java/org/tasks/activities/GoogleTaskListSettingsActivity.java @@ -3,11 +3,12 @@ package org.tasks.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.TextInputEditText; import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; +import android.text.InputType; import android.view.MenuItem; import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; import android.widget.Toast; import com.google.api.services.tasks.model.TaskList; @@ -21,6 +22,7 @@ import com.todoroo.astrid.gtasks.GtasksListService; import org.tasks.R; import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracking; +import org.tasks.dialogs.ColorPickerDialog; import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.CreateListDialog; import org.tasks.gtasks.DeleteListDialog; @@ -28,12 +30,16 @@ import org.tasks.gtasks.RenameListDialog; 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; import org.tasks.ui.MenuColorizer; import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; +import butterknife.OnFocusChange; import static android.text.TextUtils.isEmpty; import static org.tasks.gtasks.CreateListDialog.newCreateListDialog; @@ -44,31 +50,38 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi implements Toolbar.OnMenuItemClickListener, CreateListDialog.CreateListDialogCallback, DeleteListDialog.DeleteListDialogCallback, RenameListDialog.RenameListDialogCallback { + private static final String EXTRA_SELECTED_THEME = "extra_selected_theme"; private static final String FRAG_TAG_CREATE_LIST_DIALOG = "frag_tag_create_list_dialog"; private static final String FRAG_TAG_DELETE_LIST_DIALOG = "frag_tag_delete_list_dialog"; private static final String FRAG_TAG_RENAME_LIST_DIALOG = "frag_tag_rename_list_dialog"; + private static final int REQUEST_COLOR_PICKER = 10109; public static final String EXTRA_STORE_DATA = "extra_store_data"; public static final String ACTION_DELETED = "action_deleted"; public static final String ACTION_RENAMED = "action_renamed"; + public static final String ACTION_THEME_CHANGED = "action_theme_changed"; - private GtasksList gtasksList; private boolean isNewList; + private GtasksList gtasksList; + private int selectedTheme; @Inject StoreObjectDao storeObjectDao; @Inject DialogBuilder dialogBuilder; @Inject Preferences preferences; @Inject GtasksListService gtasksListService; @Inject Tracker tracker; + @Inject ThemeCache themeCache; + @Inject ThemeColor themeColor; - @BindView(R.id.tag_name) EditText listName; + @BindView(R.id.name) TextInputEditText name; + @BindView(R.id.color) TextInputEditText color; @BindView(R.id.toolbar) Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.filter_settings_activity); + setContentView(R.layout.activity_google_task_list_settings); ButterKnife.bind(this); StoreObject storeObject = getIntent().getParcelableExtra(EXTRA_STORE_DATA); @@ -78,6 +91,11 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi storeObject.setType(GtasksList.TYPE); } gtasksList = new GtasksList(storeObject); + if (savedInstanceState == null) { + selectedTheme = gtasksList.getColor(); + } else { + selectedTheme = savedInstanceState.getInt(EXTRA_SELECTED_THEME); + } final boolean backButtonSavesTask = preferences.backButtonSavesTask(); toolbar.setTitle(isNewList ? getString(R.string.new_list) : gtasksList.getName()); @@ -94,16 +112,43 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi toolbar.setOnMenuItemClickListener(this); toolbar.showOverflowMenu(); + color.setInputType(InputType.TYPE_NULL); + MenuColorizer.colorToolbar(this, toolbar); if (isNewList) { toolbar.getMenu().findItem(R.id.delete).setVisible(false); - listName.requestFocus(); + name.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(listName, InputMethodManager.SHOW_IMPLICIT); + imm.showSoftInput(name, InputMethodManager.SHOW_IMPLICIT); } else { - listName.setText(gtasksList.getName()); + name.setText(gtasksList.getName()); } + + updateTheme(); + } + + @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, ColorPickerDialog.ColorPalette.COLORS); + intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true); + startActivityForResult(intent, REQUEST_COLOR_PICKER); } @Override @@ -126,6 +171,11 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi newRenameListDialog(gtasksList.getRemoteId(), newName) .show(getSupportFragmentManager(), FRAG_TAG_RENAME_LIST_DIALOG); } else { + if (colorChanged()) { + gtasksList.setColor(selectedTheme); + storeObjectDao.persist(gtasksList); + setResult(RESULT_OK, new Intent(ACTION_THEME_CHANGED).putExtra(TaskListActivity.OPEN_FILTER, new GtasksFilter(gtasksList))); + } finish(); } } @@ -133,7 +183,7 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi @Override public void finish() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(listName.getWindowToken(), 0); + imm.hideSoftInputFromWindow(name.getWindowToken(), 0); super.finish(); } @@ -176,14 +226,18 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi } private String getNewName() { - return listName.getText().toString().trim(); + return name.getText().toString().trim(); } private boolean hasChanges() { if (isNewList) { - return !isEmpty(getNewName()); + return selectedTheme >= 0 || !isEmpty(getNewName()); } - return nameChanged(); + return colorChanged() || nameChanged(); + } + + private boolean colorChanged() { + return selectedTheme != gtasksList.getColor(); } private boolean nameChanged() { @@ -193,10 +247,11 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi @Override public void onListCreated(TaskList taskList) { tracker.reportEvent(Tracking.Events.GTASK_NEW_LIST); - GtasksList list = new GtasksList(taskList.getId()); - list.setName(taskList.getTitle()); - storeObjectDao.persist(list); - setResult(RESULT_OK, new Intent().putExtra(TaskListActivity.OPEN_FILTER, new GtasksFilter(list))); + gtasksList = new GtasksList(taskList.getId()); + gtasksList.setName(taskList.getTitle()); + gtasksList.setColor(selectedTheme); + storeObjectDao.persist(gtasksList); + setResult(RESULT_OK, new Intent().putExtra(TaskListActivity.OPEN_FILTER, new GtasksFilter(gtasksList))); finish(); } @@ -212,13 +267,41 @@ public class GoogleTaskListSettingsActivity extends ThemedInjectingAppCompatActi public void onListRenamed(TaskList taskList) { tracker.reportEvent(Tracking.Events.GTASK_RENAME_LIST); gtasksList.setName(taskList.getTitle()); + gtasksList.setColor(selectedTheme); storeObjectDao.persist(gtasksList); setResult(RESULT_OK, new Intent(ACTION_RENAMED).putExtra(TaskListActivity.OPEN_FILTER, new GtasksFilter(gtasksList))); 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); + } + } + @Override public void requestFailed() { 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.applyStatusBarColor(this); + } } diff --git a/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java b/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java index 41e681dcf..7bd162bde 100644 --- a/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java +++ b/src/googleplay/java/org/tasks/activities/NativeGoogleTaskListPicker.java @@ -10,6 +10,7 @@ import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.injection.InjectingNativeDialogFragment; import org.tasks.injection.NativeDialogFragmentComponent; +import org.tasks.themes.ThemeCache; import javax.inject.Inject; @@ -19,12 +20,13 @@ public class NativeGoogleTaskListPicker extends InjectingNativeDialogFragment { @Inject DialogBuilder dialogBuilder; @Inject GtasksListService gtasksListService; + @Inject ThemeCache themeCache; private GoogleTaskListSelectionHandler handler; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - return createDialog(dialogBuilder, gtasksListService, list -> handler.selectedList(list)); + return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, list -> handler.selectedList(list)); } @Override diff --git a/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java b/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java index 833a06123..b5c0841e3 100644 --- a/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java +++ b/src/googleplay/java/org/tasks/activities/SupportGoogleTaskListPicker.java @@ -2,35 +2,47 @@ package org.tasks.activities; import android.app.Activity; import android.app.Dialog; +import android.content.Context; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.v4.content.ContextCompat; +import android.support.v4.graphics.drawable.DrawableCompat; import android.support.v7.app.AlertDialog; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; import com.todoroo.astrid.gtasks.GtasksList; import com.todoroo.astrid.gtasks.GtasksListService; +import org.tasks.R; import org.tasks.dialogs.DialogBuilder; import org.tasks.gtasks.GoogleTaskListSelectionHandler; import org.tasks.injection.DialogFragmentComponent; import org.tasks.injection.InjectingDialogFragment; +import org.tasks.themes.ThemeCache; +import org.tasks.themes.ThemeColor; import java.util.List; import javax.inject.Inject; -import static com.google.common.collect.Lists.transform; +import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; public class SupportGoogleTaskListPicker extends InjectingDialogFragment { @Inject DialogBuilder dialogBuilder; @Inject GtasksListService gtasksListService; + @Inject ThemeCache themeCache; private GoogleTaskListSelectionHandler handler; @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - return createDialog(dialogBuilder, gtasksListService, list -> handler.selectedList(list)); + return createDialog(getActivity(), themeCache, dialogBuilder, gtasksListService, list -> handler.selectedList(list)); } @Override @@ -40,11 +52,30 @@ public class SupportGoogleTaskListPicker extends InjectingDialogFragment { handler = (GoogleTaskListSelectionHandler) activity; } - public static AlertDialog createDialog(DialogBuilder dialogBuilder, GtasksListService gtasksListService, final GoogleTaskListSelectionHandler handler) { + public static AlertDialog createDialog(Context context, ThemeCache themeCache, DialogBuilder dialogBuilder, GtasksListService gtasksListService, final GoogleTaskListSelectionHandler handler) { final List lists = gtasksListService.getLists(); - List listNames = transform(lists, GtasksList::getName); + ArrayAdapter adapter = new ArrayAdapter(context, R.layout.simple_list_item_single_choice_themed, lists) { + @NonNull + @Override + public View getView(int position, View convertView, ViewGroup parent) { + TextView view = (TextView) super.getView(position, convertView, parent); + GtasksList list = lists.get(position); + int color = list.getColor(); + ThemeColor themeColor = themeCache.getThemeColor(color >= 0 ? color : 19); + view.setText(list.getName()); + Drawable original = ContextCompat.getDrawable(getContext(), R.drawable.ic_cloud_black_24dp); + Drawable wrapped = DrawableCompat.wrap(original.mutate()); + DrawableCompat.setTint(wrapped, themeColor.getPrimaryColor()); + if (atLeastJellybeanMR1()) { + view.setCompoundDrawablesRelativeWithIntrinsicBounds(wrapped, null, null, null); + } else { + view.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); + } + return view; + } + }; return dialogBuilder.newDialog() - .setItems(listNames, (dialog, which) -> { + .setSingleChoiceItems(adapter, -1, (dialog, which) -> { handler.selectedList(lists.get(which)); dialog.dismiss(); }) diff --git a/src/googleplay/java/org/tasks/tasklist/GtasksListFragment.java b/src/googleplay/java/org/tasks/tasklist/GtasksListFragment.java index 976362f2d..1cd5a1b98 100644 --- a/src/googleplay/java/org/tasks/tasklist/GtasksListFragment.java +++ b/src/googleplay/java/org/tasks/tasklist/GtasksListFragment.java @@ -74,9 +74,11 @@ public class GtasksListFragment extends TaskListFragment { if (requestCode == REQUEST_LIST_SETTINGS) { if (resultCode == RESULT_OK) { TaskListActivity activity = (TaskListActivity) getActivity(); - if (GoogleTaskListSettingsActivity.ACTION_DELETED.equals(data.getAction())) { + String action = data.getAction(); + if (GoogleTaskListSettingsActivity.ACTION_DELETED.equals(action)) { activity.onFilterItemClicked(null); - } else if (GoogleTaskListSettingsActivity.ACTION_RENAMED.equals(data.getAction())) { + } else if (GoogleTaskListSettingsActivity.ACTION_RENAMED.equals(action) || + GoogleTaskListSettingsActivity.ACTION_THEME_CHANGED.equals(action)) { activity.onFilterItemClicked(data.getParcelableExtra(TaskListActivity.OPEN_FILTER)); } } diff --git a/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java b/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java index 5e27c3c0a..c065772ae 100644 --- a/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java +++ b/src/googleplay/java/org/tasks/ui/GoogleTaskListFragment.java @@ -100,7 +100,7 @@ public class GoogleTaskListFragment extends TaskEditControlFragment { @Override protected int getIcon() { - return R.drawable.ic_cloud_queue_24dp; + return R.drawable.ic_cloud_black_24dp; } @Override diff --git a/src/main/java/com/todoroo/astrid/api/GtasksFilter.java b/src/main/java/com/todoroo/astrid/api/GtasksFilter.java index b7914ada7..d082fabf6 100644 --- a/src/main/java/com/todoroo/astrid/api/GtasksFilter.java +++ b/src/main/java/com/todoroo/astrid/api/GtasksFilter.java @@ -19,7 +19,7 @@ import org.tasks.R; public class GtasksFilter extends Filter { - private static final int CLOUD = R.drawable.ic_cloud_queue_24dp; + private static final int CLOUD = R.drawable.ic_cloud_black_24dp; private long storeId; @@ -30,6 +30,7 @@ public class GtasksFilter extends Filter { public GtasksFilter(GtasksList list) { super(list.getName(), getQueryTemplate(list), getValuesForNewTasks(list)); storeId = list.getId(); + tint = list.getColor(); icon = CLOUD; } diff --git a/src/main/java/com/todoroo/astrid/dao/Database.java b/src/main/java/com/todoroo/astrid/dao/Database.java index 312980c43..f394db2bb 100644 --- a/src/main/java/com/todoroo/astrid/dao/Database.java +++ b/src/main/java/com/todoroo/astrid/dao/Database.java @@ -46,7 +46,7 @@ import timber.log.Timber; @ApplicationScope public class Database { - private static final int VERSION = 37; + private static final int VERSION = 38; private static final String NAME = "database"; private static final Table[] TABLES = new Table[] { Task.TABLE, @@ -121,6 +121,8 @@ public class Database { tryExecSQL(addColumnSql(TagData.TABLE, TagData.COLOR, visitor, "-1")); case 36: tryExecSQL(addColumnSql(StoreObject.TABLE, StoreObject.DELETION_DATE, visitor, "0")); + case 37: + tryExecSQL(addColumnSql(StoreObject.TABLE, StoreObject.VALUE4, visitor, "-1")); return true; } diff --git a/src/main/java/com/todoroo/astrid/data/StoreObject.java b/src/main/java/com/todoroo/astrid/data/StoreObject.java index 3322b87f3..0bd697115 100644 --- a/src/main/java/com/todoroo/astrid/data/StoreObject.java +++ b/src/main/java/com/todoroo/astrid/data/StoreObject.java @@ -60,6 +60,10 @@ public class StoreObject extends AbstractModel { public static final StringProperty VALUE3 = new StringProperty( TABLE, "value3"); + /** Store Value Column 3 */ + public static final StringProperty VALUE4 = new StringProperty( + TABLE, "value4"); + /** Unixtime Task was deleted. 0 means not deleted */ public static final LongProperty DELETION_DATE = new LongProperty( TABLE, "deleted", Property.PROP_FLAG_DATE); diff --git a/src/main/java/com/todoroo/astrid/gtasks/GtasksList.java b/src/main/java/com/todoroo/astrid/gtasks/GtasksList.java index e102b6337..a1a463df4 100644 --- a/src/main/java/com/todoroo/astrid/gtasks/GtasksList.java +++ b/src/main/java/com/todoroo/astrid/gtasks/GtasksList.java @@ -64,6 +64,16 @@ public class GtasksList { storeObject.setValue(StoreObject.VALUE2, Integer.toString(order)); } + public int getColor() { + return storeObject.containsNonNullValue(StoreObject.VALUE4) + ? Integer.parseInt(storeObject.getValue(StoreObject.VALUE4)) + : -1; + } + + public void setColor(int color) { + storeObject.setValue(StoreObject.VALUE4, Integer.toString(color)); + } + public long getLastSync() { return storeObject.containsNonNullValue(StoreObject.VALUE3) ? Long.parseLong(storeObject.getValue(StoreObject.VALUE3)) diff --git a/src/main/java/org/tasks/activities/ColorPickerActivity.java b/src/main/java/org/tasks/activities/ColorPickerActivity.java index 18cbe1689..b83df78d5 100644 --- a/src/main/java/org/tasks/activities/ColorPickerActivity.java +++ b/src/main/java/org/tasks/activities/ColorPickerActivity.java @@ -7,6 +7,7 @@ import org.tasks.R; import org.tasks.billing.PurchaseHelper; import org.tasks.billing.PurchaseHelperCallback; import org.tasks.dialogs.ColorPickerDialog; +import org.tasks.dialogs.ColorPickerDialog.ColorPalette; import org.tasks.dialogs.DialogBuilder; import org.tasks.injection.ActivityComponent; import org.tasks.injection.InjectingAppCompatActivity; @@ -21,6 +22,7 @@ public class ColorPickerActivity extends InjectingAppCompatActivity implements C private static final int REQUEST_PURCHASE = 1006; public static final String EXTRA_PALETTE = "extra_palette"; + public static final String EXTRA_SHOW_NONE = "extra_show_none"; public static final String EXTRA_THEME_INDEX = "extra_index"; @Inject PurchaseHelper purchaseHelper; @@ -35,7 +37,9 @@ public class ColorPickerActivity extends InjectingAppCompatActivity implements C protected void onPostResume() { super.onPostResume(); - newColorPickerDialog((ColorPickerDialog.ColorPalette) getIntent().getSerializableExtra(EXTRA_PALETTE)) + ColorPalette palette = (ColorPalette) getIntent().getSerializableExtra(EXTRA_PALETTE); + boolean showNone = getIntent().getBooleanExtra(EXTRA_SHOW_NONE, false); + newColorPickerDialog(palette, showNone) .show(getSupportFragmentManager(), FRAG_TAG_COLOR_PICKER); } @@ -45,7 +49,7 @@ public class ColorPickerActivity extends InjectingAppCompatActivity implements C } @Override - public void themePicked(final ColorPickerDialog.ColorPalette palette, final int index) { + public void themePicked(final ColorPalette palette, final int index) { Intent data = new Intent(); data.putExtra(EXTRA_PALETTE, palette); data.putExtra(EXTRA_THEME_INDEX, index); diff --git a/src/main/java/org/tasks/activities/FilterSettingsActivity.java b/src/main/java/org/tasks/activities/FilterSettingsActivity.java index 4ab17899a..b4f4cd80a 100644 --- a/src/main/java/org/tasks/activities/FilterSettingsActivity.java +++ b/src/main/java/org/tasks/activities/FilterSettingsActivity.java @@ -8,11 +8,11 @@ package org.tasks.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.TextInputEditText; import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; import android.widget.Toast; import com.todoroo.astrid.api.CustomFilter; @@ -45,7 +45,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp @Inject DialogBuilder dialogBuilder; @Inject Preferences preferences; - @BindView(R.id.tag_name) EditText filterName; + @BindView(R.id.name) TextInputEditText name; @BindView(R.id.toolbar) Toolbar toolbar; @Override @@ -72,7 +72,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp toolbar.setOnMenuItemClickListener(this); MenuColorizer.colorToolbar(this, toolbar); - filterName.setText(filter.listingTitle); + name.setText(filter.listingTitle); } @Override @@ -82,7 +82,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp private void save() { String oldName = filter.listingTitle; - String newName = filterName.getText().toString().trim(); + String newName = name.getText().toString().trim(); if (isEmpty(newName)) { Toast.makeText(this, R.string.name_cannot_be_empty, Toast.LENGTH_LONG).show(); @@ -102,7 +102,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp @Override public void finish() { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(filterName.getWindowToken(), 0); + imm.hideSoftInputFromWindow(name.getWindowToken(), 0); super.finish(); } @@ -127,7 +127,7 @@ public class FilterSettingsActivity extends ThemedInjectingAppCompatActivity imp } private void discard() { - String tagName = this.filterName.getText().toString().trim(); + String tagName = this.name.getText().toString().trim(); if (filter.listingTitle.equals(tagName)) { finish(); } else { diff --git a/src/main/java/org/tasks/activities/TagSettingsActivity.java b/src/main/java/org/tasks/activities/TagSettingsActivity.java index 83abb080d..98a58ba27 100644 --- a/src/main/java/org/tasks/activities/TagSettingsActivity.java +++ b/src/main/java/org/tasks/activities/TagSettingsActivity.java @@ -8,13 +8,12 @@ package org.tasks.activities; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.support.design.widget.TextInputEditText; import android.support.v4.content.ContextCompat; import android.support.v7.widget.Toolbar; +import android.text.InputType; import android.view.MenuItem; -import android.view.View; import android.view.inputmethod.InputMethodManager; -import android.widget.EditText; -import android.widget.TextView; import android.widget.Toast; import com.todoroo.andlib.sql.Criterion; @@ -44,6 +43,7 @@ import javax.inject.Inject; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; +import butterknife.OnFocusChange; import static android.text.TextUtils.isEmpty; @@ -73,10 +73,9 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem @Inject ThemeColor themeColor; @Inject Tracker tracker; - @BindView(R.id.tag_name) EditText tagName; + @BindView(R.id.name) TextInputEditText name; + @BindView(R.id.color) TextInputEditText color; @BindView(R.id.toolbar) Toolbar toolbar; - @BindView(R.id.theme) TextView themeName; - @BindView(R.id.clear) View clear; @Override protected void onCreate(Bundle savedInstanceState) { @@ -112,17 +111,19 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem toolbar.setOnMenuItemClickListener(this); toolbar.showOverflowMenu(); - tagName.setText(tagData.getName()); + color.setInputType(InputType.TYPE_NULL); + + name.setText(tagData.getName()); String autopopulateName = getIntent().getStringExtra(TOKEN_AUTOPOPULATE_NAME); if (!isEmpty(autopopulateName)) { - tagName.setText(autopopulateName); + name.setText(autopopulateName); getIntent().removeExtra(TOKEN_AUTOPOPULATE_NAME); } else if (isNewTag) { toolbar.getMenu().findItem(R.id.delete).setVisible(false); - tagName.requestFocus(); + name.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); - imm.showSoftInput(tagName, InputMethodManager.SHOW_IMPLICIT); + imm.showSoftInput(name, InputMethodManager.SHOW_IMPLICIT); } updateTheme(); @@ -135,26 +136,29 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem outState.putInt(EXTRA_SELECTED_THEME, selectedTheme); } - @OnClick(R.id.theme_row) + @OnFocusChange(R.id.color) + void onFocusChange(boolean focused) { + if (focused) { + color.clearFocus(); + showThemePicker(); + } + } + + @OnClick(R.id.color) protected void showThemePicker() { Intent intent = new Intent(TagSettingsActivity.this, ColorPickerActivity.class); intent.putExtra(ColorPickerActivity.EXTRA_PALETTE, ColorPickerDialog.ColorPalette.COLORS); + intent.putExtra(ColorPickerActivity.EXTRA_SHOW_NONE, true); startActivityForResult(intent, REQUEST_COLOR_PICKER); } - @OnClick(R.id.clear) - void clearColor() { - selectedTheme = -1; - updateTheme(); - } - @Override public void inject(ActivityComponent component) { component.inject(this); } private String getNewName() { - return tagName.getText().toString().trim(); + return name.getText().toString().trim(); } private boolean clashes(String newName) { @@ -206,7 +210,7 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem @Override public void finish() { InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); - imm.hideSoftInputFromWindow(tagName.getWindowToken(), 0); + imm.hideSoftInputFromWindow(name.getWindowToken(), 0); super.finish(); } @@ -260,19 +264,16 @@ public class TagSettingsActivity extends ThemedInjectingAppCompatActivity implem } private void updateTheme() { - ThemeColor color; + ThemeColor themeColor; if (selectedTheme < 0) { - color = themeColor; - themeName.setText(R.string.none); - clear.setVisibility(View.GONE); - + themeColor = this.themeColor; + color.setText(R.string.none); } else { - color = themeCache.getThemeColor(selectedTheme); - themeName.setText(color.getName()); - clear.setVisibility(View.VISIBLE); + themeColor = themeCache.getThemeColor(selectedTheme); + color.setText(themeColor.getName()); } - color.apply(toolbar); - color.applyStatusBarColor(this); + themeColor.apply(toolbar); + themeColor.applyStatusBarColor(this); } @Override diff --git a/src/main/java/org/tasks/analytics/Tracking.java b/src/main/java/org/tasks/analytics/Tracking.java index e88580e63..43e28d410 100644 --- a/src/main/java/org/tasks/analytics/Tracking.java +++ b/src/main/java/org/tasks/analytics/Tracking.java @@ -20,6 +20,7 @@ public class Tracking { GTASK_NEW_LIST(R.string.tracking_category_google_tasks, R.string.tracking_action_new_list), GTASK_RENAME_LIST(R.string.tracking_category_google_tasks, R.string.tracking_action_rename_list), GTASK_DELETE_LIST(R.string.tracking_category_google_tasks, R.string.tracking_action_delete_list), + GTASK_SET_COLOR(R.string.tracking_category_google_tasks, R.string.p_theme_color), UPGRADE(R.string.tracking_category_event, R.string.tracking_event_upgrade), LEGACY_TASKER_TRIGGER(R.string.tracking_category_event, R.string.tracking_event_legacy_tasker_trigger), NIGHT_MODE_MISMATCH(R.string.tracking_category_event, R.string.tracking_event_night_mode_mismatch), diff --git a/src/main/java/org/tasks/dialogs/ColorPickerDialog.java b/src/main/java/org/tasks/dialogs/ColorPickerDialog.java index 219af8256..f915ddb79 100644 --- a/src/main/java/org/tasks/dialogs/ColorPickerDialog.java +++ b/src/main/java/org/tasks/dialogs/ColorPickerDialog.java @@ -8,6 +8,7 @@ import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; import android.view.LayoutInflater; @@ -31,6 +32,7 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; public class ColorPickerDialog extends InjectingDialogFragment { private static final String EXTRA_PALETTE = "extra_palette"; + private static final String EXTRA_SHOW_NONE = "extra_show_none"; public enum ColorPalette {THEMES, COLORS, ACCENTS, WIDGET_BACKGROUND, LED} @@ -42,9 +44,12 @@ public class ColorPickerDialog extends InjectingDialogFragment { void dismissed(); } - public static ColorPickerDialog newColorPickerDialog(ColorPalette palette) { + public static ColorPickerDialog newColorPickerDialog(ColorPalette palette, boolean showNone) { ColorPickerDialog dialog = new ColorPickerDialog(); - dialog.palette = palette; + Bundle args = new Bundle(); + args.putSerializable(EXTRA_PALETTE, palette); + args.putBoolean(EXTRA_SHOW_NONE, showNone); + dialog.setArguments(args); return dialog; } @@ -57,13 +62,16 @@ public class ColorPickerDialog extends InjectingDialogFragment { private ColorPalette palette; private ThemePickerCallback callback; private ArrayAdapter adapter; + private Dialog dialog; - @NonNull @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - if (savedInstanceState != null) { - palette = (ColorPalette) savedInstanceState.getSerializable(EXTRA_PALETTE); - } + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setRetainInstance(true); + Bundle arguments = getArguments(); + palette = (ColorPalette) arguments.getSerializable(EXTRA_PALETTE); + boolean showNone = arguments.getBoolean(EXTRA_SHOW_NONE); + if (palette == ColorPickerDialog.ColorPalette.THEMES || palette == ColorPickerDialog.ColorPalette.WIDGET_BACKGROUND) { theme = theme.withBaseTheme(themeCache.getThemeBase(2)); } @@ -94,7 +102,7 @@ public class ColorPickerDialog extends InjectingDialogFragment { } }; - return dialogBuilder.newDialog(theme) + AlertDialogBuilder builder = dialogBuilder.newDialog(theme) .setAdapter(adapter, (dialog, which) -> { if (preferences.hasPurchase(R.string.p_purchased_themes) || which < getNumFree()) { callback.themePicked(palette, which); @@ -102,8 +110,17 @@ public class ColorPickerDialog extends InjectingDialogFragment { callback.initiateThemePurchase(); } }) - .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> callback.dismissed()) - .show(); + .setNegativeButton(android.R.string.cancel, (dialogInterface, i) -> callback.dismissed()); + if (showNone) { + builder.setNeutralButton(R.string.none, (dialogInterface, i) -> callback.themePicked(palette, -1)); + } + dialog = builder.create(); + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return dialog; } @Override @@ -125,13 +142,6 @@ public class ColorPickerDialog extends InjectingDialogFragment { callback = (ThemePickerCallback) activity; } - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - - outState.putSerializable(EXTRA_PALETTE, palette); - } - @Override protected void inject(DialogFragmentComponent component) { component.inject(this); diff --git a/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java b/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java index c0291d9c8..30113a731 100644 --- a/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java +++ b/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java @@ -22,9 +22,9 @@ public abstract class ThemedInjectingAppCompatActivity extends AppCompatActivity activityComponent = ((InjectingApplication) getApplication()).getComponent().plus(new ActivityModule(this)); inject(activityComponent); setTitle(null); + super.onCreate(savedInstanceState); theme.applyTheme(this); theme.applyStatusBarColor(this); - super.onCreate(savedInstanceState); } @Override diff --git a/src/main/res/drawable/ic_cloud_black_24dp.xml b/src/main/res/drawable/ic_cloud_black_24dp.xml new file mode 100644 index 000000000..e0940ca0e --- /dev/null +++ b/src/main/res/drawable/ic_cloud_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/src/main/res/drawable/ic_cloud_queue_24dp.xml b/src/main/res/drawable/ic_cloud_queue_24dp.xml deleted file mode 100644 index 69f2695fe..000000000 --- a/src/main/res/drawable/ic_cloud_queue_24dp.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/src/main/res/layout/activity_google_task_list_settings.xml b/src/main/res/layout/activity_google_task_list_settings.xml new file mode 100644 index 000000000..0504eb858 --- /dev/null +++ b/src/main/res/layout/activity_google_task_list_settings.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/res/layout/filter_settings_activity.xml b/src/main/res/layout/filter_settings_activity.xml index f272b42d2..06b6faf6d 100644 --- a/src/main/res/layout/filter_settings_activity.xml +++ b/src/main/res/layout/filter_settings_activity.xml @@ -12,36 +12,28 @@ android:layout_height="wrap_content" android:layout_gravity="top"> - - - - - - + android:descendantFocusability="beforeDescendants" + android:focusableInTouchMode="true" + android:orientation="vertical"> + + + + + + + + diff --git a/src/main/res/layout/simple_list_item_single_choice_themed.xml b/src/main/res/layout/simple_list_item_single_choice_themed.xml index e18519a5c..7930e9302 100644 --- a/src/main/res/layout/simple_list_item_single_choice_themed.xml +++ b/src/main/res/layout/simple_list_item_single_choice_themed.xml @@ -16,7 +16,8 @@ - + - - - - - - - + android:inputType="textCapSentences|textFilter" + android:maxLines="1" + android:textColor="?attr/asTextColor" /> + - - - + - - - + android:hint="@string/color" + android:textColor="?attr/asTextColor" /> + diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index e926b6272..19c2a0acb 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -65,7 +65,11 @@