diff --git a/Habitica/AndroidManifest.xml b/Habitica/AndroidManifest.xml index befddad3c..f862a3dc7 100644 --- a/Habitica/AndroidManifest.xml +++ b/Habitica/AndroidManifest.xml @@ -37,7 +37,6 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Habitica/res/values/colors.xml b/Habitica/res/values/colors.xml index 7772fd095..f7ebf2180 100644 --- a/Habitica/res/values/colors.xml +++ b/Habitica/res/values/colors.xml @@ -92,9 +92,11 @@ #c8ffffff #32000000 + + @color/colorAccent #ff5cb85c #fff0ad4e #ffd9534f - \ No newline at end of file + diff --git a/Habitica/res/values/styles.xml b/Habitica/res/values/styles.xml index 1e887b67f..2b12db529 100644 --- a/Habitica/res/values/styles.xml +++ b/Habitica/res/values/styles.xml @@ -36,6 +36,7 @@ @style/PopupTheme @style/PopupTheme @style/PopupTheme + @style/PreferenceThemeOverlay.v14.Material - - diff --git a/Habitica/res/xml/preferences_account_details.xml b/Habitica/res/xml/preferences_account_details.xml deleted file mode 100644 index cbcfb6201..000000000 --- a/Habitica/res/xml/preferences_account_details.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Habitica/res/xml/preferences_fragment.xml b/Habitica/res/xml/preferences_fragment.xml index 2289ac7b3..65f4fdf66 100644 --- a/Habitica/res/xml/preferences_fragment.xml +++ b/Habitica/res/xml/preferences_fragment.xml @@ -1,28 +1,72 @@ + - + + + + + + + + + + + + + + + + - + + + + + \ No newline at end of file diff --git a/Habitica/src/com/habitrpg/android/habitica/prefs/TimePreference.java b/Habitica/src/com/habitrpg/android/habitica/prefs/TimePreference.java index c1182f832..84c19f9ff 100644 --- a/Habitica/src/com/habitrpg/android/habitica/prefs/TimePreference.java +++ b/Habitica/src/com/habitrpg/android/habitica/prefs/TimePreference.java @@ -2,19 +2,12 @@ package com.habitrpg.android.habitica.prefs; import android.content.Context; import android.content.res.TypedArray; -import android.os.Build; -import android.preference.DialogPreference; +import android.support.v7.preference.DialogPreference; import android.util.AttributeSet; -import android.view.View; -import android.widget.TimePicker; -// public class TimePreference extends DialogPreference { - private int lastHour = 0; - private int lastMinute = 0; private String timeval; - private CharSequence mSummary; - private TimePicker picker = null; + public static int getHour(String timeval) { String[] pieces = timeval.split(":"); return (Integer.parseInt(pieces[0])); @@ -33,48 +26,6 @@ public class TimePreference extends DialogPreference { setNegativeButtonText("Cancel"); } - @Override - protected View onCreateDialogView() { - picker = new TimePicker(getContext()); - return (picker); - } - - @Override - protected void onBindDialogView(View v) { - super.onBindDialogView(v); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - picker.setHour(lastHour); - picker.setMinute(lastMinute); - } else { - picker.setCurrentHour(lastHour); - picker.setCurrentMinute(lastMinute); - } - } - - @Override - protected void onDialogClosed(boolean positiveResult) { - super.onDialogClosed(positiveResult); - - if (positiveResult) { - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - lastHour = picker.getHour(); - lastMinute = picker.getMinute(); - } else { - lastHour = picker.getCurrentHour(); - lastMinute = picker.getCurrentMinute(); - } - String timeval = String.valueOf(lastHour) + ":" + String.format("%02d", lastMinute); - - this.setSummary(timeval); - - if (callChangeListener(timeval)) { - persistString(timeval); - } - } - } - @Override protected Object onGetDefaultValue(TypedArray a, int index) { return (a.getString(index)); @@ -94,8 +45,6 @@ public class TimePreference extends DialogPreference { timeval = defaultValue.toString(); } setSummary(timeval); - lastHour = getHour(timeval); - lastMinute = getMinute(timeval); } public void setText(String text) { @@ -111,6 +60,14 @@ public class TimePreference extends DialogPreference { } } + public int getLastHour() { + return getHour(timeval); + } + + public int getLastMinute() { + return getMinute(timeval); + } + public String getText() { return timeval; } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java index 33bfcfac1..bacafb772 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/MainDrawerBuilder.java @@ -92,9 +92,9 @@ public class MainDrawerBuilder { new DividerDrawerItem(), //new SecondaryDrawerItem().withName(activity.getString(R.string.sidebar_news)), - new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_settings)).withIdentifier(SIDEBAR_SETTINGS), + new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_settings)).withIdentifier(SIDEBAR_SETTINGS).withSelectable(false), new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_help)).withIdentifier(SIDEBAR_HELP), - new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_about)).withIdentifier(SIDEBAR_ABOUT) + new PrimaryDrawerItem().withName(activity.getString(R.string.sidebar_about)).withIdentifier(SIDEBAR_ABOUT).withSelectable(false) ) .withStickyFooterDivider(false) diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/BaseActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/BaseActivity.java index d2d26b7b2..41a095845 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/BaseActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/BaseActivity.java @@ -1,7 +1,9 @@ package com.habitrpg.android.habitica.ui.activities; import android.os.Bundle; +import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.Toolbar; import butterknife.ButterKnife; @@ -15,4 +17,19 @@ public abstract class BaseActivity extends AppCompatActivity { setContentView(getLayoutResId()); ButterKnife.bind(this); } + + protected void setupToolbar(Toolbar toolbar) { + if (toolbar != null) { + setSupportActionBar(toolbar); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowHomeEnabled(false); + actionBar.setDisplayShowTitleEnabled(true); + actionBar.setDisplayUseLogoEnabled(false); + actionBar.setHomeButtonEnabled(false); + } + } + } } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java index 9e1e0cfe4..41e14c365 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/LoginActivity.java @@ -106,7 +106,6 @@ public class LoginActivity extends AppCompatActivity setContentView(R.layout.login_screen); //Set default values to avoid null-responses when requesting unedited settings - PreferenceManager.setDefaultValues(this, R.xml.preferences_account_details, false); PreferenceManager.setDefaultValues(this, R.xml.preferences_fragment, false); ButterKnife.bind(this); diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java index d7ff85f1d..acf0fcb5c 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/MainActivity.java @@ -149,18 +149,7 @@ public class MainActivity extends BaseActivity implements HabitRPGUserCallback.O new Select().from(HabitRPGUser.class).where(Condition.column("id").eq(hostConfig.getUser())).async().querySingle(userTransactionListener); - if (toolbar != null) { - setSupportActionBar(toolbar); - - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setDisplayShowHomeEnabled(false); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setDisplayUseLogoEnabled(false); - actionBar.setHomeButtonEnabled(false); - } - } + setupToolbar(toolbar); avatarInHeader = new AvatarWithBarsViewModel(this, avatar_with_bars); accountHeader = MainDrawerBuilder.CreateDefaultAccountHeader(this).build(); diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java b/Habitica/src/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java index 803b92566..0455a498a 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/activities/PrefsActivity.java @@ -4,34 +4,71 @@ import android.content.Context; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatActivity; +import android.support.v7.preference.PreferenceFragmentCompat; +import android.support.v7.preference.PreferenceScreen; +import android.support.v7.widget.Toolbar; import com.habitrpg.android.habitica.HostConfig; import com.habitrpg.android.habitica.R; +import com.habitrpg.android.habitica.ui.fragments.AccountDetailsFragment; import com.habitrpg.android.habitica.ui.fragments.PreferencesFragment; -public class PrefsActivity extends AppCompatActivity { +import butterknife.Bind; + +public class PrefsActivity extends BaseActivity implements + PreferenceFragmentCompat.OnPreferenceStartScreenCallback { + + @Bind(R.id.toolbar) + Toolbar toolbar; + + @Override + protected int getLayoutResId() { + return R.layout.activity_prefs; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setupActionBar(); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, new PreferencesFragment()) + setupToolbar(toolbar); + + getSupportFragmentManager().beginTransaction() + .add(R.id.fragment_container, new PreferencesFragment()) .commit(); } - private void setupActionBar() { - ActionBar actionBar = getSupportActionBar(); - - if (actionBar != null) { - actionBar.setDisplayHomeAsUpEnabled(true); - actionBar.setHomeButtonEnabled(true); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setDisplayUseLogoEnabled(false); + @Override + public boolean onSupportNavigateUp() { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + onBackPressed(); + return true; } + return super.onSupportNavigateUp(); + } + + @Override + public boolean onPreferenceStartScreen(PreferenceFragmentCompat preferenceFragment, + PreferenceScreen preferenceScreen) { + PreferenceFragmentCompat fragment = createNextPage(preferenceScreen); + if (fragment != null) { + Bundle arguments = new Bundle(); + arguments.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey()); + fragment.setArguments(arguments); + getSupportFragmentManager().beginTransaction() + .replace(R.id.fragment_container, fragment) + .addToBackStack(null) + .commit(); + return true; + } + return false; + } + + private PreferenceFragmentCompat createNextPage(PreferenceScreen preferenceScreen) { + PreferenceFragmentCompat fragment = null; + if (preferenceScreen.getKey().equals("accountDetails")) { + fragment = new AccountDetailsFragment(); + } + return fragment; } // TODO: diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AccountDetailsFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AccountDetailsFragment.java index b2de9aa02..f65b6888a 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AccountDetailsFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/AccountDetailsFragment.java @@ -3,55 +3,40 @@ package com.habitrpg.android.habitica.ui.fragments; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; +import android.support.v7.preference.Preference; import android.widget.Toast; import com.habitrpg.android.habitica.R; import java.util.Arrays; +import java.util.List; import java.util.Map; /** * Created by franzejr on 28/11/15. */ -public class AccountDetailsFragment extends PreferenceFragment { - private Context context; - +public class AccountDetailsFragment extends BasePreferencesFragment { @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - context = this.getActivity(); - addPreferencesFromResource(R.xml.preferences_account_details); - setupPreferences(); - } - - private void setupPreferences() { - - String[] accountDetailsPreferences = { - context.getResources().getString(R.string.SP_username), - context.getResources().getString(R.string.SP_email), - context.getResources().getString(R.string.SP_APIToken), - context.getResources().getString(R.string.SP_userID) - }; - - for(Map.Entry preference : getPreferenceScreen().getSharedPreferences().getAll().entrySet() ){ + protected void setupPreferences() { + for (Map.Entry preference : getPreferenceScreen().getSharedPreferences().getAll().entrySet()) { String key = preference.getKey(); - if (Arrays.asList(accountDetailsPreferences).contains(key)) { - findPreference(key).setSummary(preference.getValue().toString()); + if (getAccountDetailsPreferences().contains(key)) { + findPreference(key).setSummary(preference.getValue().toString()); } } } + protected List getAccountDetailsPreferences() { + return Arrays.asList(getString(R.string.SP_username), getString(R.string.SP_email), + getString(R.string.SP_APIToken), getString(R.string.SP_userID)); + } @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + public boolean onPreferenceTreeClick(Preference preference) { ClipboardManager clipMan = (ClipboardManager) getActivity().getSystemService(Context.CLIPBOARD_SERVICE); clipMan.setPrimaryClip(ClipData.newPlainText(preference.getKey(), preference.getSummary())); Toast.makeText(getActivity(), "Copied " + preference.getKey() + " to clipboard.", Toast.LENGTH_SHORT).show(); - return super.onPreferenceTreeClick(preferenceScreen, preference); + return super.onPreferenceTreeClick(preference); } } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BasePreferencesFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BasePreferencesFragment.java new file mode 100644 index 000000000..b47f8ab9c --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/BasePreferencesFragment.java @@ -0,0 +1,18 @@ +package com.habitrpg.android.habitica.ui.fragments; + +import android.os.Bundle; +import android.support.v7.preference.PreferenceFragmentCompat; + +import com.habitrpg.android.habitica.R; + +public abstract class BasePreferencesFragment extends PreferenceFragmentCompat { + + @Override + public void onCreatePreferences(Bundle bundle, String rootKey) { + setPreferencesFromResource(R.xml.preferences_fragment, rootKey); + setupPreferences(); + } + + protected abstract void setupPreferences(); + +} diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java index d0317cd55..1a6d6d285 100644 --- a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/PreferencesFragment.java @@ -6,13 +6,10 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.Preference; -import android.preference.PreferenceFragment; -import android.preference.PreferenceScreen; +import android.support.v7.preference.Preference; import com.habitrpg.android.habitica.HabiticaApplication; import com.habitrpg.android.habitica.NotificationPublisher; -import com.habitrpg.android.habitica.R; import com.habitrpg.android.habitica.prefs.TimePreference; import java.util.Calendar; @@ -20,18 +17,24 @@ import java.util.Calendar; /** * Created by franzejr on 28/11/15. */ -public class PreferencesFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { +public class PreferencesFragment extends BasePreferencesFragment implements + SharedPreferences.OnSharedPreferenceChangeListener { + private Context context; private TimePreference timePreference; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - context = this.getActivity(); - addPreferencesFromResource(R.xml.preferences_fragment); + + context = getActivity(); + } + + @Override + protected void setupPreferences() { timePreference = (TimePreference) findPreference("reminder_time"); - boolean use_reminder = getPreferenceManager().getSharedPreferences().getBoolean("use_reminder", false); - timePreference.setEnabled(use_reminder); + boolean useReminder = getPreferenceManager().getSharedPreferences().getBoolean("use_reminder", false); + timePreference.setEnabled(useReminder); } @Override @@ -48,24 +51,14 @@ public class PreferencesFragment extends PreferenceFragment implements SharedPre } @Override - public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { - + public boolean onPreferenceTreeClick(Preference preference) { if (preference.getKey().equals("logout")) { HabiticaApplication.logout(context); getActivity().finish(); - }else if(preference.getKey().equals("accountDetails")) { - openAccountDetailsFragment(); } - return false; + return super.onPreferenceTreeClick(preference); } - private void openAccountDetailsFragment() { - getFragmentManager().beginTransaction() - .replace(android.R.id.content, new AccountDetailsFragment()).addToBackStack(null) - .commit(); - } - - private void scheduleNotifications() { String timeval = getPreferenceManager().getSharedPreferences().getString("reminder_time", "19:00"); @@ -114,4 +107,17 @@ public class PreferencesFragment extends PreferenceFragment implements SharedPre scheduleNotifications(); } } + + @Override + public void onDisplayPreferenceDialog(Preference preference) { + if (preference instanceof TimePreference) { + if (getFragmentManager().findFragmentByTag(TimePreferenceDialogFragment.TAG) == null) { + TimePreferenceDialogFragment.newInstance(this, preference.getKey()) + .show(getFragmentManager(), TimePreferenceDialogFragment.TAG); + } + } else { + super.onDisplayPreferenceDialog(preference); + } + } + } diff --git a/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TimePreferenceDialogFragment.java b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TimePreferenceDialogFragment.java new file mode 100644 index 000000000..ac75be8e3 --- /dev/null +++ b/Habitica/src/com/habitrpg/android/habitica/ui/fragments/TimePreferenceDialogFragment.java @@ -0,0 +1,87 @@ +package com.habitrpg.android.habitica.ui.fragments; + +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.support.v7.preference.PreferenceDialogFragmentCompat; +import android.support.v7.preference.PreferenceFragmentCompat; +import android.view.View; +import android.widget.TimePicker; + +import com.habitrpg.android.habitica.prefs.TimePreference; + +import java.util.Locale; + +public class TimePreferenceDialogFragment extends PreferenceDialogFragmentCompat { + + public static final String TAG = TimePreferenceDialogFragment.class.getSimpleName(); + + private TimePicker picker = null; + + public TimePreferenceDialogFragment() { + } + + public static TimePreferenceDialogFragment newInstance( + PreferenceFragmentCompat preferenceFragment, String key) { + TimePreferenceDialogFragment fragment = new TimePreferenceDialogFragment(); + Bundle arguments = new Bundle(1); + arguments.putString(ARG_KEY, key); + fragment.setArguments(arguments); + fragment.setTargetFragment(preferenceFragment, 0); + return fragment; + } + + private TimePreference getTimePreference() { + return (TimePreference) getPreference(); + } + + @Override + protected View onCreateDialogView(Context context) { + picker = new TimePicker(getContext()); + return picker; + } + + protected void onBindDialogView(View view) { + super.onBindDialogView(view); + + TimePreference preference = getTimePreference(); + int lastHour = preference.getLastHour(); + int lastMinute = preference.getLastMinute(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + picker.setHour(lastHour); + picker.setMinute(lastMinute); + } else { + picker.setCurrentHour(lastHour); + picker.setCurrentMinute(lastMinute); + } + } + + @Override + public void onDialogClosed(boolean positiveResult) { + if (positiveResult) { + TimePreference preference = getTimePreference(); + String time = getNewTimeValue(); + + preference.setSummary(time); + + if (preference.callChangeListener(time)) { + preference.setText(time); + } + } + + } + + private String getNewTimeValue() { + int lastHour; + int lastMinute; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + lastHour = picker.getHour(); + lastMinute = picker.getMinute(); + } else { + lastHour = picker.getCurrentHour(); + lastMinute = picker.getCurrentMinute(); + } + return String.valueOf(lastHour) + ":" + String.format(Locale.UK, "%02d", lastMinute); + } +} +