From 64536a3a3f12ab543332f262a1c0772f4e8e23a4 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 23 Jun 2015 18:06:43 -0700 Subject: [PATCH 01/16] General section if Site Settings added. Using REST API to pull site info --- .../ui/prefs/BlogPreferencesActivity.java | 237 +----------------- .../android/ui/prefs/SeekBarPreference.java | 82 ++++++ .../ui/prefs/SiteSettingsFragment.java | 131 ++++++++++ .../wordpress/android/util/WPRestClient.java | 7 + .../src/main/res/layout/seekbar_pref.xml | 58 +++++ WordPress/src/main/res/values/strings.xml | 16 ++ WordPress/src/main/res/xml/site_settings.xml | 54 ++++ .../android/networking/RestClientUtils.java | 7 + 8 files changed, 362 insertions(+), 230 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java create mode 100644 WordPress/src/main/res/layout/seekbar_pref.xml create mode 100644 WordPress/src/main/res/xml/site_settings.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java index db2316c62e28..0abe78a27505 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java @@ -1,34 +1,17 @@ package org.wordpress.android.ui.prefs; -import android.app.AlertDialog; -import android.content.DialogInterface; +import android.app.Fragment; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.Spinner; -import android.widget.TextView; import android.widget.Toast; import org.wordpress.android.R; import org.wordpress.android.WordPress; -import org.wordpress.android.models.AccountHelper; import org.wordpress.android.models.Blog; import org.wordpress.android.ui.ActivityLauncher; -import org.wordpress.android.ui.stats.datasets.StatsTable; -import org.wordpress.android.util.AnalyticsUtils; -import org.wordpress.android.util.CoreEvents.UserSignedOutCompletely; import org.wordpress.android.util.StringUtils; -import org.wordpress.android.util.ToastUtils; - -import de.greenrobot.event.EventBus; /** * Activity for configuring blog specific settings. @@ -39,20 +22,10 @@ public class BlogPreferencesActivity extends AppCompatActivity { // The blog this activity is managing settings for. private Blog blog; - private boolean mBlogDeleted; - private EditText mUsernameET; - private EditText mPasswordET; - private EditText mHttpUsernameET; - private EditText mHttpPasswordET; - private CheckBox mFullSizeCB; - private CheckBox mScaledCB; - private Spinner mImageWidthSpinner; - private EditText mScaledImageWidthET; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.blog_preferences); Integer id = getIntent().getIntExtra(ARG_LOCAL_BLOG_ID, -1); blog = WordPress.getBlog(id); @@ -63,39 +36,18 @@ public void onCreate(Bundle savedInstanceState) { return; } + Fragment siteSettingsFragment = new SiteSettingsFragment(); + siteSettingsFragment.setArguments(getIntent().getExtras()); + getFragmentManager().beginTransaction() + .replace(android.R.id.content, siteSettingsFragment) + .commit(); + ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { actionBar.setElevation(0.0f); actionBar.setTitle(StringUtils.unescapeHTML(blog.getNameOrHostUrl())); actionBar.setDisplayHomeAsUpEnabled(true); } - - mUsernameET = (EditText) findViewById(R.id.username); - mPasswordET = (EditText) findViewById(R.id.password); - mHttpUsernameET = (EditText) findViewById(R.id.httpuser); - mHttpPasswordET = (EditText) findViewById(R.id.httppassword); - mScaledImageWidthET = (EditText) findViewById(R.id.scaledImageWidth); - mFullSizeCB = (CheckBox) findViewById(R.id.fullSizeImage); - mScaledCB = (CheckBox) findViewById(R.id.scaledImage); - mImageWidthSpinner = (Spinner) findViewById(R.id.maxImageWidth); - Button removeBlogButton = (Button) findViewById(R.id.remove_account); - - // remove blog & credentials apply only to dot org - if (blog.isDotcomFlag()) { - View credentialsRL = findViewById(R.id.sectionContent); - credentialsRL.setVisibility(View.GONE); - removeBlogButton.setVisibility(View.GONE); - } else { - removeBlogButton.setVisibility(View.VISIBLE); - removeBlogButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - removeBlogWithConfirmation(); - } - }); - } - - loadSettingsForBlog(); } @Override @@ -108,50 +60,6 @@ public void finish() { protected void onPause() { super.onPause(); - if (mBlogDeleted) { - return; - } - - blog.setUsername(mUsernameET.getText().toString()); - blog.setPassword(mPasswordET.getText().toString()); - blog.setHttpuser(mHttpUsernameET.getText().toString()); - blog.setHttppassword(mHttpPasswordET.getText().toString()); - - blog.setFullSizeImage(mFullSizeCB.isChecked()); - blog.setScaledImage(mScaledCB.isChecked()); - if (blog.isScaledImage()) { - EditText scaledImgWidth = (EditText) findViewById(R.id.scaledImageWidth); - - boolean error = false; - int width = 0; - try { - width = Integer.parseInt(scaledImgWidth.getText().toString().trim()); - } catch (NumberFormatException e) { - error = true; - } - - if (width == 0) { - error = true; - } - - if (error) { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(BlogPreferencesActivity.this); - dialogBuilder.setTitle(getResources().getText(R.string.error)); - dialogBuilder.setMessage(getResources().getText(R.string.scaled_image_error)); - dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - } - }); - dialogBuilder.setCancelable(true); - dialogBuilder.create().show(); - return; - } else { - blog.setScaledImageWidth(width); - } - } - - blog.setMaxImageWidth(mImageWidthSpinner.getSelectedItem().toString()); - WordPress.wpDB.saveBlog(blog); if (WordPress.getCurrentBlog().getLocalTableBlogId() == blog.getLocalTableBlogId()) { @@ -169,135 +77,4 @@ public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } - - private void loadSettingsForBlog() { - ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this, - R.layout.simple_spinner_item, new String[]{ - "Original Size", "100", "200", "300", "400", "500", "600", "700", "800", - "900", "1000", "1100", "1200", "1300", "1400", "1500", "1600", "1700", - "1800", "1900", "2000" - }); - spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mImageWidthSpinner.setAdapter(spinnerArrayAdapter); - mImageWidthSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int position, long id) { - CheckBox fullSizeImageCheckBox = (CheckBox) findViewById(R.id.fullSizeImage); - // Original size selected. Do not show the link to full image. - if (id == 0) { - fullSizeImageCheckBox.setVisibility(View.GONE); - } else { - fullSizeImageCheckBox.setVisibility(View.VISIBLE); - } - } - - @Override - public void onNothingSelected(AdapterView arg0) { - } - }); - - mUsernameET.setText(blog.getUsername()); - mPasswordET.setText(blog.getPassword()); - mHttpUsernameET.setText(blog.getHttpuser()); - mHttpPasswordET.setText(blog.getHttppassword()); - TextView httpUserLabel = (TextView) findViewById(R.id.l_httpuser); - if (blog.isDotcomFlag()) { - mHttpUsernameET.setVisibility(View.GONE); - mHttpPasswordET.setVisibility(View.GONE); - httpUserLabel.setVisibility(View.GONE); - } else { - mHttpUsernameET.setVisibility(View.VISIBLE); - mHttpPasswordET.setVisibility(View.VISIBLE); - httpUserLabel.setVisibility(View.VISIBLE); - } - - mFullSizeCB.setChecked(blog.isFullSizeImage()); - mScaledCB.setChecked(blog.isScaledImage()); - - this.mScaledImageWidthET.setText("" + blog.getScaledImageWidth()); - showScaledSetting(blog.isScaledImage()); - - CheckBox scaledImage = (CheckBox) findViewById(R.id.scaledImage); - scaledImage.setChecked(false); - scaledImage.setVisibility(View.GONE); - - // sets up a state listener for the full-size checkbox - CheckBox fullSizeImageCheckBox = (CheckBox) findViewById(R.id.fullSizeImage); - fullSizeImageCheckBox.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - CheckBox fullSize = (CheckBox) findViewById(R.id.fullSizeImage); - if (fullSize.isChecked()) { - CheckBox scaledImage = (CheckBox) findViewById(R.id.scaledImage); - if (scaledImage.isChecked()) { - scaledImage.setChecked(false); - showScaledSetting(false); - } - } - } - }); - - int imageWidthPosition = spinnerArrayAdapter.getPosition(blog.getMaxImageWidth()); - mImageWidthSpinner.setSelection((imageWidthPosition >= 0) ? imageWidthPosition : 0); - if (mImageWidthSpinner.getSelectedItemPosition() == - 0) //Original size selected. Do not show the link to full image. - { - fullSizeImageCheckBox.setVisibility(View.GONE); - } else { - fullSizeImageCheckBox.setVisibility(View.VISIBLE); - } - } - - /** - * Hides / shows the scaled image settings - */ - private void showScaledSetting(boolean show) { - TextView tw = (TextView) findViewById(R.id.l_scaledImage); - EditText et = (EditText) findViewById(R.id.scaledImageWidth); - tw.setVisibility(show ? View.VISIBLE : View.GONE); - et.setVisibility(show ? View.VISIBLE : View.GONE); - } - - /** - * Remove the blog this activity is managing settings for. - */ - private void removeBlogWithConfirmation() { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - dialogBuilder.setTitle(getResources().getText(R.string.remove_account)); - dialogBuilder.setMessage(getResources().getText(R.string.sure_to_remove_account)); - dialogBuilder.setPositiveButton(getResources().getText(R.string.yes), new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int whichButton) { - removeBlog(); - } - }); - dialogBuilder.setNegativeButton(getResources().getText(R.string.no), null); - dialogBuilder.setCancelable(false); - dialogBuilder.create().show(); - } - - private void removeBlog() { - if (WordPress.wpDB.deleteBlog(this, blog.getLocalTableBlogId())) { - StatsTable.deleteStatsForBlog(this,blog.getLocalTableBlogId()); // Remove stats data - AnalyticsUtils.refreshMetadata(); - ToastUtils.showToast(this, R.string.blog_removed_successfully); - WordPress.wpDB.deleteLastBlogId(); - WordPress.currentBlog = null; - mBlogDeleted = true; - setResult(RESULT_BLOG_REMOVED); - - // If the last blog is removed and the user is not signed in wpcom, broadcast a UserSignedOut event - if (!AccountHelper.isSignedIn()) { - EventBus.getDefault().post(new UserSignedOutCompletely()); - } - - finish(); - } else { - AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this); - dialogBuilder.setTitle(getResources().getText(R.string.error)); - dialogBuilder.setMessage(getResources().getText(R.string.could_not_remove_account)); - dialogBuilder.setPositiveButton("OK", null); - dialogBuilder.setCancelable(true); - dialogBuilder.create().show(); - } - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java new file mode 100644 index 000000000000..8dd149800d5b --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -0,0 +1,82 @@ +package org.wordpress.android.ui.prefs; + +import android.app.Activity; +import android.content.Context; +import android.preference.Preference; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.SeekBar; + +import org.wordpress.android.R; + +public class SeekBarPreference extends Preference { + private SeekBar mSeekBar; + + public SeekBarPreference(Context context) { + super(context); + } + + public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SeekBarPreference(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public View onCreateView(ViewGroup parent) { + super.onCreateView(parent); + + LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View view = li.inflate(R.layout.seekbar_pref, parent, false); + + if (view != null) { + mSeekBar = (SeekBar) view.findViewById(R.id.seekbar_pref_bar); + if (mSeekBar != null) { + mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + int progress = seekBar.getProgress(); + + if (progress <= 33) { + updateProgress(mSeekBar, 0); + setSummary("Allow search engines to index this site"); + } else if (progress <= 67) { + updateProgress(mSeekBar, 50); + setSummary("Discourage search engines from indexing this site"); + } else { + updateProgress(mSeekBar, 100); + setSummary("I would like my site to be private, visible only to users I choose"); + } + } + } + ); + } + } + + return view; + } + + private void updateProgress(final SeekBar seekBar, final int progress) { + final Activity activity = (Activity) getContext(); + if (activity == null || seekBar == null) return; + + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + seekBar.setProgress(progress); + } + }); + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java new file mode 100644 index 000000000000..81fe70d927ef --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -0,0 +1,131 @@ +package org.wordpress.android.ui.prefs; + +import android.os.Bundle; +import android.preference.EditTextPreference; +import android.preference.MultiSelectListPreference; +import android.preference.Preference; +import android.preference.PreferenceFragment; + +import com.android.volley.VolleyError; +import com.wordpress.rest.RestRequest; + +import org.json.JSONObject; +import org.wordpress.android.R; +import org.wordpress.android.WordPress; +import org.wordpress.android.models.Blog; + +public class SiteSettingsFragment extends PreferenceFragment { + private Blog mBlog; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + addPreferencesFromResource(R.xml.site_settings); + + Integer id = getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1); + mBlog = WordPress.getBlog(id); + + if (mBlog != null) { + final EditTextPreference titlePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); + final EditTextPreference taglinePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); + final MultiSelectListPreference languagePreference = + (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_language)); + final SeekBarPreference visibilityPreference = + (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); + + WordPress.getRestClientUtils().getGeneralSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + if (titlePreference != null) { + titlePreference.setText(response.optString("title")); + titlePreference.setSummary(response.optString("title")); + } + + if (taglinePreference != null) { + taglinePreference.setText(response.optString("description")); + taglinePreference.setSummary(response.optString("description")); + } + + if (languagePreference != null) { + languagePreference.setDefaultValue(response.optString("lang")); + languagePreference.setSummary(response.optString("lang")); + } + + if (visibilityPreference != null) { + } + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (taglinePreference != null) { + taglinePreference.setEnabled(false); + taglinePreference.setSummary("Failed to retrieve :("); + } + } + }); + + if (titlePreference != null) { + titlePreference.setText(mBlog.getBlogName()); + titlePreference.setSummary(mBlog.getBlogName()); + titlePreference.setOnPreferenceChangeListener(mTitleChangeListener); + } + + if (taglinePreference != null) { + taglinePreference.setOnPreferenceChangeListener(mTaglineChangeListener); + } + + if (languagePreference != null) { + languagePreference.setOnPreferenceChangeListener(mLanguageChangeListener); + } + + if (visibilityPreference != null) { + visibilityPreference.setOnPreferenceChangeListener(mVisibilityChangeListener); + } + } + } + + private final Preference.OnPreferenceChangeListener mTitleChangeListener = + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (newValue == null || newValue.equals("")) return false; + + ((EditTextPreference) preference).setText(newValue.toString()); + preference.setSummary(newValue.toString()); + mBlog.setBlogName(newValue.toString()); + return true; + } + }; + + private final Preference.OnPreferenceChangeListener mTaglineChangeListener = + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + ((EditTextPreference) preference).setText(newValue.toString()); + preference.setSummary(newValue.toString()); + return true; + } + }; + + private final Preference.OnPreferenceChangeListener mLanguageChangeListener = + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + preference.setSummary(newValue.toString()); + return true; + } + }; + + private final Preference.OnPreferenceChangeListener mVisibilityChangeListener = + new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + // TODO: set Visibility + return true; + } + }; +} diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java b/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java index d82f161e6c3c..3ff8f8651008 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java +++ b/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java @@ -255,6 +255,13 @@ public void getStatsVideoSummary(String siteId, Listener listener, ErrorListener getXL(path, params, listener, errorListener); } + public void getSiteDescription(String sideId, Listener listener, ErrorListener errorListener) { + String path = String.format("rest/v1.1/sites/%s", sideId); + Map params = new HashMap(); + params.put("fields", "description"); + get(path, params, null, listener, errorListener); + } + /** * This method is for simulating stats APIs using the XL Studio API simulator. It should be removed once the other APIs are implemented. **/ diff --git a/WordPress/src/main/res/layout/seekbar_pref.xml b/WordPress/src/main/res/layout/seekbar_pref.xml new file mode 100644 index 000000000000..637f59f0ce1c --- /dev/null +++ b/WordPress/src/main/res/layout/seekbar_pref.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 007568c65d5f..4574206011f8 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -379,6 +379,22 @@ wp_pref_notifications_enabled wp_pref_notification_types + + @string/site_visibility_header + Visibility + What\'s this site about + Title + Words to live by + Tagline + Related Posts + Related Posts + Show related content after posts + wp_pref_site_title + wp_pref_site_tagline + wp_pref_site_language + wp_pref_site_visibility + wp_pref_site_related_posts + Open source licenses Privacy diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml new file mode 100644 index 000000000000..aca8c25f1fee --- /dev/null +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java index 05deeb0882b4..3f0dfc86e1e5 100644 --- a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java +++ b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java @@ -218,6 +218,13 @@ public void getCurrentTheme(String siteId, Listener listener, ErrorListener erro get(path, listener, errorListener); } + public void getGeneralSettings(String siteId, Listener listener, ErrorListener errorListener) { + String path = String.format("sites/%s", siteId); + Map params = new HashMap(); + params.put("fields", "title,description,lang,private"); + get(path, params, null, listener, errorListener); + } + /** * Make GET request */ From 02c99d7f5544b4954e133fcf1a89b82986028a54 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 29 Jun 2015 16:57:39 -0700 Subject: [PATCH 02/16] Updating API interface to access title field. --- .../org/wordpress/android/ui/prefs/SiteSettingsFragment.java | 4 ++-- .../org/wordpress/android/networking/RestClientUtils.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 81fe70d927ef..5de4a3a8e90c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -41,8 +41,8 @@ public void onCreate(Bundle savedInstanceState) { @Override public void onResponse(JSONObject response) { if (titlePreference != null) { - titlePreference.setText(response.optString("title")); - titlePreference.setSummary(response.optString("title")); + titlePreference.setText(response.optString("name")); + titlePreference.setSummary(response.optString("name")); } if (taglinePreference != null) { diff --git a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java index 3f0dfc86e1e5..ff1a33f474dc 100644 --- a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java +++ b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java @@ -221,7 +221,7 @@ public void getCurrentTheme(String siteId, Listener listener, ErrorListener erro public void getGeneralSettings(String siteId, Listener listener, ErrorListener errorListener) { String path = String.format("sites/%s", siteId); Map params = new HashMap(); - params.put("fields", "title,description,lang,private"); + params.put("fields", "name,description,lang,private"); get(path, params, null, listener, errorListener); } From 03a4ee956c365e3e5c108f82250e0d8969c82bff Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 30 Jun 2015 17:51:45 -0700 Subject: [PATCH 03/16] Smoothing SeekBarPreferenceAnimation and clamping. --- .../android/ui/prefs/SeekBarPreference.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java index 8dd149800d5b..74998ccd51e6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -1,6 +1,5 @@ package org.wordpress.android.ui.prefs; -import android.app.Activity; import android.content.Context; import android.preference.Preference; import android.util.AttributeSet; @@ -32,6 +31,7 @@ public View onCreateView(ViewGroup parent) { LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = li.inflate(R.layout.seekbar_pref, parent, false); + int seekPosition = mSeekBar == null ? 0 : mSeekBar.getProgress(); if (view != null) { mSeekBar = (SeekBar) view.findViewById(R.id.seekbar_pref_bar); @@ -50,33 +50,22 @@ public void onStopTrackingTouch(SeekBar seekBar) { int progress = seekBar.getProgress(); if (progress <= 33) { - updateProgress(mSeekBar, 0); setSummary("Allow search engines to index this site"); + mSeekBar.setProgress(0); } else if (progress <= 67) { - updateProgress(mSeekBar, 50); setSummary("Discourage search engines from indexing this site"); + mSeekBar.setProgress(50); } else { - updateProgress(mSeekBar, 100); setSummary("I would like my site to be private, visible only to users I choose"); + mSeekBar.setProgress(100); } } } ); + mSeekBar.setProgress(seekPosition); } } return view; } - - private void updateProgress(final SeekBar seekBar, final int progress) { - final Activity activity = (Activity) getContext(); - if (activity == null || seekBar == null) return; - - activity.runOnUiThread(new Runnable() { - @Override - public void run() { - seekBar.setProgress(progress); - } - }); - } } From 90f6fb0b5e331f9a4b892405b08715218710392e Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 1 Jul 2015 18:13:53 -0700 Subject: [PATCH 04/16] Updating Title, Tagline, and Visibility after prompting user to sync. --- .../android/ui/prefs/SeekBarPreference.java | 70 +++-- .../ui/prefs/SiteSettingsFragment.java | 257 ++++++++++++------ .../android/networking/RestClientUtils.java | 14 +- 3 files changed, 224 insertions(+), 117 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java index 74998ccd51e6..1766a8eed585 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -10,7 +10,7 @@ import org.wordpress.android.R; -public class SeekBarPreference extends Preference { +public class SeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener { private SeekBar mSeekBar; public SeekBarPreference(Context context) { @@ -36,36 +36,50 @@ public View onCreateView(ViewGroup parent) { if (view != null) { mSeekBar = (SeekBar) view.findViewById(R.id.seekbar_pref_bar); if (mSeekBar != null) { - mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - int progress = seekBar.getProgress(); - - if (progress <= 33) { - setSummary("Allow search engines to index this site"); - mSeekBar.setProgress(0); - } else if (progress <= 67) { - setSummary("Discourage search engines from indexing this site"); - mSeekBar.setProgress(50); - } else { - setSummary("I would like my site to be private, visible only to users I choose"); - mSeekBar.setProgress(100); - } - } - } - ); - mSeekBar.setProgress(seekPosition); + mSeekBar.setOnSeekBarChangeListener(this); } } + updateProgress(seekPosition); + return view; } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + updateProgress(seekBar.getProgress()); + } + + public int getProgress() { + if (mSeekBar == null) return -1; + + return mSeekBar.getProgress(); + } + + public void setProgress(int progress) { + updateProgress(progress); + } + + private void updateProgress(int progress) { + if (mSeekBar == null) return; + + if (progress <= 33) { + setSummary("I would like my site to be private, visible only to users I choose"); + mSeekBar.setProgress(0); + } else if (progress <= 67) { + setSummary("Discourage search engines from indexing this site"); + mSeekBar.setProgress(50); + } else { + setSummary("Allow search engines to index this site"); + mSeekBar.setProgress(100); + } + } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 5de4a3a8e90c..759374a682db 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -1,5 +1,8 @@ package org.wordpress.android.ui.prefs; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.MultiSelectListPreference; @@ -13,9 +16,18 @@ import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; +import org.wordpress.android.networking.RestClientUtils; +import org.wordpress.android.util.ToastUtils; -public class SiteSettingsFragment extends PreferenceFragment { +import java.util.HashMap; + +public class SiteSettingsFragment extends PreferenceFragment + implements Preference.OnPreferenceChangeListener{ private Blog mBlog; + private EditTextPreference mTitlePreference; + private EditTextPreference mTaglinePreference; + private MultiSelectListPreference mLanguagePreference; + private SeekBarPreference mVisibilityPreference; @Override public void onCreate(Bundle savedInstanceState) { @@ -26,106 +38,177 @@ public void onCreate(Bundle savedInstanceState) { Integer id = getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1); mBlog = WordPress.getBlog(id); - if (mBlog != null) { - final EditTextPreference titlePreference = - (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); - final EditTextPreference taglinePreference = - (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); - final MultiSelectListPreference languagePreference = - (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_language)); - final SeekBarPreference visibilityPreference = - (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); - - WordPress.getRestClientUtils().getGeneralSettings( - String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { - @Override - public void onResponse(JSONObject response) { - if (titlePreference != null) { - titlePreference.setText(response.optString("name")); - titlePreference.setSummary(response.optString("name")); - } + if (mBlog == null) return; - if (taglinePreference != null) { - taglinePreference.setText(response.optString("description")); - taglinePreference.setSummary(response.optString("description")); - } + findPreferences(); - if (languagePreference != null) { - languagePreference.setDefaultValue(response.optString("lang")); - languagePreference.setSummary(response.optString("lang")); - } + if (mTitlePreference != null) { + mTitlePreference.setText(mBlog.getBlogName()); + mTitlePreference.setSummary(mBlog.getBlogName()); + mTitlePreference.setOnPreferenceChangeListener(this); + } - if (visibilityPreference != null) { - } + if (mTaglinePreference != null) { + mTaglinePreference.setOnPreferenceChangeListener(this); + } + + if (mLanguagePreference != null) { + mLanguagePreference.setOnPreferenceChangeListener(this); + } + + if (mVisibilityPreference != null) { + mVisibilityPreference.setOnPreferenceChangeListener(this); + } + + WordPress.getRestClientUtils().getGeneralSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + if (mTitlePreference != null) { + mTitlePreference.setText(response.optString(RestClientUtils.SITE_TITLE_KEY)); + mTitlePreference.setSummary(response.optString(RestClientUtils.SITE_TITLE_KEY)); + } + + if (mTaglinePreference != null) { + mTaglinePreference.setText(response.optString(RestClientUtils.SITE_DESC_KEY)); + mTaglinePreference.setSummary(response.optString(RestClientUtils.SITE_DESC_KEY)); } - }, new RestRequest.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (taglinePreference != null) { - taglinePreference.setEnabled(false); - taglinePreference.setSummary("Failed to retrieve :("); + + if (mLanguagePreference != null) { + mLanguagePreference.setDefaultValue(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + mLanguagePreference.setSummary(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + } + + if (mVisibilityPreference != null) { + int visibility = response.optJSONObject("settings").optInt("blog_public"); + + switch (visibility) { + case -1: + mVisibilityPreference.setProgress(0); + break; + case 0: + mVisibilityPreference.setProgress(50); + break; + case 1: + mVisibilityPreference.setProgress(100); + break; } } - }); + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (isAdded()) { + ToastUtils.showToast(getActivity(), "Error getting site info"); + } + } + }); + } - if (titlePreference != null) { - titlePreference.setText(mBlog.getBlogName()); - titlePreference.setSummary(mBlog.getBlogName()); - titlePreference.setOnPreferenceChangeListener(mTitleChangeListener); - } + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (preference == mTitlePreference) { + if (newValue == null || newValue.equals("")) return false; + + mTitlePreference.setText(newValue.toString()); + mTitlePreference.setSummary(newValue.toString()); + mBlog.setBlogName(newValue.toString()); + + showDialog(); + + return true; + } else if (preference == mTaglinePreference) { + ((EditTextPreference) preference).setText(newValue.toString()); + preference.setSummary(newValue.toString()); + return true; + } else if (preference == mLanguagePreference) { + preference.setSummary(newValue.toString()); + return true; + } else if (preference == mVisibilityPreference) { + return true; + } - if (taglinePreference != null) { - taglinePreference.setOnPreferenceChangeListener(mTaglineChangeListener); - } + return false; + } - if (languagePreference != null) { - languagePreference.setOnPreferenceChangeListener(mLanguageChangeListener); - } + /** + * Helper method to create the parameters for the site settings POST request + */ + private HashMap generatePostParams() { + HashMap params = new HashMap<>(); - if (visibilityPreference != null) { - visibilityPreference.setOnPreferenceChangeListener(mVisibilityChangeListener); + // Using undocumented endpoint WPCOM_JSON_API_Site_Settings_Endpoint + // https://wpcom.trac.automattic.com/browser/trunk/public.api/rest/json-endpoints.php#L1903 + if (mTitlePreference != null) { + params.put("blogname", mTitlePreference.getText()); + } + + if (mTaglinePreference != null) { + params.put("blogdescription", mTaglinePreference.getText()); + } + + if (mLanguagePreference != null) { +// params.put("lang", mLanguagePreference.getSummary().toString()); + } + + if (mVisibilityPreference != null) { + int progress = mVisibilityPreference.getProgress(); + + if (progress >= 0) { + if (progress < 33) progress = -1; + else if (progress < 67) progress = 0; + else progress = 1; + params.put("blog_public", String.valueOf(progress)); } } + + return params; } - private final Preference.OnPreferenceChangeListener mTitleChangeListener = - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (newValue == null || newValue.equals("")) return false; + /** + * Sends a REST POST request to update site settings + */ + private void applySettings() { + final HashMap params = generatePostParams(); - ((EditTextPreference) preference).setText(newValue.toString()); - preference.setSummary(newValue.toString()); - mBlog.setBlogName(newValue.toString()); - return true; - } - }; - - private final Preference.OnPreferenceChangeListener mTaglineChangeListener = - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - ((EditTextPreference) preference).setText(newValue.toString()); - preference.setSummary(newValue.toString()); - return true; - } - }; - - private final Preference.OnPreferenceChangeListener mLanguageChangeListener = - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - preference.setSummary(newValue.toString()); - return true; - } - }; - - private final Preference.OnPreferenceChangeListener mVisibilityChangeListener = - new Preference.OnPreferenceChangeListener() { - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - // TODO: set Visibility - return true; + WordPress.getRestClientUtils().setGeneralSiteSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (mTaglinePreference != null) { + mTaglinePreference.setEnabled(false); + mTaglinePreference.setSummary("Failed to retrieve :("); } - }; + } + }, params); + } + + /** + * Helper method to set preference references + */ + private void findPreferences() { + mTitlePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); + mTaglinePreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); + mLanguagePreference = + (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_language)); + mVisibilityPreference = + (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); + } + + // TODO: delete + private void showDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setPositiveButton("Sync", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + applySettings(); + } + }).setNegativeButton("Cancel", null).show(); + } } diff --git a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java index ff1a33f474dc..1afa2a856397 100644 --- a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java +++ b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java @@ -22,6 +22,10 @@ import java.util.concurrent.TimeoutException; public class RestClientUtils { + public static final String SITE_TITLE_KEY = "name"; + public static final String SITE_DESC_KEY = "description"; + public static final String SITE_LANGUAGE_KEY = "lang"; + private static final String NOTIFICATION_FIELDS = "id,type,unread,body,subject,timestamp,meta"; private static final String COMMENT_REPLY_CONTENT_FIELD = "content"; private static String sUserAgent = "WordPress Networking Android"; @@ -219,12 +223,18 @@ public void getCurrentTheme(String siteId, Listener listener, ErrorListener erro } public void getGeneralSettings(String siteId, Listener listener, ErrorListener errorListener) { - String path = String.format("sites/%s", siteId); + String path = String.format("sites/%s/settings", siteId); Map params = new HashMap(); - params.put("fields", "name,description,lang,private"); +// params.put("fields", "blogname,blogdescription,lang_id,blog_public"); get(path, params, null, listener, errorListener); } + public void setGeneralSiteSettings(String siteId, Listener listener, ErrorListener errorListener, + Map params) { + String path = String.format("sites/%s/settings", siteId); + post(path, params, null, listener, errorListener); + } + /** * Make GET request */ From a39a4b8581a0db0750e98e5dda988a55a5c7568a Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 1 Jul 2015 19:28:21 -0700 Subject: [PATCH 05/16] Replaced alert dialog with a Save menu option to save changes. --- .../ui/prefs/SiteSettingsFragment.java | 103 +++++++++++------- WordPress/src/main/res/menu/site_settings.xml | 12 ++ 2 files changed, 77 insertions(+), 38 deletions(-) create mode 100644 WordPress/src/main/res/menu/site_settings.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 759374a682db..2b431c358728 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -1,13 +1,13 @@ package org.wordpress.android.ui.prefs; -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.DialogInterface; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import com.android.volley.VolleyError; import com.wordpress.rest.RestRequest; @@ -28,6 +28,7 @@ public class SiteSettingsFragment extends PreferenceFragment private EditTextPreference mTaglinePreference; private MultiSelectListPreference mLanguagePreference; private SeekBarPreference mVisibilityPreference; + private MenuItem mSaveItem; @Override public void onCreate(Bundle savedInstanceState) { @@ -40,25 +41,7 @@ public void onCreate(Bundle savedInstanceState) { if (mBlog == null) return; - findPreferences(); - - if (mTitlePreference != null) { - mTitlePreference.setText(mBlog.getBlogName()); - mTitlePreference.setSummary(mBlog.getBlogName()); - mTitlePreference.setOnPreferenceChangeListener(this); - } - - if (mTaglinePreference != null) { - mTaglinePreference.setOnPreferenceChangeListener(this); - } - - if (mLanguagePreference != null) { - mLanguagePreference.setOnPreferenceChangeListener(this); - } - - if (mVisibilityPreference != null) { - mVisibilityPreference.setOnPreferenceChangeListener(this); - } + initPreferences(); WordPress.getRestClientUtils().getGeneralSettings( String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { @@ -103,28 +86,59 @@ public void onErrorResponse(VolleyError error) { } } }); + + setHasOptionsMenu(true); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { + super.onCreateOptionsMenu(menu, menuInflater); + + menuInflater.inflate(R.menu.site_settings, menu); + + if (menu == null || (mSaveItem = menu.findItem(R.id.save_site_settings)) == null) return; + + mSaveItem.setOnMenuItemClickListener( + new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + applySettings(); + return true; + } + }); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { + if (newValue == null) return false; + if (preference == mTitlePreference) { - if (newValue == null || newValue.equals("")) return false; + if (newValue.equals(mTitlePreference.getText())) return false; mTitlePreference.setText(newValue.toString()); mTitlePreference.setSummary(newValue.toString()); mBlog.setBlogName(newValue.toString()); - - showDialog(); + toggleSaveItemVisibility(true); return true; } else if (preference == mTaglinePreference) { - ((EditTextPreference) preference).setText(newValue.toString()); - preference.setSummary(newValue.toString()); + if (newValue.equals(mTaglinePreference.getText())) return false; + + mTaglinePreference.setText(newValue.toString()); + mTaglinePreference.setSummary(newValue.toString()); + toggleSaveItemVisibility(true); + return true; } else if (preference == mLanguagePreference) { - preference.setSummary(newValue.toString()); + if (newValue.equals(mLanguagePreference.getSummary())) return false; + + mLanguagePreference.setSummary(newValue.toString()); + toggleSaveItemVisibility(true); + return true; } else if (preference == mVisibilityPreference) { + toggleSaveItemVisibility(true); + return true; } @@ -175,6 +189,7 @@ private void applySettings() { String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { @Override public void onResponse(JSONObject response) { + toggleSaveItemVisibility(false); } }, new RestRequest.ErrorListener() { @Override @@ -190,7 +205,7 @@ public void onErrorResponse(VolleyError error) { /** * Helper method to set preference references */ - private void findPreferences() { + private void initPreferences() { mTitlePreference = (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); mTaglinePreference = @@ -199,16 +214,28 @@ private void findPreferences() { (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_language)); mVisibilityPreference = (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); + + if (mTitlePreference != null) { + mTitlePreference.setOnPreferenceChangeListener(this); + } + + if (mTaglinePreference != null) { + mTaglinePreference.setOnPreferenceChangeListener(this); + } + + if (mLanguagePreference != null) { + mLanguagePreference.setOnPreferenceChangeListener(this); + } + + if (mVisibilityPreference != null) { + mVisibilityPreference.setOnPreferenceChangeListener(this); + } } - // TODO: delete - private void showDialog() { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setPositiveButton("Sync", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - applySettings(); - } - }).setNegativeButton("Cancel", null).show(); + private void toggleSaveItemVisibility(boolean on) { + if (mSaveItem != null) { + mSaveItem.setVisible(on); + mSaveItem.setEnabled(on); + } } } diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml new file mode 100644 index 000000000000..ca8f9e385e47 --- /dev/null +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file From 6613fa80dd686f7166dd8f97ff77514a6000b3c1 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 1 Jul 2015 21:47:41 -0700 Subject: [PATCH 06/16] Notifying of changes to SeekBarPreference value. --- .../android/ui/prefs/SeekBarPreference.java | 2 ++ .../ui/prefs/SiteSettingsFragment.java | 25 ++++++++++++------- WordPress/src/main/res/menu/site_settings.xml | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java index 1766a8eed585..716b53d13ff6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -81,5 +81,7 @@ private void updateProgress(int progress) { setSummary("Allow search engines to index this site"); mSeekBar.setProgress(100); } + + callChangeListener(progress); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 2b431c358728..d7d8aa55a037 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -117,7 +117,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mTitlePreference.setText(newValue.toString()); mTitlePreference.setSummary(newValue.toString()); - mBlog.setBlogName(newValue.toString()); toggleSaveItemVisibility(true); return true; @@ -137,6 +136,10 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mVisibilityPreference) { + int progress = convertProgressToVisibility(mVisibilityPreference.getProgress()); + + if (newValue.equals(progress)) return false; + toggleSaveItemVisibility(true); return true; @@ -166,14 +169,8 @@ private HashMap generatePostParams() { } if (mVisibilityPreference != null) { - int progress = mVisibilityPreference.getProgress(); - - if (progress >= 0) { - if (progress < 33) progress = -1; - else if (progress < 67) progress = 0; - else progress = 1; - params.put("blog_public", String.valueOf(progress)); - } + params.put("blog_public", String.valueOf( + convertProgressToVisibility(mVisibilityPreference.getProgress()))); } return params; @@ -190,6 +187,10 @@ private void applySettings() { @Override public void onResponse(JSONObject response) { toggleSaveItemVisibility(false); + + if (params.containsKey("blogname")) { + mBlog.setBlogName(params.get("blogname")); + } } }, new RestRequest.ErrorListener() { @Override @@ -238,4 +239,10 @@ private void toggleSaveItemVisibility(boolean on) { mSaveItem.setEnabled(on); } } + + private int convertProgressToVisibility(int progress) { + if (progress < 33) return -1; + else if (progress < 67) return 0; + else return 1; + } } diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml index ca8f9e385e47..9ac088187bb3 100644 --- a/WordPress/src/main/res/menu/site_settings.xml +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -7,6 +7,6 @@ android:title="Save" android:id="@+id/save_site_settings" android:enabled="false" - android:visible="false" /> + android:visible="true" /> \ No newline at end of file From 7db4e62774ea082e93e662a3df581cd528bece0a Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Thu, 2 Jul 2015 14:22:30 -0700 Subject: [PATCH 07/16] SeekBarPreference can handle arbitrary number of discrete points. Added attribute to set number of values on SeekBarPreference. Moved Summary updates to the fragment. --- .../android/ui/prefs/SeekBarPreference.java | 38 ++++++++++------- .../ui/prefs/SiteSettingsFragment.java | 41 +++++++++++-------- WordPress/src/main/res/menu/site_settings.xml | 2 +- WordPress/src/main/res/values/attrs.xml | 6 +++ WordPress/src/main/res/xml/site_settings.xml | 6 ++- 5 files changed, 59 insertions(+), 34 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java index 716b53d13ff6..ee7b013d1120 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -1,6 +1,7 @@ package org.wordpress.android.ui.prefs; import android.content.Context; +import android.content.res.TypedArray; import android.preference.Preference; import android.util.AttributeSet; import android.view.LayoutInflater; @@ -10,8 +11,14 @@ import org.wordpress.android.R; +/** + * Smooth scrolling SeekBar that can be configured to snap to equally positioned discrete points + * (referred to as Progress). + */ + public class SeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener { private SeekBar mSeekBar; + private int mMaxValue; public SeekBarPreference(Context context) { super(context); @@ -23,6 +30,18 @@ public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) public SeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs); + + mMaxValue = 100; + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.SeekBarPreference_maxValue) { + mMaxValue = array.getInt(index, 100); + } + } + + array.recycle(); } @Override @@ -31,7 +50,7 @@ public View onCreateView(ViewGroup parent) { LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = li.inflate(R.layout.seekbar_pref, parent, false); - int seekPosition = mSeekBar == null ? 0 : mSeekBar.getProgress(); + int seekPosition = mSeekBar == null ? 0 : getProgress(); if (view != null) { mSeekBar = (SeekBar) view.findViewById(R.id.seekbar_pref_bar); @@ -55,32 +74,23 @@ public void onStartTrackingTouch(SeekBar seekBar) { @Override public void onStopTrackingTouch(SeekBar seekBar) { - updateProgress(seekBar.getProgress()); + updateProgress(getProgress()); } public int getProgress() { if (mSeekBar == null) return -1; - return mSeekBar.getProgress(); + return Math.round((float)mSeekBar.getProgress() / 100.f * mMaxValue); } public void setProgress(int progress) { - updateProgress(progress); + updateProgress(Math.min(mMaxValue, progress)); } private void updateProgress(int progress) { if (mSeekBar == null) return; - if (progress <= 33) { - setSummary("I would like my site to be private, visible only to users I choose"); - mSeekBar.setProgress(0); - } else if (progress <= 67) { - setSummary("Discourage search engines from indexing this site"); - mSeekBar.setProgress(50); - } else { - setSummary("Allow search engines to index this site"); - mSeekBar.setProgress(100); - } + mSeekBar.setProgress((int)((float)progress / mMaxValue * 100)); callChangeListener(progress); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index d7d8aa55a037..85b84cef9207 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -70,10 +70,10 @@ public void onResponse(JSONObject response) { mVisibilityPreference.setProgress(0); break; case 0: - mVisibilityPreference.setProgress(50); + mVisibilityPreference.setProgress(1); break; case 1: - mVisibilityPreference.setProgress(100); + mVisibilityPreference.setProgress(2); break; } } @@ -112,33 +112,39 @@ public boolean onMenuItemClick(MenuItem item) { public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; - if (preference == mTitlePreference) { - if (newValue.equals(mTitlePreference.getText())) return false; - + if (preference == mTitlePreference && + !newValue.equals(mTitlePreference.getText())) { mTitlePreference.setText(newValue.toString()); mTitlePreference.setSummary(newValue.toString()); toggleSaveItemVisibility(true); return true; - } else if (preference == mTaglinePreference) { - if (newValue.equals(mTaglinePreference.getText())) return false; - + } else if (preference == mTaglinePreference && + !newValue.equals(mTaglinePreference.getText())) { mTaglinePreference.setText(newValue.toString()); mTaglinePreference.setSummary(newValue.toString()); toggleSaveItemVisibility(true); return true; - } else if (preference == mLanguagePreference) { - if (newValue.equals(mLanguagePreference.getSummary())) return false; - + } else if (preference == mLanguagePreference && + !newValue.equals(mLanguagePreference.getSummary())) { mLanguagePreference.setSummary(newValue.toString()); toggleSaveItemVisibility(true); return true; - } else if (preference == mVisibilityPreference) { - int progress = convertProgressToVisibility(mVisibilityPreference.getProgress()); - - if (newValue.equals(progress)) return false; + } else if (preference == mVisibilityPreference && + !newValue.equals(convertProgress(mVisibilityPreference.getProgress()))) { + switch ((Integer)newValue) { + case 0: + mVisibilityPreference.setSummary("I would like my site to be private, visible only to users I choose"); + break; + case 1: + mVisibilityPreference.setSummary("Discourage search engines from indexing this site"); + break; + case 2: + mVisibilityPreference.setSummary("Allow search engines to index this site"); + break; + } toggleSaveItemVisibility(true); @@ -170,7 +176,7 @@ private HashMap generatePostParams() { if (mVisibilityPreference != null) { params.put("blog_public", String.valueOf( - convertProgressToVisibility(mVisibilityPreference.getProgress()))); + convertProgress(mVisibilityPreference.getProgress()))); } return params; @@ -188,6 +194,7 @@ private void applySettings() { public void onResponse(JSONObject response) { toggleSaveItemVisibility(false); + // Update local Blog name if (params.containsKey("blogname")) { mBlog.setBlogName(params.get("blogname")); } @@ -240,7 +247,7 @@ private void toggleSaveItemVisibility(boolean on) { } } - private int convertProgressToVisibility(int progress) { + private int convertProgress(int progress) { if (progress < 33) return -1; else if (progress < 67) return 0; else return 1; diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml index 9ac088187bb3..057e9589919c 100644 --- a/WordPress/src/main/res/menu/site_settings.xml +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -9,4 +9,4 @@ android:enabled="false" android:visible="true" /> - \ No newline at end of file + diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index 2caad636633b..3d0b669551a9 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -1,5 +1,11 @@ + + + + + + diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index aca8c25f1fee..14aeb939ebfa 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -1,7 +1,8 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> @@ -29,7 +30,8 @@ android:title="@string/site_visibility_header" android:summary="Discourage search engines from indexing this site" android:id="@+id/pref_site_visibility" - android:key="@string/pref_key_site_visibility" /> + android:key="@string/pref_key_site_visibility" + app:maxValue="2" /> Date: Thu, 9 Jul 2015 19:12:13 -0700 Subject: [PATCH 08/16] Adding remaining preferences, updating design. Adding class to handle limiting the summary size for certain preferences. Converting language codes for list preference values. --- .../android/ui/prefs/SeekBarPreference.java | 8 +- .../ui/prefs/SiteSettingsFragment.java | 83 +++++++++++++--- .../ui/prefs/SummaryEditTextPreference.java | 63 ++++++++++++ .../android/ui/prefs/SummaryPreference.java | 59 ++++++++++++ .../src/main/res/layout/seekbar_pref.xml | 30 ++---- WordPress/src/main/res/menu/site_settings.xml | 8 +- WordPress/src/main/res/values/attrs.xml | 15 +++ WordPress/src/main/res/values/strings.xml | 9 +- WordPress/src/main/res/xml/site_settings.xml | 96 +++++++++++++------ .../android/networking/RestClientUtils.java | 1 + 10 files changed, 301 insertions(+), 71 deletions(-) create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java create mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java index ee7b013d1120..0dd80d94c3d5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java @@ -2,7 +2,6 @@ import android.content.Context; import android.content.res.TypedArray; -import android.preference.Preference; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -16,7 +15,8 @@ * (referred to as Progress). */ -public class SeekBarPreference extends Preference implements SeekBar.OnSeekBarChangeListener { +public class SeekBarPreference extends SummaryPreference + implements SeekBar.OnSeekBarChangeListener { private SeekBar mSeekBar; private int mMaxValue; @@ -80,7 +80,7 @@ public void onStopTrackingTouch(SeekBar seekBar) { public int getProgress() { if (mSeekBar == null) return -1; - return Math.round((float)mSeekBar.getProgress() / 100.f * mMaxValue); + return Math.round((float) mSeekBar.getProgress() / 100.f * mMaxValue); } public void setProgress(int progress) { @@ -90,7 +90,7 @@ public void setProgress(int progress) { private void updateProgress(int progress) { if (mSeekBar == null) return; - mSeekBar.setProgress((int)((float)progress / mMaxValue * 100)); + mSeekBar.setProgress((int) ((float) progress / mMaxValue * 100)); callChangeListener(progress); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 85b84cef9207..d321563bb5b4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -2,9 +2,11 @@ import android.os.Bundle; import android.preference.EditTextPreference; +import android.preference.ListPreference; import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; +import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -20,13 +22,21 @@ import org.wordpress.android.util.ToastUtils; import java.util.HashMap; +import java.util.Locale; + +/** + * Handles changes to WordPress site settings. Syncs with host automatically when user leaves. + */ public class SiteSettingsFragment extends PreferenceFragment implements Preference.OnPreferenceChangeListener{ private Blog mBlog; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; - private MultiSelectListPreference mLanguagePreference; + private EditTextPreference mAddressPreference; + private ListPreference mLanguagePreference; + private MultiSelectListPreference mCategoryPreference; + private ListPreference mFormatPreference; private SeekBarPreference mVisibilityPreference; private MenuItem mSaveItem; @@ -34,6 +44,8 @@ public class SiteSettingsFragment extends PreferenceFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().remove(getString(R.string.pref_key_site_language)).commit(); + addPreferencesFromResource(R.xml.site_settings); Integer id = getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1); @@ -57,9 +69,17 @@ public void onResponse(JSONObject response) { mTaglinePreference.setSummary(response.optString(RestClientUtils.SITE_DESC_KEY)); } + if (mAddressPreference != null) { + mAddressPreference.setText(response.optString(RestClientUtils.SITE_URL_KEY)); + mAddressPreference.setSummary(response.optString(RestClientUtils.SITE_URL_KEY)); + // Disabled until implemented + mAddressPreference.setEnabled(false); + } + if (mLanguagePreference != null) { - mLanguagePreference.setDefaultValue(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); - mLanguagePreference.setSummary(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + String languageString = getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + mLanguagePreference.setDefaultValue(languageString); + mLanguagePreference.setSummary(languageString); } if (mVisibilityPreference != null) { @@ -75,6 +95,10 @@ public void onResponse(JSONObject response) { case 1: mVisibilityPreference.setProgress(2); break; + default: + mVisibilityPreference.setSummary("Unknown privacy setting"); + mVisibilityPreference.setEnabled(false); + break; } } } @@ -116,6 +140,7 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { !newValue.equals(mTitlePreference.getText())) { mTitlePreference.setText(newValue.toString()); mTitlePreference.setSummary(newValue.toString()); + getActivity().setTitle(newValue.toString()); toggleSaveItemVisibility(true); return true; @@ -128,12 +153,12 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mLanguagePreference && !newValue.equals(mLanguagePreference.getSummary())) { - mLanguagePreference.setSummary(newValue.toString()); + mLanguagePreference.setSummary(getLanguageString(newValue.toString())); toggleSaveItemVisibility(true); return true; } else if (preference == mVisibilityPreference && - !newValue.equals(convertProgress(mVisibilityPreference.getProgress()))) { + !newValue.equals(mVisibilityPreference.getProgress() - 1)) { switch ((Integer)newValue) { case 0: mVisibilityPreference.setSummary("I would like my site to be private, visible only to users I choose"); @@ -171,12 +196,12 @@ private HashMap generatePostParams() { } if (mLanguagePreference != null) { + params.put("lang_id", mLanguagePreference.getValue()); // params.put("lang", mLanguagePreference.getSummary().toString()); } if (mVisibilityPreference != null) { - params.put("blog_public", String.valueOf( - convertProgress(mVisibilityPreference.getProgress()))); + params.put("blog_public", String.valueOf(mVisibilityPreference.getProgress() - 1)); } return params; @@ -219,9 +244,15 @@ private void initPreferences() { mTaglinePreference = (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); mLanguagePreference = - (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_language)); + (ListPreference) findPreference(getString(R.string.pref_key_site_language)); mVisibilityPreference = (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); + mCategoryPreference = + (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_category)); + mFormatPreference = + (ListPreference) findPreference(getString(R.string.pref_key_site_format)); + mAddressPreference = + (EditTextPreference) findPreference(getString(R.string.pref_key_site_address)); if (mTitlePreference != null) { mTitlePreference.setOnPreferenceChangeListener(this); @@ -232,12 +263,42 @@ private void initPreferences() { } if (mLanguagePreference != null) { + mLanguagePreference.setEntries(createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); mLanguagePreference.setOnPreferenceChangeListener(this); } if (mVisibilityPreference != null) { mVisibilityPreference.setOnPreferenceChangeListener(this); } + + if (mFormatPreference != null) { + mFormatPreference.setOnPreferenceChangeListener(this); + } + } + + private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes) { + if (languageCodes == null || languageCodes.length < 1) return null; + + CharSequence[] displayStrings = new CharSequence[languageCodes.length]; + + for (int i = 0; i < languageCodes.length; ++i) { + displayStrings[i] = getLanguageString(String.valueOf(languageCodes[i])); + } + + return displayStrings; + } + + /** + * Return a non-null display string for a given language code. + */ + private String getLanguageString(String languagueCode) { + if (languagueCode == null || languagueCode.length() < 2) { + return ""; + } else if (languagueCode.length() == 2) { + return new Locale(languagueCode).getDisplayLanguage(); + } else { + return new Locale(languagueCode.substring(0, 2)).getDisplayLanguage() + languagueCode.substring(2); + } } private void toggleSaveItemVisibility(boolean on) { @@ -246,10 +307,4 @@ private void toggleSaveItemVisibility(boolean on) { mSaveItem.setEnabled(on); } } - - private int convertProgress(int progress) { - if (progress < 33) return -1; - else if (progress < 67) return 0; - else return 1; - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java new file mode 100644 index 000000000000..8a0232059dfd --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java @@ -0,0 +1,63 @@ +package org.wordpress.android.ui.prefs; + +import android.content.Context; +import android.content.res.TypedArray; +import android.preference.EditTextPreference; +import android.support.annotation.NonNull; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import org.wordpress.android.R; + +/** + * Standard EditTextPreference that has attributes to limit summary length. + * + * Re: {@link SummaryPreference} + */ + +public class SummaryEditTextPreference extends EditTextPreference { + private int mLines; + private int mMaxLines; + + public SummaryEditTextPreference(Context context) { + super(context); + } + + public SummaryEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SummaryEditTextPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + mLines = -1; + mMaxLines = -1; + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SummaryEditTextPreference); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.SummaryEditTextPreference_summaryLines) { + mLines = array.getInt(index, -1); + } else if (index == R.styleable.SummaryEditTextPreference_maxSummaryLines) { + mMaxLines = array.getInt(index, -1); + } + } + + array.recycle(); + } + + @Override + public void onBindView(@NonNull View view) { + super.onBindView(view); + + TextView summary = (TextView) view.findViewById(android.R.id.summary); + if (summary != null) { + summary.setEllipsize(TextUtils.TruncateAt.END); + if (mLines != -1) summary.setLines(mLines); + if (mMaxLines != -1) summary.setMaxLines(mMaxLines); + } + } +} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java new file mode 100644 index 000000000000..9f0ced5b6012 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java @@ -0,0 +1,59 @@ +package org.wordpress.android.ui.prefs; + +import android.content.Context; +import android.content.res.TypedArray; +import android.preference.Preference; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.View; +import android.widget.TextView; + +import org.wordpress.android.R; + +/** + * Used as a convenience to give custom preferences attributes for summary line length. + */ + +public class SummaryPreference extends Preference { + private int mLines; + private int mMaxLines; + + public SummaryPreference(Context context) { + super(context); + } + + public SummaryPreference(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public SummaryPreference(Context context, AttributeSet attrs) { + super(context, attrs); + + mLines = -1; + mMaxLines = -1; + + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SummaryPreference); + + for (int i = 0; i < array.getIndexCount(); ++i) { + int index = array.getIndex(i); + if (index == R.styleable.SummaryPreference_summaryLines) { + mLines = array.getInt(index, -1); + } else if (index == R.styleable.SummaryPreference_maxSummaryLines) { + mMaxLines = array.getInt(index, -1); + } + } + + array.recycle(); + } + + @Override + public void onBindView(@NonNull View view) { + super.onBindView(view); + + TextView summary = (TextView) view.findViewById(android.R.id.summary); + if (summary != null) { + if (mLines != -1) summary.setLines(mLines); + if (mMaxLines != -1) summary.setMaxLines(mMaxLines); + } + } +} diff --git a/WordPress/src/main/res/layout/seekbar_pref.xml b/WordPress/src/main/res/layout/seekbar_pref.xml index 637f59f0ce1c..9a83b122272d 100644 --- a/WordPress/src/main/res/layout/seekbar_pref.xml +++ b/WordPress/src/main/res/layout/seekbar_pref.xml @@ -11,48 +11,38 @@ android:clipToPadding="false" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="16dp" - android:paddingBottom="8dp"> - - - - - - + android:paddingTop="@dimen/margin_extra_large" + android:paddingBottom="@dimen/margin_medium"> + android:layout_height="wrap_content" + android:textAppearance="?attr/textAppearanceListItem" /> + android:gravity="center_horizontal" + android:textColor="?android:attr/textColorSecondary" + android:textAppearance="?android:attr/textAppearanceListItemSecondary" + android:ellipsize="end" /> - - - - - - diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml index 057e9589919c..a384d8816327 100644 --- a/WordPress/src/main/res/menu/site_settings.xml +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -1,12 +1,14 @@ + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index efdee738cf88..201a4970ead7 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -1,6 +1,21 @@ + + + + + + + + + + + + + + + diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 2be4c7731ab5..30acefe1abde 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -404,7 +404,7 @@ @string/site_visibility_header Visibility What\'s this site about - Title + Site Title Words to live by Tagline Related Posts @@ -412,9 +412,16 @@ Show related content after posts wp_pref_site_title wp_pref_site_tagline + wp_pref_site_address wp_pref_site_language wp_pref_site_visibility wp_pref_site_related_posts + wp_pref_site_location + wp_pref_site_default_category + wp_pref_site_default_format + wp_pref_site_discussion + wp_pref_site_start_over + wp_pref_site_delete_site Open source licenses diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 14aeb939ebfa..25b13ca0ab85 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -7,50 +7,88 @@ - + android:title="@string/site_title_title" + android:hint="@string/site_title_hint" + app:maxSummaryLines="2" /> - + android:title="@string/site_tagline_title" + android:hint="@string/site_tagline_hint" + app:maxSummaryLines="2" /> - + + + android:key="@string/pref_key_site_language" + android:title="@string/language" + android:entries="@array/available_languages" + android:entryValues="@array/available_languages" /> - + - + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java index 1afa2a856397..2d2aab35949b 100644 --- a/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java +++ b/libs/networking/WordPressNetworking/src/main/java/org/wordpress/android/networking/RestClientUtils.java @@ -25,6 +25,7 @@ public class RestClientUtils { public static final String SITE_TITLE_KEY = "name"; public static final String SITE_DESC_KEY = "description"; public static final String SITE_LANGUAGE_KEY = "lang"; + public static final String SITE_URL_KEY = "URL"; private static final String NOTIFICATION_FIELDS = "id,type,unread,body,subject,timestamp,meta"; private static final String COMMENT_REPLY_CONTENT_FIELD = "content"; From e5abc5936dc433d131c3a7be12d17ba34e24a612 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 10 Jul 2015 15:40:30 -0700 Subject: [PATCH 09/16] Removing unused Preferences. --- .../android/ui/prefs/SeekBarPreference.java | 97 ------------------- .../ui/prefs/SiteSettingsFragment.java | 81 ++++++++++------ .../android/ui/prefs/SummaryPreference.java | 59 ----------- WordPress/src/main/res/values/attrs.xml | 18 +--- WordPress/src/main/res/xml/site_settings.xml | 11 ++- 5 files changed, 62 insertions(+), 204 deletions(-) delete mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java delete mode 100644 WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java deleted file mode 100644 index 0dd80d94c3d5..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SeekBarPreference.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.wordpress.android.ui.prefs; - -import android.content.Context; -import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.SeekBar; - -import org.wordpress.android.R; - -/** - * Smooth scrolling SeekBar that can be configured to snap to equally positioned discrete points - * (referred to as Progress). - */ - -public class SeekBarPreference extends SummaryPreference - implements SeekBar.OnSeekBarChangeListener { - private SeekBar mSeekBar; - private int mMaxValue; - - public SeekBarPreference(Context context) { - super(context); - } - - public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public SeekBarPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - mMaxValue = 100; - TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SeekBarPreference); - - for (int i = 0; i < array.getIndexCount(); ++i) { - int index = array.getIndex(i); - if (index == R.styleable.SeekBarPreference_maxValue) { - mMaxValue = array.getInt(index, 100); - } - } - - array.recycle(); - } - - @Override - public View onCreateView(ViewGroup parent) { - super.onCreateView(parent); - - LayoutInflater li = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View view = li.inflate(R.layout.seekbar_pref, parent, false); - int seekPosition = mSeekBar == null ? 0 : getProgress(); - - if (view != null) { - mSeekBar = (SeekBar) view.findViewById(R.id.seekbar_pref_bar); - if (mSeekBar != null) { - mSeekBar.setOnSeekBarChangeListener(this); - } - } - - updateProgress(seekPosition); - - return view; - } - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - updateProgress(getProgress()); - } - - public int getProgress() { - if (mSeekBar == null) return -1; - - return Math.round((float) mSeekBar.getProgress() / 100.f * mMaxValue); - } - - public void setProgress(int progress) { - updateProgress(Math.min(mMaxValue, progress)); - } - - private void updateProgress(int progress) { - if (mSeekBar == null) return; - - mSeekBar.setProgress((int) ((float) progress / mMaxValue * 100)); - - callChangeListener(progress); - } -} diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index d321563bb5b4..7c091b63f7ba 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -29,7 +29,48 @@ */ public class SiteSettingsFragment extends PreferenceFragment - implements Preference.OnPreferenceChangeListener{ + implements Preference.OnPreferenceChangeListener { + private static final HashMap LANGUAGE_CODES = new HashMap<>(); + + static { + LANGUAGE_CODES.put("en", 1); + LANGUAGE_CODES.put("az", 79); + LANGUAGE_CODES.put("de", 15); + LANGUAGE_CODES.put("el", 17); + LANGUAGE_CODES.put("es", 19); + LANGUAGE_CODES.put("fr", 24); + LANGUAGE_CODES.put("gd", 476); + LANGUAGE_CODES.put("hi", 30); + LANGUAGE_CODES.put("hu", 31); + LANGUAGE_CODES.put("id", 33); + LANGUAGE_CODES.put("it", 35); + LANGUAGE_CODES.put("ja", 36); + LANGUAGE_CODES.put("ko", 40); + LANGUAGE_CODES.put("nb", -1);// ?? + LANGUAGE_CODES.put("nl", 49); + LANGUAGE_CODES.put("pl", 58); + LANGUAGE_CODES.put("ru", 62); + LANGUAGE_CODES.put("sv", 68); + LANGUAGE_CODES.put("th", 71); + LANGUAGE_CODES.put("uz", 458); + LANGUAGE_CODES.put("zh-CN", 449); + LANGUAGE_CODES.put("zh-TW", 452); + LANGUAGE_CODES.put("zh-HK", 452);// ?? + LANGUAGE_CODES.put("en-GB", 482); + LANGUAGE_CODES.put("tr", 78); + LANGUAGE_CODES.put("eu", 429); + LANGUAGE_CODES.put("he", 29); + LANGUAGE_CODES.put("pt-BR", 438); + LANGUAGE_CODES.put("ar", 3); + LANGUAGE_CODES.put("ro", 61); + LANGUAGE_CODES.put("mk", 435); + LANGUAGE_CODES.put("en-AU", 482);// ?? + LANGUAGE_CODES.put("sr", 67); + LANGUAGE_CODES.put("sk", 64); + LANGUAGE_CODES.put("cy", 13); + LANGUAGE_CODES.put("da", 14); + } + private Blog mBlog; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; @@ -37,7 +78,7 @@ public class SiteSettingsFragment extends PreferenceFragment private ListPreference mLanguagePreference; private MultiSelectListPreference mCategoryPreference; private ListPreference mFormatPreference; - private SeekBarPreference mVisibilityPreference; + private ListPreference mVisibilityPreference; private MenuItem mSaveItem; @Override @@ -84,22 +125,7 @@ public void onResponse(JSONObject response) { if (mVisibilityPreference != null) { int visibility = response.optJSONObject("settings").optInt("blog_public"); - - switch (visibility) { - case -1: - mVisibilityPreference.setProgress(0); - break; - case 0: - mVisibilityPreference.setProgress(1); - break; - case 1: - mVisibilityPreference.setProgress(2); - break; - default: - mVisibilityPreference.setSummary("Unknown privacy setting"); - mVisibilityPreference.setEnabled(false); - break; - } + mVisibilityPreference.setValue(String.valueOf(visibility)); } } }, new RestRequest.ErrorListener() { @@ -158,15 +184,15 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } else if (preference == mVisibilityPreference && - !newValue.equals(mVisibilityPreference.getProgress() - 1)) { - switch ((Integer)newValue) { - case 0: + !newValue.equals(mVisibilityPreference.getValue())) { + switch ((Integer) newValue) { + case -1: mVisibilityPreference.setSummary("I would like my site to be private, visible only to users I choose"); break; - case 1: + case 0: mVisibilityPreference.setSummary("Discourage search engines from indexing this site"); break; - case 2: + case 1: mVisibilityPreference.setSummary("Allow search engines to index this site"); break; } @@ -196,12 +222,13 @@ private HashMap generatePostParams() { } if (mLanguagePreference != null) { - params.put("lang_id", mLanguagePreference.getValue()); -// params.put("lang", mLanguagePreference.getSummary().toString()); + if (LANGUAGE_CODES.containsKey(mLanguagePreference.getValue())) { + params.put("lang_id", String.valueOf(LANGUAGE_CODES.get(mLanguagePreference.getValue()))); + } } if (mVisibilityPreference != null) { - params.put("blog_public", String.valueOf(mVisibilityPreference.getProgress() - 1)); + params.put("blog_public", mVisibilityPreference.getValue()); } return params; @@ -246,7 +273,7 @@ private void initPreferences() { mLanguagePreference = (ListPreference) findPreference(getString(R.string.pref_key_site_language)); mVisibilityPreference = - (SeekBarPreference) findPreference(getString(R.string.pref_key_site_visibility)); + (ListPreference) findPreference(getString(R.string.pref_key_site_visibility)); mCategoryPreference = (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_category)); mFormatPreference = diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java deleted file mode 100644 index 9f0ced5b6012..000000000000 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryPreference.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.wordpress.android.ui.prefs; - -import android.content.Context; -import android.content.res.TypedArray; -import android.preference.Preference; -import android.support.annotation.NonNull; -import android.util.AttributeSet; -import android.view.View; -import android.widget.TextView; - -import org.wordpress.android.R; - -/** - * Used as a convenience to give custom preferences attributes for summary line length. - */ - -public class SummaryPreference extends Preference { - private int mLines; - private int mMaxLines; - - public SummaryPreference(Context context) { - super(context); - } - - public SummaryPreference(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public SummaryPreference(Context context, AttributeSet attrs) { - super(context, attrs); - - mLines = -1; - mMaxLines = -1; - - TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SummaryPreference); - - for (int i = 0; i < array.getIndexCount(); ++i) { - int index = array.getIndex(i); - if (index == R.styleable.SummaryPreference_summaryLines) { - mLines = array.getInt(index, -1); - } else if (index == R.styleable.SummaryPreference_maxSummaryLines) { - mMaxLines = array.getInt(index, -1); - } - } - - array.recycle(); - } - - @Override - public void onBindView(@NonNull View view) { - super.onBindView(view); - - TextView summary = (TextView) view.findViewById(android.R.id.summary); - if (summary != null) { - if (mLines != -1) summary.setLines(mLines); - if (mMaxLines != -1) summary.setMaxLines(mMaxLines); - } - } -} diff --git a/WordPress/src/main/res/values/attrs.xml b/WordPress/src/main/res/values/attrs.xml index 201a4970ead7..699426dc697f 100644 --- a/WordPress/src/main/res/values/attrs.xml +++ b/WordPress/src/main/res/values/attrs.xml @@ -1,24 +1,10 @@ - - - - - - - - - - - - - - - - + + diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 25b13ca0ab85..f01954f42b5b 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -33,13 +33,14 @@ android:entries="@array/available_languages" android:entryValues="@array/available_languages" /> - + android:title="@string/site_visibility_header" /> + + From 9e928a075c6138cbe56058b6f6afcd20ac96bf31 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Fri, 10 Jul 2015 18:12:44 -0700 Subject: [PATCH 10/16] Saving only changed settings, using resources for language. --- .../ui/prefs/SiteSettingsFragment.java | 69 +++++++------- WordPress/src/main/res/menu/site_settings.xml | 2 +- WordPress/src/main/res/values/strings.xml | 90 ++++++++++++++++++- WordPress/src/main/res/xml/site_settings.xml | 18 ++-- 4 files changed, 136 insertions(+), 43 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 7c091b63f7ba..8e9d1daf970e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -33,8 +33,8 @@ public class SiteSettingsFragment extends PreferenceFragment private static final HashMap LANGUAGE_CODES = new HashMap<>(); static { - LANGUAGE_CODES.put("en", 1); LANGUAGE_CODES.put("az", 79); + LANGUAGE_CODES.put("en", 1); LANGUAGE_CODES.put("de", 15); LANGUAGE_CODES.put("el", 17); LANGUAGE_CODES.put("es", 19); @@ -80,6 +80,13 @@ public class SiteSettingsFragment extends PreferenceFragment private ListPreference mFormatPreference; private ListPreference mVisibilityPreference; private MenuItem mSaveItem; + private HashMap mLanguageCodes = new HashMap<>(); + + private String mRemoteTitle; + private String mRemoteTagline; + private String mRemoteAddress; + private String mRemoteLanguage; + private int mRemotePrivacy; @Override public void onCreate(Bundle savedInstanceState) { @@ -101,31 +108,32 @@ public void onCreate(Bundle savedInstanceState) { @Override public void onResponse(JSONObject response) { if (mTitlePreference != null) { - mTitlePreference.setText(response.optString(RestClientUtils.SITE_TITLE_KEY)); - mTitlePreference.setSummary(response.optString(RestClientUtils.SITE_TITLE_KEY)); + mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); + mTitlePreference.setText(mRemoteTitle); + mTitlePreference.setSummary(mRemoteTitle); } if (mTaglinePreference != null) { - mTaglinePreference.setText(response.optString(RestClientUtils.SITE_DESC_KEY)); - mTaglinePreference.setSummary(response.optString(RestClientUtils.SITE_DESC_KEY)); + mRemoteTagline = response.optString(RestClientUtils.SITE_DESC_KEY); + mTaglinePreference.setText(mRemoteTagline); + mTaglinePreference.setSummary(mRemoteTagline); } if (mAddressPreference != null) { - mAddressPreference.setText(response.optString(RestClientUtils.SITE_URL_KEY)); - mAddressPreference.setSummary(response.optString(RestClientUtils.SITE_URL_KEY)); - // Disabled until implemented - mAddressPreference.setEnabled(false); + mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); + mAddressPreference.setText(mRemoteAddress); + mAddressPreference.setSummary(mRemoteAddress); } if (mLanguagePreference != null) { - String languageString = getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); - mLanguagePreference.setDefaultValue(languageString); - mLanguagePreference.setSummary(languageString); + mRemoteLanguage = getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + mLanguagePreference.setDefaultValue(mRemoteLanguage); + mLanguagePreference.setSummary(mRemoteLanguage); } if (mVisibilityPreference != null) { - int visibility = response.optJSONObject("settings").optInt("blog_public"); - mVisibilityPreference.setValue(String.valueOf(visibility)); + mRemotePrivacy = response.optJSONObject("settings").optInt("blog_public"); + mVisibilityPreference.setValue(String.valueOf(mRemotePrivacy)); } } }, new RestRequest.ErrorListener() { @@ -138,6 +146,13 @@ public void onErrorResponse(VolleyError error) { }); setHasOptionsMenu(true); + + String[] languageIds = getResources().getStringArray(R.array.lang_ids); + String[] languageCodes = getResources().getStringArray(R.array.language_codes); + + for (int i = 0; i < languageIds.length && i < languageCodes.length; ++i) { + mLanguageCodes.put(languageCodes[i], languageIds[i]); + } } @Override @@ -167,25 +182,21 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { mTitlePreference.setText(newValue.toString()); mTitlePreference.setSummary(newValue.toString()); getActivity().setTitle(newValue.toString()); - toggleSaveItemVisibility(true); return true; } else if (preference == mTaglinePreference && !newValue.equals(mTaglinePreference.getText())) { mTaglinePreference.setText(newValue.toString()); mTaglinePreference.setSummary(newValue.toString()); - toggleSaveItemVisibility(true); return true; } else if (preference == mLanguagePreference && !newValue.equals(mLanguagePreference.getSummary())) { mLanguagePreference.setSummary(getLanguageString(newValue.toString())); - toggleSaveItemVisibility(true); return true; - } else if (preference == mVisibilityPreference && - !newValue.equals(mVisibilityPreference.getValue())) { - switch ((Integer) newValue) { + } else if (preference == mVisibilityPreference) { + switch (Integer.valueOf(newValue.toString())) { case -1: mVisibilityPreference.setSummary("I would like my site to be private, visible only to users I choose"); break; @@ -197,8 +208,6 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { break; } - toggleSaveItemVisibility(true); - return true; } @@ -213,21 +222,21 @@ private HashMap generatePostParams() { // Using undocumented endpoint WPCOM_JSON_API_Site_Settings_Endpoint // https://wpcom.trac.automattic.com/browser/trunk/public.api/rest/json-endpoints.php#L1903 - if (mTitlePreference != null) { + if (mTitlePreference != null && !mTitlePreference.getText().equals(mRemoteTitle)) { params.put("blogname", mTitlePreference.getText()); } - if (mTaglinePreference != null) { + if (mTaglinePreference != null && !mTaglinePreference.getText().equals(mRemoteTagline)) { params.put("blogdescription", mTaglinePreference.getText()); } - if (mLanguagePreference != null) { - if (LANGUAGE_CODES.containsKey(mLanguagePreference.getValue())) { - params.put("lang_id", String.valueOf(LANGUAGE_CODES.get(mLanguagePreference.getValue()))); - } + if (mLanguagePreference != null && + mLanguageCodes.containsKey(mLanguagePreference.getValue()) && + !mRemoteLanguage.equals(mLanguageCodes.get(mLanguagePreference.getValue()))) { + params.put("lang_id", String.valueOf(LANGUAGE_CODES.get(mLanguagePreference.getValue()))); } - if (mVisibilityPreference != null) { + if (mVisibilityPreference != null && Integer.valueOf(mVisibilityPreference.getValue()) != mRemotePrivacy) { params.put("blog_public", mVisibilityPreference.getValue()); } @@ -244,8 +253,6 @@ private void applySettings() { String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { @Override public void onResponse(JSONObject response) { - toggleSaveItemVisibility(false); - // Update local Blog name if (params.containsKey("blogname")) { mBlog.setBlogName(params.get("blogname")); diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml index a384d8816327..a12a61cf90db 100644 --- a/WordPress/src/main/res/menu/site_settings.xml +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -6,7 +6,7 @@ diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 99f98e1044e4..19f57095bfe8 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -402,7 +402,7 @@ @string/site_visibility_header - Visibility + Privacy What\'s this site about Site Title Words to live by @@ -635,6 +635,94 @@ Video + + + Public + Hidden + Private + + + + + 1 + 0 + -1 + + + + + az + en + de + el + es + fr + gd + hi + hu + id + it + ja + ko + nl + pl + ru + sv + th + uz + zh_CN + zh_TW + en-GB + tr + eu + he + pt-BR + ar + ro + mk + sr + sk + cy + da + + + + + 79 + 1 + 15 + 17 + 19 + 24 + 476 + 30 + 31 + 33 + 35 + 36 + 40 + 49 + 58 + 62 + 68 + 71 + 458 + 449 + 452 + 482 + 78 + 429 + 29 + 438 + 3 + 61 + 435 + 67 + 64 + 13 + 14 + + New post New media diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index f01954f42b5b..5799c66f3b7c 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -26,21 +26,19 @@ android:key="@string/pref_key_site_address" android:title="Address" /> + + - - - - + android:entryValues="@array/language_codes" /> From 1b21ba4bcea986988d4bbd578e3bb9a20ec69606 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Mon, 13 Jul 2015 22:27:39 -0700 Subject: [PATCH 11/16] Updating ActionBar title. Save button is now Undo. --- .../ui/prefs/BlogPreferencesActivity.java | 10 + .../ui/prefs/SiteSettingsFragment.java | 422 ++++++++++-------- WordPress/src/main/res/menu/site_settings.xml | 6 +- WordPress/src/main/res/values/strings.xml | 25 +- WordPress/src/main/res/xml/site_settings.xml | 19 +- .../wordpress/android/util/StringUtils.java | 23 + 6 files changed, 290 insertions(+), 215 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java index 0abe78a27505..8734a732d5bc 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java @@ -50,6 +50,16 @@ public void onCreate(Bundle savedInstanceState) { } } + @Override + public void setTitle(CharSequence title) { + super.setTitle(title); + + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setTitle(title); + } + } + @Override public void finish() { super.finish(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 8e9d1daf970e..220973a3a91d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -3,10 +3,8 @@ import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; -import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.preference.PreferenceManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; @@ -19,6 +17,7 @@ import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; import org.wordpress.android.networking.RestClientUtils; +import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import java.util.HashMap; @@ -29,130 +28,58 @@ */ public class SiteSettingsFragment extends PreferenceFragment - implements Preference.OnPreferenceChangeListener { - private static final HashMap LANGUAGE_CODES = new HashMap<>(); - - static { - LANGUAGE_CODES.put("az", 79); - LANGUAGE_CODES.put("en", 1); - LANGUAGE_CODES.put("de", 15); - LANGUAGE_CODES.put("el", 17); - LANGUAGE_CODES.put("es", 19); - LANGUAGE_CODES.put("fr", 24); - LANGUAGE_CODES.put("gd", 476); - LANGUAGE_CODES.put("hi", 30); - LANGUAGE_CODES.put("hu", 31); - LANGUAGE_CODES.put("id", 33); - LANGUAGE_CODES.put("it", 35); - LANGUAGE_CODES.put("ja", 36); - LANGUAGE_CODES.put("ko", 40); - LANGUAGE_CODES.put("nb", -1);// ?? - LANGUAGE_CODES.put("nl", 49); - LANGUAGE_CODES.put("pl", 58); - LANGUAGE_CODES.put("ru", 62); - LANGUAGE_CODES.put("sv", 68); - LANGUAGE_CODES.put("th", 71); - LANGUAGE_CODES.put("uz", 458); - LANGUAGE_CODES.put("zh-CN", 449); - LANGUAGE_CODES.put("zh-TW", 452); - LANGUAGE_CODES.put("zh-HK", 452);// ?? - LANGUAGE_CODES.put("en-GB", 482); - LANGUAGE_CODES.put("tr", 78); - LANGUAGE_CODES.put("eu", 429); - LANGUAGE_CODES.put("he", 29); - LANGUAGE_CODES.put("pt-BR", 438); - LANGUAGE_CODES.put("ar", 3); - LANGUAGE_CODES.put("ro", 61); - LANGUAGE_CODES.put("mk", 435); - LANGUAGE_CODES.put("en-AU", 482);// ?? - LANGUAGE_CODES.put("sr", 67); - LANGUAGE_CODES.put("sk", 64); - LANGUAGE_CODES.put("cy", 13); - LANGUAGE_CODES.put("da", 14); - } - + implements Preference.OnPreferenceChangeListener, + MenuItem.OnMenuItemClickListener { + private HashMap mLanguageCodes = new HashMap<>(); private Blog mBlog; + private MenuItem mUndoItem; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; private EditTextPreference mAddressPreference; private ListPreference mLanguagePreference; - private MultiSelectListPreference mCategoryPreference; - private ListPreference mFormatPreference; - private ListPreference mVisibilityPreference; - private MenuItem mSaveItem; - private HashMap mLanguageCodes = new HashMap<>(); + private ListPreference mPrivacyPreference; + // Most recent remote site data. Current local data is used if remote data cannot be fetched. private String mRemoteTitle; private String mRemoteTagline; private String mRemoteAddress; - private String mRemoteLanguage; private int mRemotePrivacy; + private String mRemoteLanguage; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - PreferenceManager.getDefaultSharedPreferences(getActivity()).edit().remove(getString(R.string.pref_key_site_language)).commit(); + // make sure we have local site data + mBlog = WordPress.getBlog( + getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1)); + if (mBlog == null) return; + // inflate Site Settings preferences from XML addPreferencesFromResource(R.xml.site_settings); - Integer id = getArguments().getInt(BlogPreferencesActivity.ARG_LOCAL_BLOG_ID, -1); - mBlog = WordPress.getBlog(id); - - if (mBlog == null) return; + // declare an options menu for this fragment + setHasOptionsMenu(true); + // set preference references, add change listeners, and setup various entries and values initPreferences(); - WordPress.getRestClientUtils().getGeneralSettings( - String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { - @Override - public void onResponse(JSONObject response) { - if (mTitlePreference != null) { - mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); - mTitlePreference.setText(mRemoteTitle); - mTitlePreference.setSummary(mRemoteTitle); - } - - if (mTaglinePreference != null) { - mRemoteTagline = response.optString(RestClientUtils.SITE_DESC_KEY); - mTaglinePreference.setText(mRemoteTagline); - mTaglinePreference.setSummary(mRemoteTagline); - } - - if (mAddressPreference != null) { - mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); - mAddressPreference.setText(mRemoteAddress); - mAddressPreference.setSummary(mRemoteAddress); - } - - if (mLanguagePreference != null) { - mRemoteLanguage = getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); - mLanguagePreference.setDefaultValue(mRemoteLanguage); - mLanguagePreference.setSummary(mRemoteLanguage); - } + // fetch remote site data + fetchRemoteData(); + } - if (mVisibilityPreference != null) { - mRemotePrivacy = response.optJSONObject("settings").optInt("blog_public"); - mVisibilityPreference.setValue(String.valueOf(mRemotePrivacy)); - } - } - }, new RestRequest.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (isAdded()) { - ToastUtils.showToast(getActivity(), "Error getting site info"); - } - } - }); + @Override + public void onPause() { + super.onPause(); - setHasOptionsMenu(true); + applyChanges(); + } - String[] languageIds = getResources().getStringArray(R.array.lang_ids); - String[] languageCodes = getResources().getStringArray(R.array.language_codes); + @Override + public boolean onMenuItemClick(MenuItem item) { + undoChanges(); - for (int i = 0; i < languageIds.length && i < languageCodes.length; ++i) { - mLanguageCodes.put(languageCodes[i], languageIds[i]); - } + return true; } @Override @@ -161,59 +88,146 @@ public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { menuInflater.inflate(R.menu.site_settings, menu); - if (menu == null || (mSaveItem = menu.findItem(R.id.save_site_settings)) == null) return; + if (menu == null || (mUndoItem = menu.findItem(R.id.save_site_settings)) == null) return; - mSaveItem.setOnMenuItemClickListener( - new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - applySettings(); - return true; - } - }); + mUndoItem.setOnMenuItemClickListener(this); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; - if (preference == mTitlePreference && - !newValue.equals(mTitlePreference.getText())) { - mTitlePreference.setText(newValue.toString()); - mTitlePreference.setSummary(newValue.toString()); - getActivity().setTitle(newValue.toString()); + if (preference == mTitlePreference) { + // update the Activity title to reflect the changes + String titleFormat = getString(R.string.site_settings_title_format, "%s"); + getActivity().setTitle(String.format(titleFormat, newValue)); + changeEditTextPreferenceValue(mTitlePreference, newValue.toString()); return true; - } else if (preference == mTaglinePreference && - !newValue.equals(mTaglinePreference.getText())) { - mTaglinePreference.setText(newValue.toString()); - mTaglinePreference.setSummary(newValue.toString()); - + } else if (preference == mTaglinePreference) { + changeEditTextPreferenceValue(mTaglinePreference, newValue.toString()); return true; - } else if (preference == mLanguagePreference && - !newValue.equals(mLanguagePreference.getSummary())) { - mLanguagePreference.setSummary(getLanguageString(newValue.toString())); - + } else if (preference == mAddressPreference) { + changeEditTextPreferenceValue(mAddressPreference, newValue.toString()); return true; - } else if (preference == mVisibilityPreference) { - switch (Integer.valueOf(newValue.toString())) { - case -1: - mVisibilityPreference.setSummary("I would like my site to be private, visible only to users I choose"); - break; - case 0: - mVisibilityPreference.setSummary("Discourage search engines from indexing this site"); - break; - case 1: - mVisibilityPreference.setSummary("Allow search engines to index this site"); - break; - } - + } else if (preference == mLanguagePreference) { + changeLanguageValue(newValue.toString()); + return true; + } else if (preference == mPrivacyPreference) { + mPrivacyPreference.setSummary(privacyStringForValue(Integer.valueOf(newValue.toString()))); return true; } return false; } + private String privacyStringForValue(int value) { + switch (value) { + case -1: + return"I would like my site to be private, visible only to users I choose"; + case 0: + return "Discourage search engines from indexing this site"; + case 1: + return "Allow search engines to index this site"; + } + } + + /** + * Helper method to perform validation and set multiple properties on an EditTextPreference. + * If newValue is equal to the current preference text no action will be taken. + */ + private void changeEditTextPreferenceValue(EditTextPreference pref, String newValue) { + if (pref != null && newValue != null && !newValue.equals(pref.getText())) { + pref.setText(newValue); + pref.setSummary(newValue); + } + } + + private void changeLanguageValue(String newValue) { + if (mLanguagePreference != null && !mLanguagePreference.getValue().equals(newValue)) { + mLanguagePreference.setValue(newValue); + mLanguagePreference.setSummary(StringUtils.getLanguageString(newValue)); + } + } + + private void changePrivacyValue(int newValue) { + if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) == newValue) { + mPrivacyPreference.setValue(String.valueOf(newValue)); + mPrivacyPreference.setSummary(String.valueOf(newValue)); + } + } + + /** + * Request remote site data via the WordPress REST API. + */ + private void fetchRemoteData() { + WordPress.getRestClientUtils().getGeneralSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + handleResponseToGeneralSettingsRequest(response); + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (isAdded()) { + ToastUtils.showToast(getActivity(), "Error getting site info"); + } + } + }); + } + + /** + * Helper method to parse JSON response to REST request. + */ + private void handleResponseToGeneralSettingsRequest(JSONObject response) { + mRemoteTitle = response.optString(RestClientUtils.SITE_TITLE_KEY); + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + + mRemoteTagline = response.optString(RestClientUtils.SITE_DESC_KEY); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + + mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); + changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + + mRemoteLanguage = StringUtils.getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); + changeLanguageValue(mRemoteLanguage); + if (mLanguagePreference != null + && mRemoteLanguage != null + && !mRemoteLanguage.equals(mLanguagePreference.getValue())) { + mLanguagePreference.setValue(mRemoteLanguage); + mLanguagePreference.setSummary(mRemoteLanguage); + } + + mRemotePrivacy = response.optJSONObject("settings").optInt("blog_public"); + if (mPrivacyPreference != null) { + mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); + } + changePrivacyValue(mRemotePrivacy); + +// if (mTitlePreference != null) { +// mTitlePreference.setText(mRemoteTitle); +// mTitlePreference.setSummary(mRemoteTitle); +// } +// +// if (mTaglinePreference != null) { +// mTaglinePreference.setText(mRemoteTagline); +// mTaglinePreference.setSummary(mRemoteTagline); +// } +// +// if (mAddressPreference != null) { +// mAddressPreference.setText(mRemoteAddress); +// mAddressPreference.setSummary(mRemoteAddress); +// } +// +// if (mLanguagePreference != null) { +// } +// +// if (mPrivacyPreference != null) { +// mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); +// } + } + /** * Helper method to create the parameters for the site settings POST request */ @@ -233,60 +247,77 @@ private HashMap generatePostParams() { if (mLanguagePreference != null && mLanguageCodes.containsKey(mLanguagePreference.getValue()) && !mRemoteLanguage.equals(mLanguageCodes.get(mLanguagePreference.getValue()))) { - params.put("lang_id", String.valueOf(LANGUAGE_CODES.get(mLanguagePreference.getValue()))); + params.put("lang_id", String.valueOf(mLanguageCodes.get(mLanguagePreference.getValue()))); } - if (mVisibilityPreference != null && Integer.valueOf(mVisibilityPreference.getValue()) != mRemotePrivacy) { - params.put("blog_public", mVisibilityPreference.getValue()); + if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) != mRemotePrivacy) { + params.put("blog_public", mPrivacyPreference.getValue()); } return params; } /** - * Sends a REST POST request to update site settings + * Reverts changed preferences */ - private void applySettings() { + private void undoChanges() { + changeEditTextPreferenceValue(mTitlePreference, mRemoteTitle); + changeEditTextPreferenceValue(mTaglinePreference, mRemoteTagline); + changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); + + // Privacy must exist in the set {-1, 0, 1} to be valid + if (mRemotePrivacy > -2 && mRemotePrivacy < 2 && + mRemotePrivacy != Integer.valueOf(mPrivacyPreference.getValue())) { + mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); + } + + if (mRemoteLanguage != null && !mRemoteLanguage.equals(StringUtils.getLanguageString(mLanguagePreference.getValue()))) { + mLanguagePreference.setValue(mRemoteLanguage); + } + } + + /** + * Persists changed settings remotely + */ + private void applyChanges() { final HashMap params = generatePostParams(); - WordPress.getRestClientUtils().setGeneralSiteSettings( - String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { - @Override - public void onResponse(JSONObject response) { - // Update local Blog name - if (params.containsKey("blogname")) { - mBlog.setBlogName(params.get("blogname")); - } - } - }, new RestRequest.ErrorListener() { - @Override - public void onErrorResponse(VolleyError error) { - if (mTaglinePreference != null) { - mTaglinePreference.setEnabled(false); - mTaglinePreference.setSummary("Failed to retrieve :("); - } - } - }, params); + if (params.size() > 0) { + WordPress.getRestClientUtils().setGeneralSiteSettings( + String.valueOf(mBlog.getRemoteBlogId()), new RestRequest.Listener() { + @Override + public void onResponse(JSONObject response) { + // Update local Blog name + if (params.containsKey("blogname")) { + mBlog.setBlogName(params.get("blogname")); + } + } + }, new RestRequest.ErrorListener() { + @Override + public void onErrorResponse(VolleyError error) { + if (mTaglinePreference != null) { + mTaglinePreference.setEnabled(false); + mTaglinePreference.setSummary("Failed to retrieve :("); + } + } + }, params); + } } /** - * Helper method to set preference references + * Helper method to setup preferences and set initial values */ private void initPreferences() { mTitlePreference = (EditTextPreference) findPreference(getString(R.string.pref_key_site_title)); mTaglinePreference = (EditTextPreference) findPreference(getString(R.string.pref_key_site_tagline)); - mLanguagePreference = - (ListPreference) findPreference(getString(R.string.pref_key_site_language)); - mVisibilityPreference = - (ListPreference) findPreference(getString(R.string.pref_key_site_visibility)); - mCategoryPreference = - (MultiSelectListPreference) findPreference(getString(R.string.pref_key_site_category)); - mFormatPreference = - (ListPreference) findPreference(getString(R.string.pref_key_site_format)); mAddressPreference = (EditTextPreference) findPreference(getString(R.string.pref_key_site_address)); + mPrivacyPreference = + (ListPreference) findPreference(getString(R.string.pref_key_site_visibility)); + mLanguagePreference = + (ListPreference) findPreference(getString(R.string.pref_key_site_language)); if (mTitlePreference != null) { mTitlePreference.setOnPreferenceChangeListener(this); @@ -296,27 +327,39 @@ private void initPreferences() { mTaglinePreference.setOnPreferenceChangeListener(this); } - if (mLanguagePreference != null) { - mLanguagePreference.setEntries(createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); - mLanguagePreference.setOnPreferenceChangeListener(this); + if (mAddressPreference != null) { + mAddressPreference.setOnPreferenceChangeListener(this); } - if (mVisibilityPreference != null) { - mVisibilityPreference.setOnPreferenceChangeListener(this); + if (mPrivacyPreference != null) { + mRemotePrivacy = -2; + mPrivacyPreference.setOnPreferenceChangeListener(this); } - if (mFormatPreference != null) { - mFormatPreference.setOnPreferenceChangeListener(this); + if (mLanguagePreference != null) { + // Generate map of language codes + String[] languageIds = getResources().getStringArray(R.array.lang_ids); + String[] languageCodes = getResources().getStringArray(R.array.language_codes); + for (int i = 0; i < languageIds.length && i < languageCodes.length; ++i) { + mLanguageCodes.put(languageCodes[i], languageIds[i]); + } + + mLanguagePreference.setEntries( + createLanguageDisplayStrings(mLanguagePreference.getEntryValues())); + mLanguagePreference.setOnPreferenceChangeListener(this); } } + /** + * Generates display strings for given language codes. Used as entries in language preference. + */ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes) { if (languageCodes == null || languageCodes.length < 1) return null; CharSequence[] displayStrings = new CharSequence[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - displayStrings[i] = getLanguageString(String.valueOf(languageCodes[i])); + displayStrings[i] = StringUtils.getLanguageString(String.valueOf(languageCodes[i]), Locale.getDefault()); } return displayStrings; @@ -325,20 +368,13 @@ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes /** * Return a non-null display string for a given language code. */ - private String getLanguageString(String languagueCode) { - if (languagueCode == null || languagueCode.length() < 2) { - return ""; - } else if (languagueCode.length() == 2) { - return new Locale(languagueCode).getDisplayLanguage(); - } else { - return new Locale(languagueCode.substring(0, 2)).getDisplayLanguage() + languagueCode.substring(2); - } - } - - private void toggleSaveItemVisibility(boolean on) { - if (mSaveItem != null) { - mSaveItem.setVisible(on); - mSaveItem.setEnabled(on); - } - } +// private String getLanguageString(String languagueCode) { +// if (languagueCode == null || languagueCode.length() < 2) { +// return ""; +// } else if (languagueCode.length() == 2) { +// return new Locale(languagueCode).getDisplayLanguage(); +// } else { +// return new Locale(languagueCode.substring(0, 2)).getDisplayLanguage() + languagueCode.substring(2); +// } +// } } diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml index a12a61cf90db..b9b06d1a2ef2 100644 --- a/WordPress/src/main/res/menu/site_settings.xml +++ b/WordPress/src/main/res/menu/site_settings.xml @@ -6,9 +6,9 @@ + android:visible="true" + app:showAsAction="always" /> diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index 19f57095bfe8..c3543a065953 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -399,17 +399,6 @@ wp_pref_notification_blogs wp_pref_notifications_enabled wp_pref_notification_types - - - @string/site_visibility_header - Privacy - What\'s this site about - Site Title - Words to live by - Tagline - Related Posts - Related Posts - Show related content after posts wp_pref_site_title wp_pref_site_tagline wp_pref_site_address @@ -423,6 +412,20 @@ wp_pref_site_start_over wp_pref_site_delete_site + + %s Settings + General + Site Title + Tagline + Address + Privacy + @string/language + What\'s this site about + Words to live by + Related Posts + Related Posts + Show related content after posts + Open source licenses Privacy diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index 5799c66f3b7c..f63db75dc0cc 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -5,38 +5,41 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + android:title="@string/site_settings_general_header"> + app:summaryLines="1" + app:maxSummaryLines="1" /> - + android:title="@string/site_settings_address_title" + app:summaryLines="1" + app:maxSummaryLines="1" /> diff --git a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/StringUtils.java b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/StringUtils.java index 68e3113c3d5d..6f73e6dd6ad2 100644 --- a/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/StringUtils.java +++ b/libs/utils/WordPressUtils/src/main/java/org/wordpress/android/util/StringUtils.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Locale; public class StringUtils { public static String[] mergeStringArrays(String array1[], String array2[]) { @@ -228,6 +229,28 @@ public static String replaceUnicodeSurrogateBlocksWithHTMLEntities(final String return out.toString(); } + /** + * Used to convert a language code ([lc]_[rc] where lc is language code (en, fr, es, etc...) + * and rc is region code (zh-CN, zh-HK, zh-TW, etc...) to a displayable string with the languages + * name. + * + * The input string must be between 2 and 6 characters, inclusive. An empty string is returned + * if that is not the case. + * + * If the input string is recognized by {@link Locale} the result of this method is the given + * + * @return + * non-null + */ + public static String getLanguageString(String languagueCode, Locale displayLocale) { + if (languagueCode == null || languagueCode.length() < 2 || languagueCode.length() > 6) { + return ""; + } + + Locale languageLocale = new Locale(languagueCode.substring(0, 2)); + return languageLocale.getDisplayLanguage(displayLocale) + languagueCode.substring(2); + } + /** * This method ensures that the output String has only * valid XML unicode characters as specified by the From c41a8a12f2ffda666be0cb7c5a98e3eb606520d5 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 14 Jul 2015 13:37:55 -0700 Subject: [PATCH 12/16] Disabling Address field until it's implemented. Fixing initial summaries. --- .../ui/prefs/SiteSettingsFragment.java | 75 +++++++------------ WordPress/src/main/res/values/strings.xml | 5 +- WordPress/src/main/res/xml/site_settings.xml | 1 + 3 files changed, 32 insertions(+), 49 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 220973a3a91d..b3145e507ea0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -17,7 +17,6 @@ import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; import org.wordpress.android.networking.RestClientUtils; -import org.wordpress.android.util.StringUtils; import org.wordpress.android.util.ToastUtils; import java.util.HashMap; @@ -124,11 +123,13 @@ public boolean onPreferenceChange(Preference preference, Object newValue) { private String privacyStringForValue(int value) { switch (value) { case -1: - return"I would like my site to be private, visible only to users I choose"; + return getString(R.string.site_privacy_private_desc); case 0: - return "Discourage search engines from indexing this site"; + return getString(R.string.site_privacy_hidden_desc); case 1: - return "Allow search engines to index this site"; + return getString(R.string.site_privacy_public_desc); + default: + return ""; } } @@ -137,23 +138,23 @@ private String privacyStringForValue(int value) { * If newValue is equal to the current preference text no action will be taken. */ private void changeEditTextPreferenceValue(EditTextPreference pref, String newValue) { - if (pref != null && newValue != null && !newValue.equals(pref.getText())) { + if (pref != null && newValue != null && !newValue.equals(pref.getSummary())) { pref.setText(newValue); pref.setSummary(newValue); } } private void changeLanguageValue(String newValue) { - if (mLanguagePreference != null && !mLanguagePreference.getValue().equals(newValue)) { + if (mLanguagePreference != null && !newValue.equals(mLanguagePreference.getValue())) { mLanguagePreference.setValue(newValue); - mLanguagePreference.setSummary(StringUtils.getLanguageString(newValue)); + mLanguagePreference.setSummary(getLanguageString(newValue, Locale.getDefault())); } } private void changePrivacyValue(int newValue) { if (mPrivacyPreference != null && Integer.valueOf(mPrivacyPreference.getValue()) == newValue) { mPrivacyPreference.setValue(String.valueOf(newValue)); - mPrivacyPreference.setSummary(String.valueOf(newValue)); + mPrivacyPreference.setSummary(privacyStringForValue(newValue)); } } @@ -190,13 +191,10 @@ private void handleResponseToGeneralSettingsRequest(JSONObject response) { mRemoteAddress = response.optString(RestClientUtils.SITE_URL_KEY); changeEditTextPreferenceValue(mAddressPreference, mRemoteAddress); - mRemoteLanguage = StringUtils.getLanguageString(response.optString(RestClientUtils.SITE_LANGUAGE_KEY)); - changeLanguageValue(mRemoteLanguage); - if (mLanguagePreference != null - && mRemoteLanguage != null - && !mRemoteLanguage.equals(mLanguagePreference.getValue())) { - mLanguagePreference.setValue(mRemoteLanguage); - mLanguagePreference.setSummary(mRemoteLanguage); + mRemoteLanguage = response.optString(RestClientUtils.SITE_LANGUAGE_KEY); + if (mLanguagePreference != null) { + changeLanguageValue(mRemoteLanguage); + mLanguagePreference.setSummary(getLanguageString(mRemoteLanguage, Locale.getDefault())); } mRemotePrivacy = response.optJSONObject("settings").optInt("blog_public"); @@ -204,28 +202,6 @@ private void handleResponseToGeneralSettingsRequest(JSONObject response) { mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); } changePrivacyValue(mRemotePrivacy); - -// if (mTitlePreference != null) { -// mTitlePreference.setText(mRemoteTitle); -// mTitlePreference.setSummary(mRemoteTitle); -// } -// -// if (mTaglinePreference != null) { -// mTaglinePreference.setText(mRemoteTagline); -// mTaglinePreference.setSummary(mRemoteTagline); -// } -// -// if (mAddressPreference != null) { -// mAddressPreference.setText(mRemoteAddress); -// mAddressPreference.setSummary(mRemoteAddress); -// } -// -// if (mLanguagePreference != null) { -// } -// -// if (mPrivacyPreference != null) { -// mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); -// } } /** @@ -244,6 +220,10 @@ private HashMap generatePostParams() { params.put("blogdescription", mTaglinePreference.getText()); } + if (mAddressPreference != null && !mAddressPreference.getText().equals(mRemoteAddress)) { + // TODO + } + if (mLanguagePreference != null && mLanguageCodes.containsKey(mLanguagePreference.getValue()) && !mRemoteLanguage.equals(mLanguageCodes.get(mLanguagePreference.getValue()))) { @@ -271,7 +251,7 @@ private void undoChanges() { mPrivacyPreference.setValue(String.valueOf(mRemotePrivacy)); } - if (mRemoteLanguage != null && !mRemoteLanguage.equals(StringUtils.getLanguageString(mLanguagePreference.getValue()))) { + if (mRemoteLanguage != null && !mRemoteLanguage.equals(getLanguageString(mLanguagePreference.getValue(), Locale.getDefault()))) { mLanguagePreference.setValue(mRemoteLanguage); } } @@ -359,7 +339,7 @@ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes CharSequence[] displayStrings = new CharSequence[languageCodes.length]; for (int i = 0; i < languageCodes.length; ++i) { - displayStrings[i] = StringUtils.getLanguageString(String.valueOf(languageCodes[i]), Locale.getDefault()); + displayStrings[i] = getLanguageString(String.valueOf(languageCodes[i]), Locale.getDefault()); } return displayStrings; @@ -368,13 +348,12 @@ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes /** * Return a non-null display string for a given language code. */ -// private String getLanguageString(String languagueCode) { -// if (languagueCode == null || languagueCode.length() < 2) { -// return ""; -// } else if (languagueCode.length() == 2) { -// return new Locale(languagueCode).getDisplayLanguage(); -// } else { -// return new Locale(languagueCode.substring(0, 2)).getDisplayLanguage() + languagueCode.substring(2); -// } -// } + private String getLanguageString(String languagueCode, Locale displayLocale) { + if (languagueCode == null || languagueCode.length() < 2 || languagueCode.length() > 6) { + return ""; + } + + Locale languageLocale = new Locale(languagueCode.substring(0, 2)); + return languageLocale.getDisplayLanguage(displayLocale) + languagueCode.substring(2); + } } diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index c3543a065953..f7334841930e 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -413,7 +413,7 @@ wp_pref_site_delete_site - %s Settings + Settings - %s General Site Title Tagline @@ -1040,5 +1040,8 @@ My Site Me + I would like my site to be private, visible only to users I choose + Discourage search engines from indexing this site + Allow search engines to index this site diff --git a/WordPress/src/main/res/xml/site_settings.xml b/WordPress/src/main/res/xml/site_settings.xml index f63db75dc0cc..9af86660258c 100644 --- a/WordPress/src/main/res/xml/site_settings.xml +++ b/WordPress/src/main/res/xml/site_settings.xml @@ -26,6 +26,7 @@ android:id="@+id/pref_site_address" android:key="@string/pref_key_site_address" android:title="@string/site_settings_address_title" + android:enabled="false" app:summaryLines="1" app:maxSummaryLines="1" /> From 1b142d90f73ae1211961572e53302c09fae7835e Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Tue, 14 Jul 2015 15:30:57 -0700 Subject: [PATCH 13/16] Removing unused layout. --- .../src/main/res/layout/seekbar_pref.xml | 48 ------------------- 1 file changed, 48 deletions(-) delete mode 100644 WordPress/src/main/res/layout/seekbar_pref.xml diff --git a/WordPress/src/main/res/layout/seekbar_pref.xml b/WordPress/src/main/res/layout/seekbar_pref.xml deleted file mode 100644 index 9a83b122272d..000000000000 --- a/WordPress/src/main/res/layout/seekbar_pref.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - From f3c555f0bb8f86fea0b3803b557132f35a7047e8 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 15 Jul 2015 14:45:59 -0700 Subject: [PATCH 14/16] Addressing code review. Closing Activity on settings fetch error. --- .../ui/prefs/SiteSettingsFragment.java | 19 +++++++++++-------- .../ui/prefs/SummaryEditTextPreference.java | 8 +++++++- .../wordpress/android/util/WPRestClient.java | 4 ++-- WordPress/src/main/res/values/strings.xml | 2 ++ 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index b3145e507ea0..98714ad618a1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -17,6 +17,7 @@ import org.wordpress.android.WordPress; import org.wordpress.android.models.Blog; import org.wordpress.android.networking.RestClientUtils; +import org.wordpress.android.util.AppLog; import org.wordpress.android.util.ToastUtils; import java.util.HashMap; @@ -171,8 +172,10 @@ public void onResponse(JSONObject response) { }, new RestRequest.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { + AppLog.w(AppLog.T.API, "Error GETing site settings: " + error); if (isAdded()) { - ToastUtils.showToast(getActivity(), "Error getting site info"); + ToastUtils.showToast(getActivity(), getString(R.string.error_fetch_remote_site_settings)); + getActivity().finish(); } } }); @@ -275,9 +278,9 @@ public void onResponse(JSONObject response) { }, new RestRequest.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { - if (mTaglinePreference != null) { - mTaglinePreference.setEnabled(false); - mTaglinePreference.setSummary("Failed to retrieve :("); + AppLog.w(AppLog.T.API, "Error POSTing site settings changes: " + error); + if (isAdded()) { + ToastUtils.showToast(getActivity(), getString(R.string.error_post_remote_site_settings)); } } }, params); @@ -348,12 +351,12 @@ private CharSequence[] createLanguageDisplayStrings(CharSequence[] languageCodes /** * Return a non-null display string for a given language code. */ - private String getLanguageString(String languagueCode, Locale displayLocale) { - if (languagueCode == null || languagueCode.length() < 2 || languagueCode.length() > 6) { + private String getLanguageString(String languageCode, Locale displayLocale) { + if (languageCode == null || languageCode.length() < 2 || languageCode.length() > 6) { return ""; } - Locale languageLocale = new Locale(languagueCode.substring(0, 2)); - return languageLocale.getDisplayLanguage(displayLocale) + languagueCode.substring(2); + Locale languageLocale = new Locale(languageCode.substring(0, 2)); + return languageLocale.getDisplayLanguage(displayLocale) + languageCode.substring(2); } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java index 8a0232059dfd..19d8b5ba36d9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SummaryEditTextPreference.java @@ -14,7 +14,13 @@ /** * Standard EditTextPreference that has attributes to limit summary length. * - * Re: {@link SummaryPreference} + * Created for and used by {@link SiteSettingsFragment} to style some Preferences. + * + * When declaring this class in a layout file you can use the following attributes: + * - app:summaryLines : sets the number of lines to display in the Summary field + * (see {@link TextView#setLines(int)} for details) + * - app:maxSummaryLines : sets the maximum number of lines the Summary field can display + * (see {@link TextView#setMaxLines(int)} for details) */ public class SummaryEditTextPreference extends EditTextPreference { diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java b/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java index 3ff8f8651008..4d6d327d49af 100644 --- a/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java +++ b/WordPress/src/main/java/org/wordpress/android/util/WPRestClient.java @@ -255,8 +255,8 @@ public void getStatsVideoSummary(String siteId, Listener listener, ErrorListener getXL(path, params, listener, errorListener); } - public void getSiteDescription(String sideId, Listener listener, ErrorListener errorListener) { - String path = String.format("rest/v1.1/sites/%s", sideId); + public void getSiteDescription(String siteId, Listener listener, ErrorListener errorListener) { + String path = String.format("rest/v1.1/sites/%s", siteId); Map params = new HashMap(); params.put("fields", "description"); get(path, params, null, listener, errorListener); diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index f7334841930e..eebe683df640 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -783,6 +783,8 @@ This blog is hidden and couldn\'t be loaded. Enable it again in settings and try again. An error occurred while creating the app database. Try reinstalling the app. An error occurred while copying text to clipboard + Couldn't retrieve site info + Couldn't save site info Add media From 4df1aede773cddd7b0027c83b7db946e9ecb9457 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 15 Jul 2015 14:51:45 -0700 Subject: [PATCH 15/16] Fixing build! --- WordPress/src/main/res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml index eebe683df640..74fd58c4f406 100644 --- a/WordPress/src/main/res/values/strings.xml +++ b/WordPress/src/main/res/values/strings.xml @@ -783,8 +783,8 @@ This blog is hidden and couldn\'t be loaded. Enable it again in settings and try again. An error occurred while creating the app database. Try reinstalling the app. An error occurred while copying text to clipboard - Couldn't retrieve site info - Couldn't save site info + Couldn\'t retrieve site info + Couldn\'t save site info Add media From 08712ef054c76994d9c8e4e3e4fc8de7b6564af0 Mon Sep 17 00:00:00 2001 From: Tony Rankin Date: Wed, 15 Jul 2015 15:20:46 -0700 Subject: [PATCH 16/16] Removing Undo button. --- .../ui/prefs/SiteSettingsFragment.java | 29 ++----------------- WordPress/src/main/res/menu/site_settings.xml | 14 --------- 2 files changed, 2 insertions(+), 41 deletions(-) delete mode 100644 WordPress/src/main/res/menu/site_settings.xml diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java index 98714ad618a1..fd321807b10c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SiteSettingsFragment.java @@ -5,9 +5,6 @@ import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import com.android.volley.VolleyError; import com.wordpress.rest.RestRequest; @@ -28,11 +25,9 @@ */ public class SiteSettingsFragment extends PreferenceFragment - implements Preference.OnPreferenceChangeListener, - MenuItem.OnMenuItemClickListener { + implements Preference.OnPreferenceChangeListener { private HashMap mLanguageCodes = new HashMap<>(); private Blog mBlog; - private MenuItem mUndoItem; private EditTextPreference mTitlePreference; private EditTextPreference mTaglinePreference; private EditTextPreference mAddressPreference; @@ -58,9 +53,6 @@ public void onCreate(Bundle savedInstanceState) { // inflate Site Settings preferences from XML addPreferencesFromResource(R.xml.site_settings); - // declare an options menu for this fragment - setHasOptionsMenu(true); - // set preference references, add change listeners, and setup various entries and values initPreferences(); @@ -72,27 +64,10 @@ public void onCreate(Bundle savedInstanceState) { public void onPause() { super.onPause(); + // Assume user wanted changes propagated when they leave applyChanges(); } - @Override - public boolean onMenuItemClick(MenuItem item) { - undoChanges(); - - return true; - } - - @Override - public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) { - super.onCreateOptionsMenu(menu, menuInflater); - - menuInflater.inflate(R.menu.site_settings, menu); - - if (menu == null || (mUndoItem = menu.findItem(R.id.save_site_settings)) == null) return; - - mUndoItem.setOnMenuItemClickListener(this); - } - @Override public boolean onPreferenceChange(Preference preference, Object newValue) { if (newValue == null) return false; diff --git a/WordPress/src/main/res/menu/site_settings.xml b/WordPress/src/main/res/menu/site_settings.xml deleted file mode 100644 index b9b06d1a2ef2..000000000000 --- a/WordPress/src/main/res/menu/site_settings.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -