From d0df3099cfbea5efc2f483bae290794310820e8d Mon Sep 17 00:00:00 2001 From: TR4Android Date: Sun, 24 Jan 2016 13:02:26 +0100 Subject: [PATCH 01/21] Add Settings activity and styles * Integrate Settings activity in navigation drawer * Implement basic Settings activity with theme section (dark/light theme, primary color and accent color preferences) * Add/Update new styles for ATE --- app/build.gradle | 11 ++- app/src/main/AndroidManifest.xml | 9 +- .../gitlab/activity/BaseActivity.java | 12 ++- .../gitlab/activity/GitlabActivity.java | 2 + .../gitlab/activity/GroupActivity.java | 10 +- .../gitlab/activity/GroupsActivity.java | 10 +- .../gitlab/activity/ProjectsActivity.java | 10 +- .../gitlab/activity/SettingsActivity.java | 97 ++++++++++++++++++- .../gitlab/activity/UserActivity.java | 10 +- .../commit451/gitlab/util/AppThemeUtil.java | 34 +++++++ .../gitlab/util/NavigationManager.java | 5 + .../gitlab/view/GitLabNavigationView.java | 4 + .../main/res/drawable/ic_settings_24dp.xml | 9 ++ app/src/main/res/layout/activity_settings.xml | 48 ++------- app/src/main/res/menu/navigation.xml | 15 ++- app/src/main/res/values-v21/styles.xml | 12 +++ app/src/main/res/values/attrs.xml | 6 ++ app/src/main/res/values/colors.xml | 3 + app/src/main/res/values/strings.xml | 9 +- app/src/main/res/values/styles.xml | 43 +++++++- app/src/main/res/xml/preferences.xml | 34 +++++++ 21 files changed, 328 insertions(+), 65 deletions(-) create mode 100644 app/src/main/java/com/commit451/gitlab/util/AppThemeUtil.java create mode 100644 app/src/main/res/drawable/ic_settings_24dp.xml create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/app/build.gradle b/app/build.gradle index 7375f388..5c668e43 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,7 +49,7 @@ dependencies { compile 'com.squareup.picasso:picasso:2.5.2' compile 'com.squareup.retrofit:retrofit:2.0.0-beta2' compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2' - compile ('com.squareup.retrofit:converter-simplexml:2.0.0-beta2') { + compile('com.squareup.retrofit:converter-simplexml:2.0.0-beta2') { exclude group: 'xpp3', module: 'xpp3' exclude group: 'stax', module: 'stax-api' exclude group: 'stax', module: 'stax' @@ -76,4 +76,13 @@ dependencies { } debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' + compile('com.github.afollestad:app-theme-engine:0.7.7@aar') { + transitive = true + } + compile('com.github.afollestad.material-dialogs:core:0.8.5.3@aar') { + transitive = true + } + compile('com.github.afollestad.material-dialogs:commons:0.8.5.3@aar') { + transitive = true + } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8aad6016..6b1aedca 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -30,11 +30,9 @@ - + - + + diff --git a/app/src/main/java/com/commit451/gitlab/activity/BaseActivity.java b/app/src/main/java/com/commit451/gitlab/activity/BaseActivity.java index 7c45a1ef..701f4f48 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/BaseActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/BaseActivity.java @@ -1,15 +1,25 @@ package com.commit451.gitlab.activity; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; import android.support.design.widget.TextInputLayout; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; +import com.afollestad.appthemeengine.ATEActivity; import com.commit451.gitlab.R; /** * Created by Jawn on 7/27/2015. */ -public class BaseActivity extends AppCompatActivity { +public class BaseActivity extends ATEActivity { + + @Nullable + @Override + protected final String getATEKey() { + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ? + "dark_theme" : "light_theme"; + } public boolean hasEmptyFields(TextInputLayout... textInputLayouts) { boolean hasEmptyField = false; diff --git a/app/src/main/java/com/commit451/gitlab/activity/GitlabActivity.java b/app/src/main/java/com/commit451/gitlab/activity/GitlabActivity.java index b3bbaeef..ed6e49a0 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/GitlabActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/GitlabActivity.java @@ -6,6 +6,7 @@ import android.os.Bundle; import com.commit451.gitlab.BuildConfig; import com.commit451.gitlab.data.Prefs; import com.commit451.gitlab.model.Account; +import com.commit451.gitlab.util.AppThemeUtil; import com.commit451.gitlab.util.NavigationManager; import java.util.List; @@ -20,6 +21,7 @@ public class GitlabActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { + AppThemeUtil.setupDefaultConfigs(this); super.onCreate(savedInstanceState); int savedVersion = Prefs.getSavedVersion(this); diff --git a/app/src/main/java/com/commit451/gitlab/activity/GroupActivity.java b/app/src/main/java/com/commit451/gitlab/activity/GroupActivity.java index 7b8990a5..831c349c 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/GroupActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/GroupActivity.java @@ -8,6 +8,7 @@ import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; @@ -17,6 +18,7 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ImageView; +import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer; import com.commit451.easel.Easel; import com.commit451.gitlab.R; import com.commit451.gitlab.adapter.GroupPagerAdapter; @@ -38,7 +40,13 @@ import timber.log.Timber; * See the things about the group * Created by John on 10/14/15. */ -public class GroupActivity extends BaseActivity { +public class GroupActivity extends BaseActivity implements ATEActivityThemeCustomizer { + + @Override + public int getActivityTheme() { + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ? + R.style.Activity_Group : R.style.ActivityLight_Group; + } private static final String KEY_GROUP = "key_group"; private static final String KEY_GROUP_ID = "key_group_id"; diff --git a/app/src/main/java/com/commit451/gitlab/activity/GroupsActivity.java b/app/src/main/java/com/commit451/gitlab/activity/GroupsActivity.java index e4a0252b..1cd929bf 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/GroupsActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/GroupsActivity.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SwipeRefreshLayout; @@ -14,6 +15,7 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.TextView; +import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer; import com.commit451.gitlab.R; import com.commit451.gitlab.adapter.GroupAdapter; import com.commit451.gitlab.api.GitLabClient; @@ -35,7 +37,13 @@ import timber.log.Timber; * Displays the groups of the current user * Created by Jawn on 10/4/2015. */ -public class GroupsActivity extends BaseActivity { +public class GroupsActivity extends BaseActivity implements ATEActivityThemeCustomizer { + + @Override + public int getActivityTheme() { + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ? + R.style.Activity_Groups : R.style.ActivityLight_Groups; + } public static Intent newInstance(Context context) { Intent intent = new Intent(context, GroupsActivity.class); diff --git a/app/src/main/java/com/commit451/gitlab/activity/ProjectsActivity.java b/app/src/main/java/com/commit451/gitlab/activity/ProjectsActivity.java index 60472e5c..a287e47e 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/ProjectsActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/ProjectsActivity.java @@ -3,6 +3,7 @@ package com.commit451.gitlab.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.design.widget.NavigationView; import android.support.design.widget.TabLayout; import android.support.v4.view.GravityCompat; @@ -12,6 +13,7 @@ import android.support.v7.widget.Toolbar; import android.view.MenuItem; import android.view.View; +import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer; import com.commit451.gitlab.LabCoatApp; import com.commit451.gitlab.R; import com.commit451.gitlab.adapter.ProjectsPagerAdapter; @@ -26,7 +28,13 @@ import butterknife.ButterKnife; * Shows the projects * Created by Jawn on 9/21/2015. */ -public class ProjectsActivity extends BaseActivity { +public class ProjectsActivity extends BaseActivity implements ATEActivityThemeCustomizer { + + @Override + public int getActivityTheme() { + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ? + R.style.Activity_Projects : R.style.ActivityLight_Projects; + } public static Intent newInstance(Context context) { Intent intent = new Intent(context, ProjectsActivity.class); diff --git a/app/src/main/java/com/commit451/gitlab/activity/SettingsActivity.java b/app/src/main/java/com/commit451/gitlab/activity/SettingsActivity.java index 098b7556..e0050e3a 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/SettingsActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/SettingsActivity.java @@ -2,8 +2,18 @@ package com.commit451.gitlab.activity; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceFragment; +import android.support.annotation.ColorInt; +import android.support.annotation.NonNull; +import android.view.View; +import com.afollestad.appthemeengine.ATE; +import com.afollestad.appthemeengine.Config; +import com.afollestad.appthemeengine.prefs.ATEColorPreference; +import com.afollestad.materialdialogs.color.ColorChooserDialog; import com.commit451.gitlab.R; import butterknife.ButterKnife; @@ -12,7 +22,8 @@ import butterknife.ButterKnife; * Settings screens are fun! * Created by John on 11/10/15. */ -public class SettingsActivity extends BaseActivity { +public class SettingsActivity extends BaseActivity + implements ColorChooserDialog.ColorCallback { public static Intent newInstance(Context context) { Intent intent = new Intent(context, SettingsActivity.class); @@ -24,5 +35,89 @@ public class SettingsActivity extends BaseActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_settings); ButterKnife.bind(this); + + if (savedInstanceState == null) { + getFragmentManager().beginTransaction().replace(R.id.settings_container, new SettingsFragment()).commit(); + } else { + SettingsFragment frag = (SettingsFragment) getFragmentManager().findFragmentById(R.id.settings_container); + if (frag != null) frag.invalidateSettings(); + } + } + + @Override + public void onColorSelection(@NonNull ColorChooserDialog dialog, @ColorInt int selectedColor) { + final Config config = ATE.config(this, getATEKey()); + switch (dialog.getTitle()) { + case R.string.primary_color: + config.primaryColor(selectedColor); + break; + case R.string.accent_color: + config.accentColor(selectedColor); + // We've overridden the navigation view selected colors in the default config, + // which means we are responsible for keeping those colors up to date. + //config.navigationViewSelectedIcon(selectedColor); + //config.navigationViewSelectedText(selectedColor); + break; + } + config.commit(); + recreate(); // recreation needed to reach the checkboxes in the preferences layout + } + + public static class SettingsFragment extends PreferenceFragment { + + String mAteKey; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + invalidateSettings(); + } + + public void invalidateSettings() { + mAteKey = ((SettingsActivity) getActivity()).getATEKey(); + + ATEColorPreference primaryColorPref = (ATEColorPreference) findPreference("primary_color"); + primaryColorPref.setColor(Config.primaryColor(getActivity(), mAteKey), Color.BLACK); + primaryColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + new ColorChooserDialog.Builder((SettingsActivity) getActivity(), R.string.primary_color) + .preselect(Config.primaryColor(getActivity(), mAteKey)) + .show(); + return true; + } + }); + + ATEColorPreference accentColorPref = (ATEColorPreference) findPreference("accent_color"); + accentColorPref.setColor(Config.accentColor(getActivity(), mAteKey), Color.BLACK); + accentColorPref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + new ColorChooserDialog.Builder((SettingsActivity) getActivity(), R.string.accent_color) + .preselect(Config.accentColor(getActivity(), mAteKey)) + .show(); + return true; + } + }); + + findPreference("dark_theme").setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + // Marks both theme configs as changed so MainActivity restarts itself on return + Config.markChanged(getActivity(), "light_theme"); + Config.markChanged(getActivity(), "dark_theme"); + // The dark_theme preference value gets saved by Android in the default PreferenceManager. + // It's used in getATEKey() of both the Activities. + getActivity().recreate(); + return true; + } + }); + } } } diff --git a/app/src/main/java/com/commit451/gitlab/activity/UserActivity.java b/app/src/main/java/com/commit451/gitlab/activity/UserActivity.java index 8dc62f89..ea3990db 100644 --- a/app/src/main/java/com/commit451/gitlab/activity/UserActivity.java +++ b/app/src/main/java/com/commit451/gitlab/activity/UserActivity.java @@ -11,6 +11,7 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.design.widget.CollapsingToolbarLayout; import android.support.v4.app.FragmentTransaction; import android.support.v7.graphics.Palette; @@ -18,6 +19,7 @@ import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ImageView; +import com.afollestad.appthemeengine.customizers.ATEActivityThemeCustomizer; import com.commit451.easel.Easel; import com.commit451.gitlab.R; import com.commit451.gitlab.api.GitLabClient; @@ -36,7 +38,13 @@ import butterknife.ButterKnife; * User activity, which shows the user! * Created by Jawn on 9/21/2015. */ -public class UserActivity extends BaseActivity { +public class UserActivity extends BaseActivity implements ATEActivityThemeCustomizer { + + @Override + public int getActivityTheme() { + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_theme", true) ? + R.style.Activity_User : R.style.ActivityLight_User; + } private static final String KEY_USER = "user"; diff --git a/app/src/main/java/com/commit451/gitlab/util/AppThemeUtil.java b/app/src/main/java/com/commit451/gitlab/util/AppThemeUtil.java new file mode 100644 index 00000000..36674c28 --- /dev/null +++ b/app/src/main/java/com/commit451/gitlab/util/AppThemeUtil.java @@ -0,0 +1,34 @@ +package com.commit451.gitlab.util; + +import android.content.Context; + +import com.afollestad.appthemeengine.ATE; +import com.commit451.gitlab.R; + +public class AppThemeUtil { + + public static void setupDefaultConfigs(Context context) { + if (!ATE.config(context, "light_theme").isConfigured(0)) { + ATE.config(context, "light_theme") + .activityTheme(R.style.AppThemeLight) + .primaryColorRes(R.color.primary_default) + .accentColorRes(R.color.accent_default) + .coloredNavigationBar(false) + .usingMaterialDialogs(true) + //.navigationViewSelectedIconRes(R.color.colorAccentLightDefault) + //.navigationViewSelectedTextRes(R.color.colorAccentLightDefault) + .commit(); + } + if (!ATE.config(context, "dark_theme").isConfigured(0)) { + ATE.config(context, "dark_theme") + .activityTheme(R.style.AppTheme) + .primaryColorRes(R.color.primary_default) + .accentColorRes(R.color.accent_default) + .coloredNavigationBar(true) + .usingMaterialDialogs(true) + //.navigationViewSelectedIconRes(R.color.colorAccentDarkDefault) + //.navigationViewSelectedTextRes(R.color.colorAccentDarkDefault) + .commit(); + } + } +} diff --git a/app/src/main/java/com/commit451/gitlab/util/NavigationManager.java b/app/src/main/java/com/commit451/gitlab/util/NavigationManager.java index e370d8ad..be5f1867 100644 --- a/app/src/main/java/com/commit451/gitlab/util/NavigationManager.java +++ b/app/src/main/java/com/commit451/gitlab/util/NavigationManager.java @@ -24,6 +24,7 @@ import com.commit451.gitlab.activity.MilestoneActivity; import com.commit451.gitlab.activity.ProjectActivity; import com.commit451.gitlab.activity.ProjectsActivity; import com.commit451.gitlab.activity.SearchActivity; +import com.commit451.gitlab.activity.SettingsActivity; import com.commit451.gitlab.activity.UserActivity; import com.commit451.gitlab.model.Account; import com.commit451.gitlab.model.api.Group; @@ -47,6 +48,10 @@ public class NavigationManager { activity.startActivity(AboutActivity.newInstance(activity)); } + public static void navigateToSettings(Activity activity) { + activity.startActivity(SettingsActivity.newInstance(activity)); + } + public static void navigateToProject(Activity activity, Project project) { activity.startActivity(ProjectActivity.newInstance(activity, project)); } diff --git a/app/src/main/java/com/commit451/gitlab/view/GitLabNavigationView.java b/app/src/main/java/com/commit451/gitlab/view/GitLabNavigationView.java index e82404d1..171a65bd 100644 --- a/app/src/main/java/com/commit451/gitlab/view/GitLabNavigationView.java +++ b/app/src/main/java/com/commit451/gitlab/view/GitLabNavigationView.java @@ -82,6 +82,10 @@ public class GitLabNavigationView extends NavigationView { } LabCoatApp.bus().post(new CloseDrawerEvent()); return true; + case R.id.nav_settings: + LabCoatApp.bus().post(new CloseDrawerEvent()); + NavigationManager.navigateToSettings((Activity) getContext()); + return true; case R.id.nav_about: LabCoatApp.bus().post(new CloseDrawerEvent()); NavigationManager.navigateToAbout((Activity) getContext()); diff --git a/app/src/main/res/drawable/ic_settings_24dp.xml b/app/src/main/res/drawable/ic_settings_24dp.xml new file mode 100644 index 00000000..c8802a09 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings_24dp.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 992df9b6..9cf67462 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -1,47 +1,13 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> - - - - - - - - - - - - - - - + android:layout_height="match_parent" + android:paddingTop="?attr/actionBarSize" /> + android:background="?attr/colorPrimary" /> diff --git a/app/src/main/res/menu/navigation.xml b/app/src/main/res/menu/navigation.xml index 61ebf76d..2346bcf6 100644 --- a/app/src/main/res/menu/navigation.xml +++ b/app/src/main/res/menu/navigation.xml @@ -1,8 +1,9 @@ - + - - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 00000000..bce084ce --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a8ff9020..697333b3 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -27,4 +27,7 @@ #99323232 + @color/main_blue + @color/yellow + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c83cd535..8b028aa8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -298,5 +298,12 @@ Failed to remove member - Trust all hosts + Settings + Theme + Dark Theme + Apply a dark theme throughout the app + Primary Color + Change the primary theme color + Accent Color + Change the accent theme color \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b8c9e70a..e1a03cfc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,14 +1,11 @@ + + + + + + + + + + + + + + +